http://blog.csdn.net/justloveyou_?viewmode=contents 里面有较多关于面试的总结
https://github.com/liyang0211/interview-resources-zhCN
Integer
[-128,127]的数据是缓存在Integer[]中,因此
Integer a= 127; Integer b= 127; System.out.println(a==b); 结果=true
Integer a= 128; Integer b= 128; System.out.println(a==b); 结果=false
tring和StringBuffer、StringBuilder的区别
性能差别:StringBuilder > StringBuffer > String;
StringBuffer线程安全、StringBuilder线程不安全
String、StringBuffer和StringBuilder本质都是char[]
String中char[]的长度和String相同,每次拼接都要new新的char[]
StringBuffer和StringBuilder中char[]的长度大于实际字符长度,只是当容量不够时才copy到一个更大的char[]
hashCode和equals方法的关系
hashcode()方法是JDK根据对象的地址或者字符串的值计算出来的int类型的数值(哈希码值)。
hashcode()的约定:
同一对象多次调用hashcode()方法,必须返回相同的数值。
如果两个对象根据equals()方法比较是相等的,那么两个对象调用hashcode()方法返回的结果必须相等。
如果两个对象根据equals()方法比较是不相等的,那么两个对象调用hashcode()方法返回的结果不一定不相等。
Object中的hashcode():
通过将对象的内部地址转换为整数来实现
Object中的equals():
public boolean equals(Object obj) {
return (this == obj);
}
请注意,无论何时重写equals(),通常都必须重写hashcode(),以维护hashCode方法的一般约定,该方法声明相等对象必须具有相同的哈希代码。
String中的hashcode(): 公式= s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
String中的equals():
两个字符串非空,并且char[]中每一个char用“==”表达式返回true
练习:
Student s = new Student();
System.out.println(s.hashCode());
s.setName("peter");
System.out.println(s.hashCode());
两次返回的hashcode相同
String s = "ab";
System.out.println(s.hashCode());
s = "bc";
System.out.println(s.hashCode());
两次返回的hashcode不相同
内部类和外部类的区别
a. 内部类可以用private、protected、static来修饰,而外部类不可以。
b. 内部类可以直接访问外部类的成员,而外部类不可以直接访问内部类的成员。具体见“静态内部类和普通内部类的区别”。
静态内部类和普通内部类的区别(参考LinkedList的静态内部类Node)
a. 外部类访问内部类:
外部类访问普通内部类的非静态成员(普通内部类不能定义静态属性或静态方法): MyTest.Student s = new MyTest().new Student(); s.hello();
外部类访问静态内部类的非静态属性: MyTest.Teacher t = new MyTest.Teacher(); t.hello();
外部类访问静态内部类的静态属性: MyTest.Teacher.School_Name;
b. 内部类访问外部内:
所有内部类可以直接使用外部类的静态属性
普通内部类可以直接使用外部类的非静态属性
静态内部类必须通过外部类的对象访问外部类的非静态属性:MyTest test = new MyTest(); test.hello();
c. 普通内部类里面不能定义各种静态的成员(包括静态变量、静态方法、静态代码块和静态内部类),而静态内部类中则可以。原因:普通内部类必须通过外部类的对象来访问,违背了静态成员可以直接通过类名访问的规则。
d. 初始化方式不同:
静态内部类初始化 MyTest.Teacher t = new MyTest.Teacher();
非静态内部类初始化 MyTest.Student s = new MyTest().new Student();
e. 注意:静态内部类和普通内部类都可以定义非静态的属性或方法,都以用new实例化出静态内部类和普通内部类的对象。原因:用static修饰内部类,只是说明该类属于外部类本身,而不是属于外部类的某个对象。
Java中的BIO,NIO,AIO
BIO(同步阻塞IO):一个连接对应一个线程
当有客户端连接请求时,服务端需要启动一个线程进行处理,如果这个连接不做任何处理,会造成不必要的线程开销,可以通过线程池机制改善,从而实现伪异步IO;
NIO(同步非阻塞IO):N个连接对应一个线程
客户端所有的连接请求都会注册到多路复用器上,服务端通过一个多路复用器来处理所有请求。
AIO(异步非阻塞IO):NIO的2.0版本,引入了异步通道的概念,可以实现异步调用。
异步实现方式:通过java.util.concurrent.Future类来表示异步操作的结果;
在执行异步操作的时候传入java.nio.channels。
AIO相对于NIO的区别在于,NIO需要使用者线程不停的轮询IO对象,来确定是否有数据准备好可以读了,而AIO则是在数据准备好之后,才会通知数据使用者,这样使用者就不需要不停地轮询了。
参考:
https://baijiahao.baidu.com/s?id=1573998393898438&wfr=spider&for=pc
http://blog.csdn.net/x_i_y_u_e/article/details/52223406
http://blog.csdn.net/a19881029/article/details/52099795
https://www.ibm.com/developerworks/cn/java/j-lo-nio2/
等待进一步深入了解