1. Java的基本数据类型有哪些?
byte(1),shortint(2),char(2),int(4),float(4),boolean(4),double(8),long(8)
2. 谈谈final,finally有什么不同?
作用不同:
final可以用来修饰类、方法、变量,分别有不同的意义:
final修饰类代表该类不可以被继承;
final修饰方法代表该方法不可以被重写;
final修饰变量代表该变量的值不可以修改;
finally用来保证重点代码一定会被执行的一种机制,值得注意的是:如果try语句中含有return语句,return语句和finally代码块的执行顺序是:先执行return上的表达式,再执行finally代码块,最后才返回,如下所示。
public class FinallyMain {
public static void main(String[] args) {
int num = test();
System.out.println(num);
}
private static int test() {
int num = 10;
try {
return num+=20;
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println(num);
}
return 0;
}
}
运行结果为
10
30
3. String,StringBuilder,StringBuffer有什么区别?
- String类是final类,不可被继承,而且String的对象的是不可变,类似字符串拼接、裁剪等动作,都会产生一个 新的String对象。
- StringBuffer类的对象可以当成一个可变的字符串序列,可以解决String拼接、裁剪过程产生过多对象的问题。
- StringBuffer类的默认初始容量是16 char(16*2字节);
- StringBuffer类是线程安全的,成员方法都用synchronized修饰;
- StringBuilder类的作用和StringBuffer类没有本质区别,只是StringBuilder类的方法去掉了synchronized,放弃线程安全,追求更高的执行效率。
4. Vector,ArrayList,LinkedList有什么区别?
LinkedList
- 底层基于双向链表实现,由于基于链表实现,所以增删快O(1),查找慢O(n);
- 由于每个节点都需要保存前后两个节点的引用,所以占用更多的内存空间。
ArrayList
- 底层使用数组实现,优缺点是查找快O(1),增删慢O(n);
- 增删元素会导致后面元素的位置发生变动,这也是ArrayList增删元素效率慢的原因;
- 对集合元素的操作不是线程安全的;
- 扩容:
newCapacity = oldCapacity + (oldCapacity >> 1)
,即每次增加旧capacity的0.5倍。
Vector
底层和ArrayList一样使用数组实现,查找快,增删慢;
对集合的操作是线程安全的(正因此效率比ArrayList慢);
- 扩容:
newCapacity = oldCapacity + ((capacityIncrement > 0) ?capacityIncrement : oldCapacity)
,每次翻倍扩容(若设置了增量因子(capacityIncrement ) ,按增量因子增加)。