hashMap
- 以数组方式存储Key-Value,无序的集合,非线程安全,在多线程、并发情况下是非线程安全的,不会存在相同key。
- 在jdk1.7之前是数组+链表结构,在jdk1.8的时候加入了红黑树,默认配置了当链表长度大于等于8时,转为红黑树,优化hash冲突,优化查询效率。
- 默认长度16,负载因子为0.75,当达到这个百分比时会自动扩容
- 是以Key-Value形式存储数据的,将key的hash值存在一个数组中,每个元素是LinkList结构,实际保存在一个散列表中。
- put时,将key通过hash算法得出的hash值,作为数组下标,将实际key-value值存入entry对象中,当hash冲突时会执行头插入,将原数据后移。
- get时,会将key通过hash算法得到下标,通过下标值获取数据对象,当值为多个时,通过对象中的next与equals方法去比对相同的KEY值
如何实现hashMap安全
- 使用 java.util.Hashtable 类,此类是线程安全的,不允许存入null值。
在主要方法上都加入了synchronized,保证安全,但也降低效率 - 使用 java.util.Collections.synchronizedMap() 方法包装 HashMap ,得到线程安全的Map,并在此Map上进行操作。
实现原理与hashTable一致,存在一个共享对象,在本身方法上加锁。 - 使用 java.util.concurrent.ConcurrentHashMap,此类是线程安全的。
增加了Segment层,是一个数组,每次操作只对单个Segment加锁,能够实现多线程操作,不仅安全,效率上也高 - 自己在程序中加锁,保证安全,会影响功能性能。
LinkedHaspMap
是一个有序集合,遵循先入先出,实现haspMap,是非线程安全,遍历的时候会比HashMap慢,有HashMap的全部特性
TreeMap
基于红黑二叉树的NavigableMap的实现,线程非安全,不允许null,存入TreeMap的元素应当实现Comparable接口或者实现Comparator接口排序。
HashMap与TreeMap
- HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)
- 在Map 中插入、删除和定位元素,HashMap是最好的选择。但如果您要按自然顺序或自定义顺序遍历,那么TreeMap会更好。
HashTable与HashMap
- 同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的。
- HashMap允许存在一个为null的key,多个为null的value
- hashtable的key和value都不允许为null。
List
本身有序、可重复,查询快增删速度慢
ArrayList
ArrayList是基于数组,是一个有序的集合,遵循先入先出,可以使用sort方法排序,提供Comparator比较器即可,线程异步不安全的
ArrayList排序
- 使用 Collections.sort() 简单的自然排序
- 重写Comparable 中的compareTo方法,自定义复杂排序
- 使用 Collections.sort()加匿名内部类,实现compare,自定义比较排序
LinkedList
LinkedList是基于链表,是一个无序的双向链表,按照插入的先后顺序排序,不提供sort方法对内部元素排序。
Vector 与 ArrayList
- vector是线程安全的,而arraylist是线程不安全的。如果不考虑到线程的安全因素,一般用arraylist效率比较高
- vector增长率为目前数组长度的100%,而arraylist增长率为目前数组长度的50%。如果在集合中使用数据量比较大的数据,用vector有一定的优势。
- 数组方式存储数据,查找速度相同,对于操作数据ArrayLis效率高
ArrayList和LinkedList
- ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
- 对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
- 在操作数据时,单条数据ArrayList效率高,批量操作是LinkedList效率高
Set
不能重复
HashSet
HashSet是基于HashMap来实现的,使用了hashMap的key实现各种特性,不允许重复(HashMap的key不允许重复,如果出现重复就覆盖),允许null值,无序集合,非线程安全。
TreeSet
基于 TreeMap 的 NavigableSet 实现。使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator进行排序,具体取决于使用的构造方法。
LinkedHashSet
- 根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序,遵循先入先出,
- 在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet。