1. 重载和重写的区别
1)重载:
2)重写: 子类重写父类的方法
- 方法名、参数列表都相同
- 子类的返回值范围小于父类
- 抛出的异常范围小于父类
- 访问修饰符的范围大于等于父类
- 如果父类方法访问修饰符为 private 则子类就不能重写该方法
2. List 和 Set 的区别
- List 有序、可重复、允许多个 null 元素对象,可以使用迭代器取出所有元素,再逐一遍历,还可以使用 get(index) 下标的形式获取指定下标的元素,也就是说支持随机访问
- Set 无序,不可重复,最多容许一个 null 元素对象,取元素时,只可以使用迭代器接口取得所有元素,再逐一遍历各个元素 (很好理解鸭,它无序,所有肯定不能用 get(index) 这种方式取,下标对它来说无意义)
3. ArrayList 和 LinkedList 的区别
- 在底层实现上,ArrayList 底层是数组,LinkedList 底层是链表
- 这样的结构导致了他们的使用场景的区别,ArrayList 更适合随机查找比较多的场景,LinkedList 更适合删除和添加场景比较多的场景
- ArrayList 和 LinkedList 都实现了 List 接口,但是 LinkedList 还实现了 Deque 接口,也就是说LinkedList 可以当作双端队列的来使用
4. ConcurrentHashMap 的扩容机制
1.7 中的 ConcurrentHashMap 基于 Segment 实现,每个 Segment 相当于一个小型的 HashMap。当需要进行扩容时,Segment 对象内部进行扩容。和 HashMap 扩容机制类似,先生成新数组,然后将元素转移到新数组中,再修改指针指向新的数组。其对扩容阈值的判断,是基于每个 Segment 内部进行判断的

1.8中的 ConcurrentHashMap 不再基于 Segment 实现,其扩容是可以多线程的。扩容之前也生成一个新数组,然后将需要转移的元素分组,每组交给不同线程转移,每个线程负责一组或多组的转移工作。若是出现扩容时,一线程想 put 的情况,则该线程帮忙一起扩容
