一、hashcode和equal
- 如果两个对象的hashcode值不相等——>必定是两个不同的对象
- 如果两个对象的hashcode值相等,就还要进行equals()判断,如果为true 表示两个对象相同,如果为false 则表示是两个不同对象
当使用hashmap时,首先调用加入对象的hashCode方法得到hashCode值,判断已经存在的对象的hashCode值是否与加入对象的HashCode值相等,如果不相等,说明是不同的对象,直接加进去,如果hashcode值相等,再进行equals判断,如果为true ,说明对象已经加进去,就不会在增加新的对象,如果为false 则直接加进去。
二、HashMap、LinkedHashMap、CurrentHashMap
- HashMap 基于hash算法的Map接口的非同步实现,非线程安全;通过put(key ,value)和get(key)存取对象,put时,对key的hashcode值进行hash计算(可以理解为得到一个index)得到这个元素在数组中的位置,并将元素存储到该位置上,get时,通过对key的hashcode值的hash计算得到在数组中的位置,然后将该位置的元素取出。HashMap是无序的,内部维护的是单链表
- LinkedHashMap 底层使用哈希表与双向链表保存元素,非线程安全,LinkedHashMap是有序的,有插入顺序和访问顺序,内部维护的是一个双向链表
- CurrentHashMap 基于双数组和链表的Map接口的同步实现,线程安全
HashMap是非线程安全的,当只有一个线程使用HashMap时没有问题,如果涉及到多个线程,就不能使用HashMap了,这时可以使用currentHashMap
三、HashMap和HashTable
- HashMap 方法是非同步的,非线程安全;基于AbstractMap类,而AbstractMap类是Map接口的实现;key value都可以为null
- HashTable 方法同步,线程安全,基于Dictionary类,key value都不能为null
四、ArrayList 、LinkedList 、Vector
- ArrayList: 底层数组实现;方法不同步,非线程安全;查询快、增删慢
- LinkedList 底层双向链表实现;方法不同步,非线程安全;查询慢、增删快
- Vector 底层数组实现;方法同步,线程安全;
总结:需要线程同步使用Vector,经常查询使用ArrayList,经常插入删除使用LinkedList
时间: 2024-10-12 00:50:19