容器
- .java 容器都有哪些?
- 19.Collection 和 Collections 有什么区别?
- 数组和集合的区别:
1.数组的大小是固定的,并且同一个数组只能是相同的数据类型
2.集合的大小是不固定的,在不知道会有多少数据的情况下可使用集合。
- 集合的三种类型:list(列表)、set(集)、map(映射)
List接口和Set接口属于Collection接口,Map接口和Collection接口并列存在(同级)。
- HashMap和Hashtable的区别
答案:1.继承的父类不同 2.Hashtable线程安全,HashMap不安全 3.Hashtable key不能为空,HashMap可以
HashMap的初始容量为16,Hashtable初始容量为11,两者的填充因子默认都是0.75。
HashMap扩容时是当前容量翻倍即:capacity*2,Hashtable扩容时是容量翻倍+1即:capacity*2+1。
- 22.如何决定使用 HashMap 还是 TreeMap?
如果用来排序,使用TreeMap,默认按键值升序排列;
TreeMap的实现是基于红黑树结构。
线程不安全
如果快速插入删除,使用HashMap,
数据结构主要是桶(数组),链表或红黑树(jdk1.8以后)
线程不安全
- 23.说一下 HashMap 的实现原理?
- 24.说一下 HashSet 的实现原理?
HashSet实际上是一个HashMap实例,都是一个存放链表的数组。它不保证存储元素的迭代顺序;此类允许使用null元素。HashSet中不允许有重复元素,这是因为HashSet是基于HashMap实现的,HashSet中的元素都存放在HashMap的key上面,而value中的值都是统一的一个固定对象private static final Object PRESENT = new Object();
HashSet中add方法调用的是底层HashMap中的put()方法,而如果是在HashMap中调用put,首先会判断key是否存在,如果key存在则修改value值,如果key不存在这插入这个key-value。而在set中,因为value值没有用,也就不存在修改value值的说法,因此往HashSet中添加元素,首先判断元素(也就是key)是否存在,如果不存在这插入,如果存在着不插入,这样HashSet中就不存在重复值。
所以判断key是否存在就要重写元素的类的equals()和hashCode()方法,当向Set中添加对象时,首先调用此对象所在类的hashCode()方法,计算次对象的哈希值,此哈希值决定了此对象在Set中存放的位置;若此位置没有被存储对象则直接存储,若已有对象则通过对象所在类的equals()比较两个对象是否相同,相同则不能被添加。