集合概述

Java中的集合概述

1. 概述

Java中的集合主要有两种:

  1. Collection
  2. Map

集合的本质是用来存储批量的对象。

2. Collection接口

Collection 类是一个接口类,定义了集合中最基本的常用方法。

继承了Collection的接口类有:

  • List
  • Set
  • Queue

实现了Collection的抽象类有:

  • AbstractCollection

AbstractCollection衍生了两个子抽象类,分别是:

  • AbstractList
  • AbstractSet

图示如下:

img

我们主要还是关注下具体的实现类吧。

2.1 List

List接口有四个实现类

  • LinkedList
  • ArrayList
  • Vector
  • Stack(Vector的子类)

2.1.1 LinkedList

  1. 基于双向链表实现
  2. 支持任意性的访问,便于插入和删除,不便于遍历
  3. 非线程安全(即支持多个线程并发读取)

2.1.2 ArrayList

  1. 基于数组实现
  2. 初始容量是10,快要溢出时会进行动态扩容(1.5倍扩容)
  3. 支持任意性的访问(根据索引)
  4. 非线程安全(即支持多个线程并发读取)

2.1.3 Vector(基本不使用,被ArrayList取代)

  1. 基于数组实现
  2. 支持任意性的访问(根据索引)
  3. 线程安全(同一时刻,只能有一个线程读取Vector)

2.1.4 Stack

  1. 继承于Vector
  2. 实现了数据结构中后进先出的堆栈
  3. 主要方法有:
    • push()// 添加元素到栈顶
    • pop()//删除栈顶的元素
    • peek() 获取栈顶元素
    • empty() 判断是否为空

2.2 Set

Set是元素不可重复根据元素的hashCode()和equals()方法来判断两个元素是否相同)的集合,允许null的存在,但仅能存在一个(因为set的元素不能重复);不支持随机访问( 无序), 虽然Set中元素没有顺序,但是元素在set中的位置是由该元素的HashCode决定的,其具体位置其实是固定的。

2.2.1 HashSet

  1. 元素不可重复
  2. 底层是HashMap,存储的key是插入的元素,value是一个Object
  3. 非同步(线程不安全)
  4. 不保证插入顺序和读取顺序一致

2.2.2 LinkedHashSet

  1. 继承于HashSet
  2. 底层是LinkedHashMap
  3. 有序(链表维护顺序),
  4. 非同步(线程不安全)

2.2.3 TreeSet

  1. 有序
  2. 底层是TreeMap
  3. 非同步(线程不安全)
  4. 通过compare或者comparaeTo函数来判断元素是否相等

3. Map接口

Map没有继承Collection,是多个键值对元素组成的集合,提供了键(key)到值(value)的映射,key不可重复

3.1 HashMap

  1. 以哈希表的数据结构(数组+链表)实现,查找对象时通过哈希函数计算其位置,查询效率高
  2. 内部定义有hash表数组,通过哈希函数将元素(键值对)的哈希地址,转换为hash表数组的索引(下标)
  3. 如果有两个元素计算出来的索引值相同,则用链表的数据结构将两个元素串起来,此时,两个元素的hash值相同
  4. 线程不安全
  5. 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。

3.2 HashTable

  1. 线程安全版的HashMap,一般用于多线程中
  2. 键值都不允许为null
  3. 继承于Dictionary,实现了Map、Cloneable、java.io.Serializable接口

3.3 LinkedHashMap

  1. 继承于HashMap
  2. 通过链表的数据结构( 双链表 )来保证读取顺序和插入顺序一致
  3. 非线程安全

3.4 TreeMap

  1. 有序
  2. 非线程安全
  3. 基于红黑树实现
  4. 每一个key-value节点作为红黑树的一个节点。TreeMap存储时会进行排序
  5. 其中排序方式也是分为两种,一种是自然排序,一种是定制排序
    • 自然排序: TreeMap中所有的key必须实现Comparable接口,并且所有的key都应该是同一个类的对象,否则会报ClassCastException异常。
    • 定制排序: 定义TreeMap时,创建一个comparator对象,该对象对所有的treeMap中所有的key值进行排序,采用定制排序的时候不需要TreeMap中所有的key必须实现Comparable接口
  6. 判断元素相等的依据: 两个key通过compareTo()方法返回0,则认为这两个key相等。

3.5 WeakHashMap

  1. 继承于AbstractMap
  2. 键和值都可以是null
  3. 键是”弱键“
  4. 线程不安全
  5. 数据结构是哈希表(还有单项链表)
posted @ 2020-05-20 14:51  ws_hawk  阅读(233)  评论(0编辑  收藏  举报