List
元素有序,且可重复
遍历方法:1-for循环通过下标遍历 2-foreach遍历 3-使用迭代器遍历 4-使用lambda遍历
扩容:初始容量10,负载因子0.5,扩容增量0.5被 新容量=旧容量+旧容量*0.5或者新容量=旧容量*1.5
实现
ArrayList
1 简单数据结构,超出容量会自动扩容。所以在我们看来ArrayList的空间是无线大的,动态数据 2 内部实现是基于基础的对象数组 3 随机访问块 4 不适合随机的增加或者删除(因为ArrayList是一个对象数据,数据一旦要修改整个数据位置都会改动) 5 线程不安全(因为整个方法没有锁)
LinkedList
1 LinkedList额外提供了一些方法。比如addFirst 在集合最前面增加一组数据,addLast 在集合最后面增加一组数据,以及remove和insert方法等等 2 LinkedList可用作堆栈(stack)包括了push和pop方法 队列queue 或双向队列deque 3 以双向对象实现,所以能够很好的实现增加或者删除。链表无容量限制,允许元素为空 4 适合最随机的增加或者删除 5 线程不安全(方法里面没有锁)
Vector
线程安全(说白了在每个方法里面都加了锁)并行效率慢,不建议使用
CopyOnwiterArrayList
1 写时复制 2 线程安全 3 适合读多写少的场景(我查阅了很多数据,在数据很多的适合还是不适合写) 4 写时复制一个新的数据,在这个新的数组里面完成增加或者修改删除,后将新数组赋值给旧数组。最终完成数据一致性 5 比Vector性能高(虽然copyonwiterarraylist里面的方法也有所,但是它是写时赋值一个新的数组。在用户未完成新数组修改的方法后,其他用户还是访问的是旧数组。两边都不耽误) 6 最终一致性 7 继承了List接口,使用方法与ArrayList基本一致(你只要会用ArrayList就会copyonwiterarraylist)
Set
特点:无序,不重复
遍历:foreach,迭代器,下标,lambda表达式。基本与list一致
扩容:初始容量为16,负载因子0.75。扩容增加一倍
实现
HashSet
1 它存储唯一元素并允许空值,依据对象的hashcode来判断该元素是否存在 2 由HashMap支持 3 不保存插入顺序 4 非线程安全(方法也没有锁)
TreeSet
1 是一个有序的,且不包含重复的额元素的集合 2 作用是根据根据有序的Set集合,自然排序或者根据提供的Comparator进行排序 3 TreeSet是基于TreeMap实现的
Map
特点:无序,键值对。键不可以重复,值可以重复。键如果重复则覆盖,没有继承Collection接口
扩容:初始容量16,负载因子0.75,扩容增量1倍
遍历:1-先获取所有键的Set集合,再遍历(通过键来获取值)2-取出保存好的Entry的Set,再遍历Set即可
实现
HashTable
线程安全,不太常用(用一把锁锁住所有,性能慢)
ConcurrentHashMap
线程安全,性能比HashTable高(因为是分段锁,而且还实现了cis接口)
TreeMap
1 Key值按一定的顺序排序 2 添加或者获取元素比ConcurrentHashMap慢。因为需要维护内部的红黑树,用于保证Key值的顺序
LinkedHashMap
继承HashMap
LinkedHashMap是有序的,而且默认为插入顺序(与你怎么写就怎么输出)但我们需要有序的存储Key或者value是就使用LinkedHashMap