- Iterator: 迭代器
- Collection:List\Set\Queue集合父类
- Map: hash表映射结构
2.List
- AbstractList: List集合(Vector、 ArrayList、LinkedList)抽象父类
- AbstractSet: Set集合(HashSet、 TreeSet)抽象父类
- sortedSet:TreeSet
- AbstractMap:Map集合(HashMap、 TreeMap、WeakHashMap HashTable )抽象父类
- SortedMap:TreeMao
2.List集合
2.1ArrayList--------------线程不安全
- 特点:有序、可重复 底层是数组
- 查询速度快,增、删速度较慢
构造方法
- ArrayList() :代表创建一个空的ArrayList列表,初始化的空间大小是0,第一次添加元素时,会设置为10
- ArrayList(int initailCapacity):创建一个自定义容量的ArrayList列表。
2.2LinkedList----------------线程不安全
- 特点:有序,可重复,底层使用双向链表
- 增加、删除操作速度较快,查询较慢
- List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列。
-
注意,此实现不是同步的。如果多个线程同时访问一个链接列表,而其中至少一个线程从结构上修改了该列表,则它必须 保持外部同步。(结构修改指添加或删除一个或多个元素的任何操作;仅设置元素的值不是结构修改。)这一般通过对自然封装该列表的对象进行同步操作来完成。如果不存在这样的对象,则应该使用
Collections.synchronizedList
方法来“包装”该列表。最好在创建时完成这一操作,以防止对列表进行意外的不同步访问,如下所示:List list = Collections.synchronizedList(new LinkedList(...));
- addFirst(E e):在头部增加一个元素
- addLast(E e):在尾部增加一个元素
- getFirst()、getLast():获取到头部和尾部的元素
- removeFirst、removeLast():删除头部及尾部的元素
- pop():弹栈,将栈顶的元素弹出push(E e):压栈,将元素压入栈顶
Set集合
2.3HashSet集合 线程不安全,需要用迭代器进行元素迭代
- 特点:无序 不能够重复
- 底层调用的是HashMap,将元素中的值作为map的key进行存储
-
此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。
-
此类的 iterator 方法返回的迭代器是快速失败 的:在创建迭代器之后,如果对 set 进行修改,除非通过迭代器自身的 remove 方法,否则在任何时间以任何方式对其进行改,Iterator 都将抛出
ConcurrentModificationException
。因此,面对并发的修改,迭代器很快就会完全失败,而不冒将来在某个不确定时间发生任意不确定行为的风险。 -
注意,此实现不是同步的。如果多个线程同时访问一个哈希 set,而其中至少一个线程修改了该 set,那么它必须 保持外部同步。这通常是通过对自然封装该 set 的对象执行同步操作来完成的。如果不存在这样的对象,则应该使用
Collections.synchronizedSet
方法来“包装” set。最好在创建时完成这一操作,以防止对该 set 进行意外的不同步访问: -
HashSet():通过HashMap构建一个默认空间大小的一个集合
-
HashSet(int initialCapacity):设置默认的空间大小。hashmap中,对于空间大小的设置如果没有参数就会设置16,如果有参数,就会使用2的n次幂计算出来当前传入参数的更大的一值
- HashSet(int initialCapacity, float loadFactor):设置默认的空间大小,loadFactor负载因子,该
- 负载因子的作用是判断当前容器的空间大小,当使用initialCapacity*loadFactor就会计算出需要 扩容的阈值。
2.4TreeSet----------线程不安全
- 特点: TreeSet元素不重复
- 能够自定义元素的顺序,前提对象必须实现
- java.lang.Comparable接口
- 线程不安全
- 基于
TreeMap
的NavigableSet
实现。使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的Comparator
进行排序,具体取决于使用的构造方法。 - 注意,此实现不是同步的。如果多个线程同时访问一个 TreeSet,而其中至少一个线程修改了该 set,那么它必须 外部同步。这一般是通过对自然封装该 set 的对象执行同步操作来完成的。如果不存在这样的对象,则应该使用
Collections.synchronizedSortedSet
方法来“包装”该 set。此操作最好在创建时进行,以防止对 set 的意外非同步访问: - SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...));
2.5LinkedHashSet 线程不安全
- 特点:有序,元素唯一
- 线程不安全
- 继承了HashSet,所以该类的方法与HashSet的
- 方法完全一样
Set<Integer> set = new LinkedHashSet<>()
3.Map集合
3.1HashMap ----------- 线程不安全
HashMap基于哈希表的Map接口实现,是以key-value存储形式存在。(除了不同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)
- 特点:使用K、V形式存储
- 线程不安全,容易出现线程并发问题
- 能够使用null作为key以及value
- key是不可以重复
3.1.1HashMap数据结构
- 在 JDK1.8 中,HashMap 是由 数组+链表+红黑树构成,新增了红黑树作为底层数据结构,结构变得复杂了,但是效率也变的更高效。当一个值中要存储到Map的时候会根据Key的值来计算出他的hash值,通过哈希来确认到数组的位置,如果发生哈希碰撞就以链表的形式存储 在Object源码分析中解释过,但是这样如果链表过长来的话,HashMap会把这个链表转换成红黑树来存储。
- 在JDK1.8之前是由数组+链表构成的
3.1.2为什么要新增红黑树
- 因为Map中桶的元素初始化是链表保存的,其查找性能是O(n),而树结构能将查找性能提升到O(log(n))。当链表长度很小的时候,即使遍历,速度也非常快,但是当链表长度不断变长,肯定会对查询性能有一定的影响,所以才需要转成树。至于为什么阈值是8--去看源码
3.2TreeMap