Java集合只要分为Collection(单列)和Map(双列)这两个接口:
Collection子接口中又包含了List和Set等
List是有序可重复集合、Set是无序不可重复集合、Map是存储key-value对的集合
常用的集合包括:ArrayList、LinkedList、Vector、HashSet、LinkedHashSet、TreeSet、HashMap、HashTable、LinkedHashMap、Properties、TreeMap等
List:(有序的、可重复、有索引)
ArrayList:
结构特点:
底层为数组、可为Null且可重复、线程不安全(执行效率高)多线程不建议
扩容机制:
1、若为无参构造器,初始为0,第一次扩容到10,后扩容*1.5
2、若为有参构造器,初始为设定的值,后扩容*1.5
Vector:
结构特点:
底层为数组、可为Null且可重复,等同于ArrayList,但线程是安全的
扩容机制:
1、若无参构造器,初始为10,满后2倍扩容
2、若有参构造器,初始为设定的值,满后2倍扩容
LinkedList:
结构特点:
底层为双向链表、可为Null且可重复,线程不安全
维护了两个属性first和last分别指向首节点和尾节点
每个节点(Node对象),里面又维护了prev、next、item三个属性,其中通过prev指向前一个,通过next指向后一个节点,最终实现双向链表。添加和删除的效率高。
Set:(无序、不可重复、一个Null、无索引)
HashSet:
结构特点:
底层为HashMap(数组+链表+红黑树)、无序、不可重复、一个Null
添加元素先得到hash值会转成->索引值,找到存储数据表table,看这个索引的位置是否有元素,如果没有,直接加入;如果有,调用equals比较,如果相同则放弃,如果不同,则添加到最后(链表)
在java8中,如果一条链表的个数到达8个,并且table的大小达到64,就会进行树化(红黑树)、在java7是(数组+链表),java8改动因为数据多操作会慢,树化操作快
扩容机制:
第一次添加,则需要扩容table容量为16,临界值为容量的0.75(12)
以后,若table的size到达临界值则进行下一次扩容,容量*2,临界值*2
LinkedHashSet:
结构特点:
底层为LinkedHashMap(哈希表+双向链表)、不可重复、一个Null、有序
根据元素的HashCode值来决定元素的存储位置,同时使用链表维护元素的次序
添加元素先得到hash值会转成->索引值,找到存储数据表table,看这个索引的位置是否有元素,如果没有,直接加入;如果有,调用equals比较,如果相同则放弃,如果不同,则添加到最后(链表)
扩容机制:
创建对象后,添加第一次时,直接将数组table表扩容到16
TreeSet:
结构特点:
底层为TreeMap(红黑树)、线程不安全
无参构造是为无序、有参构造可以传入一个比较器(匿名内部类)并指定排序规则
Map:(Key-Value(双列)、Key不能重复、重复则覆盖、V可以、Key一个Null、V多个)
HashMap:
结构特点:
底层为(数组+链表+红黑树)、无序、Key不可重复、Key一个Null、Value可以为多个、线程不安全
添加元素先得到hash值会转成->索引值,找到存储数据表table,看这个索引的位置是否有元素,如果没有,直接加入;如果有,调用equals比较,如果相同则放弃,如果不同,则添加到最后(链表)
在java8中,如果一条链表的个数到达8个,并且table的大小达到64,就会进行树化(红黑树)、在java7是(数组+链表),java8改动因为数据多操作会慢,树化操作快
扩容机制:
第一次添加,则需要扩容table容量为16,临界值为容量的0.75(12)
以后,若table的size到达临界值则进行下一次扩容,容量*2,临界值*2
HashTable:
结构特点:
底层为(Hashtable$Entry[]数组)、无序、Key不可重复、Key只能一个Null、Value可以为多个、线程安全
扩容机制:
初始大小11,临界值为容量的0.75(8)
后>=临界值时进行扩容,容量=容量*2+1(第一次11*2+1=23)
LinkedHashMap:
结构特点:
底层为(哈希表+双向链表)、不可重复、一个Null、有序、线程不安全
根据元素的HashCode值来决定元素的存储位置,同时使用链表维护元素的次序
添加元素先得到hash值会转成->索引值,找到存储数据表table,看这个索引的位置是否有元素,如果没有,直接加入;如果有,调用equals比较,如果相同则放弃,如果不同,则添加到最后(链表)
扩容机制:
创建对象后,添加第一次时,直接将数组table表扩容到16
Properties:
结构特点:
底层为(数组)继承了HashTable类和HashTable类似、Key不可重复、Key只能有一个Null、Value可以为多个
Properties还可以从xxx.properties文件进行读取并修改
TreeMap:
结构特点:
底层为(红黑树)、线程不安全
无参构造是为无序
有参构造可以传入一个比较器(匿名内部类)并指定排序规则