java中的List、Set、Queue、Map接口

Java集合类对象是用来封装数据的基本。
常见的集合接口有List、Set、Queue、Map。这里也只是介绍这几种接口中的常用实现类。
各接口与实现类之间的关系如下图(虚线框代表接口,实线框代表接口的实现类)。
在这里插入图片描述
在这里插入图片描述
List接口的常用实现类:ArrayList、LinkedList、Vector。

  • ArrayList 底层使用的数据结构是数组,一般数组初始化长度为10,当容量不够时,使用Arrays.copyOf() 方法对数组进行扩容、元素复制,扩容后的容量是之前容量的1.5倍。

  • LinkedList 底层使用的数据结构是链表,因此增删的效率高于ArrayList,但是查询效率低于ArrayList。

  • Vector 与ArrayList类似,但是Vector是线程安全的,因为Vector中方法都是被 synchronize 修饰,多线程情况下是同步执行的。
    Stack 类继承了 Vector 类,实现了栈的数据结构,同时也是线程安全

PS 线程安全:指的是多线程对数据进行操作时,不会出现数据错误。线程不安全的例子,线程 A 向 list 中第一个位置添加元素 one,还没有来得及对 size 进行 + 1 而CPU时间到了,线程 B 向 list 中添加一个元素 two ,由于 size 等于0,two只能添加在 list 的第一个位置,所以two 元素会覆盖掉one,之后线程 A 、B 都对size 做 +1 操作,size就成 2 了,这与 list 中只有一个元素不符,出现了数据错误。

Set接口的常用实现类:HashSet、TreeSet。 元素是唯一的,不能有重复元素但是允许null值,通过 key 的 hashCode(equals() 方法)来判断元素是否重复。

  • HashSet 通过HashMap实现的,底层数据结构是数组(散列表),对 HashMap 中key-value 的 key 进行散列。
  • TreeSet 通过TreeMap实现的,底层数据结构是红黑树,对 TreeMap 中key-value 的 key 进行散列,存入的元素是有序的。

Queue的子接口为Deque接口的常用实现类:ArrayDeque、LinkedList。

  • ArrayDeque 底层是有首位指针的数组,是一个双端队列(可以对两端进行添加与删除操作),因此可以实现栈的数据结构(对一端进行增删,即可达到先进后出的效果),常用方法:deque.addLast(Object object) 与 deque.pollLast();

  • LinkedList。 底层实现是链表,当它实现 Deque 接口时(它也可以实现 List 接口)就是一个队列,先进先出、后进后出,常用方法:linkedList.add(Object object) 与 linkedList.poll()。

Map接口的常用实现类:HashMap、TreeMap 实现 key-value 的映射。

  • HashMap 底层数据结构是数组(哈希表)。
  • TreeMap 底层数据结构是红黑树,有序的。
    也可以通过自定义排序方式进行排序。实现方法:使数据模型类实现Comparable 接口中只提供了一个方法: int compareTo(Object obj) ,该方法的返回值是 int 。如果返回值为正数,则表示当前对象(调用该方法的对象)比 obj 对象“大”;反之“小”;如果为零的话,则表示两对象相等。下面是一个实现了 Comparable 接口的 Student 类:

常用方法总结
多数集合接口的实现类都用remove()进行删除元素,但是Stack使用pop(), Deque使用pollLast()/pollFirst。
实现Collection接口的下List,Set,Queue接口的实现类使用add(Object obj)添加元素,但是Deque使用addFirst()/addLast(),Stack使用push()。
实现Map接口的现实类使用put(Object k, Object v)添加元素,使用map.get(Object key)取出元素。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章