集合基础知识

 

1.顶级接口
  • Iterator: 迭代器
  • Collection:List\Set\Queue集合父类
  • Map: hash表映射结构

2.List

  • AbstractList: List集合(VectorArrayListLinkedList)抽象父类
3.Set
  • AbstractSet: Set集合(HashSetTreeSet)抽象父类
  • sortedSet:TreeSet
4.Map
  • AbstractMap:Map集合(HashMapTreeMap、WeakHashMap HashTable )抽象父类
  • SortedMap:TreeMao

2.List集合

2.1ArrayList--------------线程不安全

  • 特点:有序、可重复 底层是数组
  • 查询速度快,增、删速度较慢

构造方法

 

  1. ArrayList() :代表创建一个空的ArrayList列表,初始化的空间大小是0,第一次添加元素时,会设置为10
  2. ArrayList(int initailCapacity):创建一个自定义容量的ArrayList列表。

 


remove(Object o):删除对应的Object o元素,但是如果采用了边循环边删除的形式可能会抛出:

器元素是一致,当删除了集合中的元素后,迭代器并不知道某个元素被删除,还是原来的数量,
经过判断后,发现集合的长度与迭代器的数值不 一致,就会抛出该异常。

 

解决方案: 可以通过迭代器remove方法对集合进行删除。但是尽量不要出现该种操作。

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():获取到头部和尾部的元素
  • removeFirstremoveLast():删除头部及尾部的元素
  • pop():弹栈,将栈顶的元素弹出push(E e):压栈,将元素压入栈顶

Set集合  

2.3HashSet集合  线程不安全,需要用迭代器进行元素迭代

  • 特点:无序 不能够重复
  • 底层调用的是HashMap,将元素中的值作为mapkey进行存储
  • 此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。

  • 此类的 iterator 方法返回的迭代器是快速失败 的:在创建迭代器之后,如果对 set 进行修改,除非通过迭代器自身的 remove 方法,否则在任何时间以任何方式对其进行改,Iterator 都将抛出 ConcurrentModificationException。因此,面对并发的修改,迭代器很快就会完全失败,而不冒将来在某个不确定时间发生任意不确定行为的风险。

  • 注意,此实现不是同步的。如果多个线程同时访问一个哈希 set,而其中至少一个线程修改了该 set,那么它必须 保持外部同步。这通常是通过对自然封装该 set 的对象执行同步操作来完成的。如果不存在这样的对象,则应该使用 Collections.synchronizedSet 方法来“包装” set。最好在创建时完成这一操作,以防止对该 set 进行意外的不同步访问:

  • HashSet():通过HashMap构建一个默认空间大小的一个集合
  • HashSet(int initialCapacity):设置默认的空间大小。hashmap中,对于空间大小的设置如果没有参数就会设置16,如果有参数,就会使用2n次幂计算出来当前传入参数的更大的一值
    • HashSet(int initialCapacity, float loadFactor):设置默认的空间大小,loadFactor负载因子,该
    • 负载因子的作用是判断当前容器的空间大小,当使用initialCapacity*loadFactor就会计算出需要 扩容的阈值。

 2.4TreeSet----------线程不安全

  • 特点: TreeSet元素不重复
  • 能够自定义元素的顺序,前提对象必须实现
  • java.lang.Comparable接口
  • 线程不安全
  • 基于 TreeMapNavigableSet 实现。使用元素的自然顺序对元素进行排序,或者根据创建 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 大致相同。)

  • 特点:使用KV形式存储
  • 线程不安全,容易出现线程并发问题
  • 能够使用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

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值