java的集合有哪些
1、常用的三大类集合:Set、List、Map。
2、Set1) Set 集合属于单列集合,不允许包含重复元素;2) 判断元素是否重复的标准为对象的 equals 方法,存在时返回 false,不存在返回 true;3) 元素的排序规则,由相应的实现类决定,分为无序、元素大小排序、写入顺序排序;4) 初始化大小,扩容参考 HashMap。
3、(1)Set 接口、实现类:接口:Set、SortedSet实现类:HashSet、TreeSet、LinkedHashSet
4、(2)HashSet:1) HashSet 实现了 Set 接口,继承了 AbstractSet 类,由哈希表支持,看源码可以发现是一个 HashMap 实例。2) HashSet 不保证集合内元素的迭代顺序,特别是不保证迭代顺序永久不变,该集合运行 null 元素存在。3) HashSet 中的元素,作为 HashMap 键值对的 Key 存储,而 Value 由一个统一的值保存。4) HashSet 默认初始化大小为 16,扩容加载因子为 0.75,扩容大小为原来的一倍。即一个初始化size为16的 HashSet,元素添加到12个的时候会进行扩容,扩容后的大小为32。
5、(3)TreeSet:1) TreeSet 实现了 NavigableSet 接口,继承了AbstractSet类,由哈希表支持,看源码可以发现是一个 TreeMap 实例。2) TreeSet 中的元素有序的,排序规则遵照元素本身的大小进行排序,元素不能重复。3) TreeSet 中的元素,作为 TreeMap 键值对的 Key 存储,而 Value 由一个统一的值保存。
6、(4)LinkedHashSet:1) LinkedHashSet实现了 Set 接口,继承了HashSet类,由哈希表支持,看源码可以发现是一个LinkedHashMap 实例。2) LinkedHashSet中的元素有序的,排序规则遵照元素写入顺序进行排序,元素不能重复。3) LinkedHashSet 中的元素,作为 LinkedHashMap 键值对的 Key 存储,而 Value 由一个统一的值保存。
7、List1) List 集合属于单列、有序的、允许元素重复、可以为 null 的集合;2) List 接口的实现类主要有三种:ArrayList、LinkedList、Vector。
8、(1)List 接口、实现类:接口:List实现类:ArrayList、LinkedList、Vector
9、(2)ArrayList1) ArrayList 实现了 List 接口,继承了 AbstractList 类,由一个 Object[] 实例实现,即底层为数组结构;2) 默认初始化长度为 10,扩容规则为 0.5倍的原容量加1,即一次扩容后的长度为 16;3) 特点:查询速度快,添加、删除相对于LinkedList较慢、线程不同步(不安全)。
10、(3)LinkedList1) LinkedList 实现了 List 接口,继承了 AbstractSequentialList 类,由一个 Node 节点链表实现,即底层为链表结构;2) 由于LinkedList 数据结构为链表,无预扩容机制;3) 特点:添加、删除速度快,查询相对于ArrayList较慢、线程不同步(不安全)。
11、(4)Vector1) Vector实现了 List 接口,继承了 AbstractList 类,由一个 Object[] 实例实现,即底层为数组结构;2) 默认初始化长度为 10,扩容加载因子为 1,当元素长度大于原容量时进行扩容,默认为 10,一次扩容后容量为 20;3) 特点:线程安全,但是速度慢;在实现的方法上,用 synchronized 关键字进行了修饰,即在方法上实现了同步锁。
12、Map1) Map 集合属于双列Key-value键值对的集合,Key不允许重复,是否允许为 null 根据实现类而定,Value 随意;2) Map 接口的实现类主要有三种:HashMap、LinkedHashMap、TreeMap、Hashtable、ConcurrentHashMap。
13、(1)Map接口、实现类:接口:Map实现类:HashMap、LinkedHashMap、TreeMap、Hashtable、ConcurrentHashMap
14、(2)HashMap1) HashMap实现了 Map接口,继承了 AbstractMap类,数据结构采用的位桶数组,底层采用链表或红黑树进行存储;2) 默认初始化长度为 16,扩容加载因子为 0.75,一旦大于 0.75*16之后,就会调用resize()进行扩容,扩容2倍,即32;3) JDK1.7中,数据结构采用:位桶数组+链表结构; JDK1.8中,数据结构采用:位桶数组+(链表/红黑树);4) 支持克隆,无序,线程不同步,非安全。
15、(3)LinkedHashMap1) LinkedHashMap 实现了 Map 接口,继承了 HashMap 类; 引用实现;3) 迭代顺序由 锾攒揉敫accessOrder 属性的决定,默认为 false,以插入顺序访问;设置为 true 则按上次读取顺序访问(每次访问 元素时会把元素移动到链表末尾方便下次访问,结构会时刻变化)。4) 默认初始化长度为 16,扩容加载因子为 0.75,一旦>0.75*16之后,就会调用resize()进行扩容,与HashMap一致;5) 支持克隆,有序,线程不同步,非安全。
16、(4)TreeMap1) TreeMap实现了 NavigableMap接口,继承了 AbstractMap 类;2) 数据结构基于红黑树实现;3) 该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法;4) 无初始化长度;5) 支持克隆,有序,线程不同步,非安全。
17、(5)Hashta水瑞侮瑜ble1) Hashtable实现了 Map 接口,继承了 Dictionary类;2) 数据结构:也是一个散列表,数据结构与HashMap相同,key、value都不可以为 null;3) 该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法;4) 默认初始化长度为 11,扩容加载因子为 0.75,一旦>0.75*11之后,就会进行扩容,扩容到2n+1,即23;5) 支持克隆,无序,线程同步,安全。在实现的方法上,用 synchronized 关键字进行了修饰,即在方法上实现了同步锁。6) 支持 Enumeration 遍历方式。
18、(6)ConcurrentHashMap1) ConcurrentHashMap实现了 ConcurrentMap接口,继承了 AbstractMap类;2) 默认初始化长度为 16,扩容加载因子为 0.75,一旦大于 0.75*16之后,就会调用resize()进行扩容,扩容2倍,即32;3) 数据结构:由Segment数组结构和HashEntry数组结构组成,一个ConcurrentHashMap中包含一个Segment数组, Segment的结构和HashMap类似,是一种数组和链表结构。4) 使用了锁分段技术,Segment是一种可重入锁ReentrantLock,每个Segment拥有一个锁,当对HashEntry数组的 数据进行修改时,必须先获得对应的Segment锁5) 不支持克隆,无序,线程同步,安全。