一、ArrayList、LinkedList、Vector异同
相同点:
- .都是List集合的实现类
- 存储数据的特点相同:有序的、可重复的
不同点:
- ArrayList和Vector底层是数组,LinkedList底层是使用双向链条的形式进行存储的
- ArrayList查询速度比较快,LinkedList增删速度高
二、遍历List集合的几种方式
- 迭代器
List list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add(123);
list.add("bbb");
// 1 迭代器
Iterator i = list.iterator();
while(i.hasNext()){
System.out.println(i.next());
}
- 增强for循环
for(Object o : list){
System.out.println(o);
}
- for循环
for (int j = 0; j < list.size(); j++) {
System.out.println(list.get(j));
}
- 转成数组,不建议这样做
Object[] objects = list.toArray();
for(Object o : objects){
System.out.println(o);
}
三、list和set集合的区别
- 相同点:都是Collection的子接口
- 不同点:List是有序的可重复,有自己定义的方法;Set是无序的不可重复的,没有自己定义的方法
四、HashMap的底层实现原理(面试重点,多家公司都有此面试题)
- Map map = new HashMap();先创建HashMap对象,调用构造方法,对加载因子进行了初始化
- map.put(123,123):首次调用put方法的时候,创建了一个长度为16的Node[]数组,并且对临界值(当数组中存放的元素为多少时,开始扩充数组)进行了初始化为12
- 添加一个元素put(key1,value1),调用key1所在类的HashCode方法,计算key1的哈希值,对哈希值通过一些算法进行计算,得key1元素的位置,拿着这个位置去Node[]数组里面找位置,①如果此位置数据为空,key1,value1添加成功;②如果此位置上的元素不为空,且key1的哈希值和已经存在的一个数据(key2-value2)哈希值不相同,直接添加成功;③如果key1的哈希值和已经存在的一个数据(key2-value2)哈希值相同,调用key1的equals方法和key2进行比较,①如果equals比较的结果返回false,此key1-value1添加成功(以链条的形式存在);②如果equals比较的结果返回true,使用value1替换value2
五、HashMap和Hashtable的区别
- Map的主要实现类,线程不安全,效率高,可以存储值为null的key和value
- 古老的实现类,线程安全,效率低,不可以存储值为null的key和value
六、Collection和Collections的区别
- Collection是Set和List的一个父接口
- Collections是一个操作Set、List和Map等集合的工具类
七、处理异常的方式
抓抛模型
- 抛:当执行程序的时候,一旦出现异常,就会生成一个对应的异常对象,并将异常抛出
(1)抛的类型:自动抛和手动抛
手动抛:throw + 异常类的对象,这个异常类可以是现成的异常类,也可以是自己定义的异常类
(2)此异常对象处理交给方法的调用者, 一旦出现异常,就会生成一个对应的异常对象,并将对象抛出,将来交给方法的调用者 - 抓:抓住程序中抛出的异常对象
两种处理方式:try-catch、throws+异常类型
(1)在java程序运行时收到异常对象,会寻找能够处理这种异常的异常代码,并将当前的异常对象交给其来处理
(2)怎么抓异常对象?抓的过程就是异常处理的方式