1.HashMap原理?
不是线程安全的
a.扩容、并发问题
2.List/Set/Map的区别
ist有序元素可重复集合,所以有get()方法,获取指定位置的元素
set无序不重复集合,去重的时候用set
Map是一个键值对映射
3. HashMap和HashTable区别?
a. 相同点:数据结构都是基于哈希表
b. HashTable只接受非空对象,HashMap可以接受空对象
c.HashTable是线程安全的,HashMap不是
4.ConcurrentHashMap原理?(多线程情况下使用)
采用分段锁(锁分离)技术,它使用了多个锁来控制对hash表的不同部分进行的修改
5.HashSet原理?
是基于HashMap实现的,默认构造函数是构建一个初始容量为16,负载因子为0.75 的HashMap。封装了一个 HashMap 对象来存储所有的集合元素,所有放入 HashSet 中的集合元素实际上由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了一个 PRESENT,它是一个静态的 Object 对象。
6.TreeSet原理?
元素有序,掺入/删除高效
TreeSet在保证元素唯一性的基础上,好可以对元素进行排序。
底层原理是基于TreeMap来实现的。所以底层机构是红黑树,和HashSet不同的是不需要重写HashCode()和equlas()方法,因为他是靠比较器来去重。因为结构也是红黑树,所以每次插入都会遍历比较来寻找节点插入位置,如果发现某个节点的值是一样的就会覆盖、
NavigableSet(可导航可以按照从小到大排好)里面的实现是个treeMap(红黑树)
7. equals/hashCode区别/何时使⽤?
HashCode的约定:
1、如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。
2、如果两个对象不equals,他们的hashcode有可能相等。
3、如果两个对象hashcode相等,他们不一定equals。
4、如果两个对象hashcode不相等,他们一定不equals。
区别:
1、equals方法用于比较对象的内容是否相等(覆盖以后)
2、hashcode方法只有在集合中用到
3.当覆盖了equals方法时,比较对象是否相等将通过覆盖后的equals方法进行比较(判断对象的内容是否相等)
4、将对象放入到集合中时,首先判断要放入对象的hashcode值与集合中的任意一个元素的hashcode值是否相等,如果不相等直接将该对象放入集合中。如果hashcode值相等,然后再通过equals方法判断要放入对象与集合中的任意一个对象是否相等,如果equals判断不相等,直接将该元素放入到集合中,否则不放入。
8.ArrayList/LinkedList区别?
ArrayList是一个可以重新扩容的基于数组的实现,查询快
LinkedList基于双向链表的List实现,在添加和删除元素时具有比ArrayList更好的性能(用于队列情况,访问头元素和尾元素,或者插入一个元素时)
9.哪些集合类是线程安全的?
HashTable /ConcurrentHashSet
10.如何保证⼀个集合类不被修改?
使用Collections.ummodifiableXXX(list/map)方法转化为不可变的集合类
使用Guava的ImmutableXXX 的方法
11.ArrayList/Vector的区别?
a.ArrayList基于数组的自动扩容的实现
b.Vetor线程安全,但是慢(被废弃了);Arraylist不安全,但是效率高
12. 说⼀些常⻅的List/Set/Map实现?
ArrayList和 LinkedList
HashSet、TreeSet、LinkedHashSet
HashMap、TreeMap、LinkedHashMap、ConcurrentHashMap
13.Collection和Collections有什么区别?
• X是类名的话,Xs就是与之相关的⼯具⽅法集合
。