1、面试准备-Java知识

一、String.valueof()、(String)、toString()的区别java

答案:web

(String)进行转换的时候,若是类型不匹配会抛出类型转换异常。所以在转化的时候若是不肯定该类型是否为String类型,须要先用instanceof进行类型判断。编程

toString()是java.lang.Object类里已有的public方法。在使用时要注意,必须保证object不是null值,不然将抛出NullPointerException异常。toString()不会关注类型的转换,toString()方法返回的是该对象的字符串。设计模式

String.valueOf()是String的静态方法,可直接经过String调用。String.valueOf()方法会将非空的对象直接调用其toString方法。可是为空的状况下会返回"null"而不是null。数组

 

二、重载(Overload)和重写(Override)安全

答案:多线程

重载:重载是指同一个类中的多个方法具备相同的名字,但这些方法具备不一样的参数列表,即参数的数量或参数类型不能彻底相同。并发

a.经过传递给它们的不一样参数个数和参数类型来决定具体使用哪一个方法,也就是多态性。框架

b.返回值类型能够相同也能够不一样。不能以返回值类型做为重载函数的区分标准。ide

重写:重写是存在子父类之间的,子类定义的方法与父类中的方法具备相同的方法名字,相同的参数列表和相同的返回类型。

子类能够继承父类中的方法,而不须要从新编写相同的方法。但有时子类并不想原封不动的继承父类的方法,而是想作必定的修改。重写又称覆盖。

a.子类中不能重写父类中的final方法可是必须重写父类中的abstract方法。

区别:

方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,然后者实现的是运行时的多态性。重载发生在一个类中,同名的方法若是有不一样的参数列表(参数类型不一样、参数个数不一样或者两者都不一样)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常。重载对返回类型没有特殊的要求,不能根据返回类型进行区分。

 

三、面向对象特征之一---多态性

答案:

存在多态的前提条件:

a.有继承的关系
b.子类重写父类的方法
c.父类的引用指向子类的对象

多态性是面向对象编程的一种特性,和方法无关。分为静态多态性动态多态性

一样的一个方法可以根据输入数据的不一样,作出不一样的处理,即方法的重载--有不一样的参数列表==>静态多态性

当子类继承自父类的相同方法,输入数据同样,但要作出有别于父类的响应时,就要重写父类方法,即在子类中重写该方法--相同参数列表,不一样实现==>动态多态性

 

四、String、StringBuffer与StringBuilder之间的区别

答案:

运行速度:StringBuilder>StringBuffer>String

String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦建立以后该对象是不可更改的,但后二者的对象是变量,是能够更改的。

线程安全:在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的。

String适用于少许的字符串操做的状况。
StringBuffer适用于多线程下在字符缓冲区进行大量操做的状况。
StringBuilder适用于单线程下在字符缓冲区进行大量操做的状况。

 

五、list、set、map的区别

答案:

list、set都是继承自Collection接口,map不是。

list存放元素有序,可重复。set存放元素无序,不可重复

list查找元素效率高,插入和删除元素效率低。set查找元素效率低,插入和删除元素效率高。

 

六、过滤器(Filter)与拦截器(Interceptor)的区别

使用范围不一样:

Filter只能用于Web程序中。而拦截器既能够用于Web程序,也能够用于Application、Swing程序中。

规范不一样:

Filter是在Servlet规范中定义的,是Servlet容器支持的。而拦截器是在Spring容器中内的,是Spring框架支持的。

使用的资源不一样:

同其余的代码块同样,拦截器也是一个Spring的组件,归Spring管理,配置在Spring文件中,所以能使用Spring里的任何资源,对象,例如Service对象、数据源、事务管理等,经过IOC注入到拦截器便可。而Filter不能。

深度不一样:

Filter只在Servlet先后起做用。而拦截器可以深刻到方法先后、异常抛出先后等,所以拦截器的使用具备更大的弹性。因此Spring构架的程序中,须要优先使用拦截器。

一、拦截器是基于Javad的反射机制,而过滤器是基于函数回调。
二、拦截器不依赖与Servlet容器,过滤器依赖与Servlet容器。
三、拦截器只能对action请求起做用,而过滤器则能够对几乎全部的请求起做用。
四、在action的生命周期中,拦截器能够屡次被调用,而过滤器只能在容器初始化时被调用一次。
五、拦截器能够获取获取IOC容器中的各个bean,而过滤器就不行。
六、拦截器须要在Spring配置文件中配置,过滤器只须要在web.xml中配置。

 

七、简述单例模式

Java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。

单例模式的特色
a.单例类只能有一个实例。
b.单例类必须本身建立本身的惟一实例。
c.单例类必须给全部其余对象提供这一实例。

单例模式的好处
a.控制资源的使用,经过线程同步来控制资源的并发访问。
b.控制实例产生的数量,达到节约资源的目的。

 

八、HashMap和HashTable的区别

不一样点:

a.HashMap是非线程安全的,而HashTable是线程安全的。(HashTable的实现方法里都添加了synchronized关键字来确保线程同步,在多线程环境下若使用HashMap须要使用Collections.synchronizedMap()方法)。由于HashTable是线程安全的,因此效率比HashMap低。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。

b.HashMap的键和值均可觉得空。HashTable的键和值都不能够为空。

c.HashMap的初始容量为16,HashTable初始容量为11,二者填充因子默认都是0.75.

d.HashMap扩容时当前容量翻倍即:capacity*2,HashTable扩容时是容量翻倍+1即:capactiy*2-1。

e.二者计算hash的方法不一样。

相同点:

HashMap和HashTable都实现Map接口。

HashMap和HashTable的底层实现都是数组+链表结构实现。

判断是否含有某个键:

HashMap中的get()方法返回null值时,便可以表示HashMap中没有该键,也能够表示该键所对应的值是null。所以,在HashMap中不能用get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。HashTable的键值都不能为null,因此能够用get()方法来判断是否包含某个键。

 

九、&和&&、|和||的区别

单&时,左边不管真假,右边都进行运算。

双&&时,若是左边为真,右边参与运算。若是左边为假,右边不参与运算。

单|时,左边不管真假,右边都进行运算。

双||时,左边为真,右边不参与运算。

 

十、位运算符(^,|,&)

按位与、按位或、异或的计算方式都是转换为二进制再计算,不一样的是运算规则。

&(按位与)

按位与  运算规则为:两个为真才为真。

例:1&1=1,1&0=0,0&1=0,0&0=0

3 & 5

3的二进制位是0000 0011 , 5的二进制位是0000 0101

011 & 101为001 最终值为0000 0001 故3 & 5等于1

|(按位或)

按位或  运算规则为:一个为真即为真。

例:1|0=1,1|1=1,0|0=0,0|1=1

6 | 2

6的二进制位0000 0110 , 2的二进制位0000 0010

110 | 010为110 最终值为0000 0110 故6 | 2等于6

^(异或)

异或的运算规则为:

例:1^0 = 1 , 1^1 = 0 , 0^1 = 1 , 0^0 = 0

5的二进制位是0000 0101 , 9的二进制位是0000 1001,也就是0101 ^ 1001,结果为1100 , 00001100的十进制位是12

 

 

十一、Java类的初始化顺序(静态代码块 、构造函数等的执行顺序)

没有继承的状况下:

执行顺序:

1.静态成员变量

2.静态代码块

3.普通成员变量

4.普通代码块

5.构造函数

总结:

1.静态>普通

2.变量>代码块>构造函数

3.构造函数是最后执行的

子类继承父类的状况下:

1.父类的静态成员变量

2.父类的静态代码块

3.子类的静态成员变量

4.子类的静态代码块

5.父类的成员变量

6.父类的代码块

7.父类的构造函数

8.子类的成员变量

9.子类的代码块

10.子类的构造函数

总结:

1.先父类再子类

2.若是子类有静态成员变量和静态代码块,则执行完父类的静态成员变量和静态代码块后,接着执行子类的静态成员变量和静态代码块,不然直接按照父类的变量>代码块>构造函数,再执行子类的变量>代码块>构造函数

3.须要注意的是子类的静态变量和静态代码块是优先于父类的普通成员变量和代码块以及构造函数的。

 

十二、Java中sleep和wait的区别

一、来自不一样的类

sleep来自Thread类。wait来自Object类。

sleep是Thread类中的静态方法,谁调用的谁休眠,即便在a线程里调用了b的sleep方法,实际仍是a休眠。

二、有没有释放锁(释放资源)

sleep方法没有释放锁,wait方法释放了锁,使其它线程可使用同步控制快或者方法。

sleep不出让系统资源;wait是进入线程等待持等待,出让系统资源。其它线程能够占用cpu。

sleep能够加时间限制指定它自动唤醒过来。若是时间不到只能用interrupt()强行打断。wait通常不会加时间限制,由于wait线程的运行资源不够,再出来也没用,要等待其它线程调用notify/notifyAll唤醒等待池中全部线程,才会进入就绪队列等待OS分配的系统资源。

就是说sleep有时间限制的就像闹钟同样到时候就叫了,而wait是无限期的,除非用户主动notify

Thread.Sleep(0)的做用是“触发操做系统马上从新进行一次CPU竞争”。

3.使用范围不一样

sleep能够在任何地方使用。wait只能在同步控制方法或者同步控制块中使用。

4.是否须要捕获异常

sleep必须捕获异常。wait不须要捕获异常。

 

1三、Java线程的生命周期

 

 

1四、Java多线程中start()和run()的区别

Java的线程是经过java.lang.Thread类来实现的。能够经过建立Thread的实例来建立新的线程。每一个线程都是经过某个特定Thread对象所对应的run()方法来完成其操做的,经过run()方法执行线程体。经过start()方法来启动一个线程。

多线程原理:

调用start()后,线程会被放到等待队列,等待cpu调度,并不必定立刻开始执行,只是将这个线程置于可执行状态。而后经过JVM,线程Thread会调用run()方法,执行本线程的线程体。先调用start后调用run,这么麻烦,为了避免直接调用run?就是为了实现多线程的优势,没这个start不行。

多线程就是分时利用CPU,宏观上让全部线程一块儿执行 ,也叫并发。

相关文章
相关标签/搜索