Java容器

常用容器:
Java容器

Collection、Collections区别

  • java.util.Collection 是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List与Set。
  • Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。

List、Set、Map区别

比较 List Set Map
继承接口 Collection Collection
实现类 ArrayList、LinkedList、Vector HashSet、LinkedHashSet、TreeSet HashMap、HashTable、TreeMap
元素 可重复 不可重复 键不可重复
顺序 有序 无序(实际上由hashcode决定)(LinkedHashSet是有序的) 无序(LinkedHashMap是有序的)
线程安全 Vector线程安全 HashTable线程安全

HashMap与HashTable

区别

  • HashTable是同步的。HashMap是非同步的,效率上比HashTable高。
  • HashMap允许空键空值,HashTable不允许

HashMap详解

结点:

  • 每个node结点存储:定位数据索引位置的hash值keyvalue、指向下一个结点的Node<key,value> next

数据结构:

  • HashMap的底层是哈希表,HashMap是“链表散列”的数据结构,即数组和链表的结合体。jdk1.8以后,又加入了红黑树的数据结构。其中,数组部分称为“哈希桶”。
  • 向HashMap中插入数据时,首先计算数据的 key 的hashcode,得到一个值,将该值右移十六位得到高十六位哈希值,再将其与原来低十六位值进行异或运算,得到一个新值。将新值与(table.length-1)进行与运算,得到待插入值的下标。然后查看HashMap该下标处,如果还没有值则直接插入新值,如果已经有值了就连接形成链表。
  • 当链表中元素的个数达到8个,转化为红黑树形式进行存储,此时查询的时间复杂度由O(n)变为O(logn);当红黑树中元素下降为6时,又转化成链表。

重要参数:

  • 负载因子 LoadFactor,默认值0.75
  • 容纳键值对临界值 threshold = 数组长度*负载因子
  • 默认容量,为16
  • 最大容量

HashTable详解

  • HashTable 底层由 HashMap 实现
  • HashSet的值存放于HashMap的key上,此时HashMap的值统一为PRESENT

ArrayList、Vector区别

  • Vector是同步的。ArrayList是非同步的,快于Vector。
  • ArrayList更加通用

Array、ArrayList区别

  • array 是本地的程序设计组件或者数据结构,ArrayList是一个来自Java集合类的类。实际上,ArrayList 的内部是由一个array实现的。
  • Array可以容纳基本类型和对象,而ArrayList只能容纳对象。
  • Array是固定大小的,而ArrayList大小是可变的。
  • Array没有提供ArrayList那么多功能,比如addAll、removeAll 和 iterator 等。

Queue中 poll() 和 remove() 的区别

poll() 和 remove() 都是从队列中取出一个元素,但是 poll() 在获取元素失败的时候会返回空,remove() 失败的时候会抛出异常。

线程安全的集合

  • Vector:几乎在每个方法上都加了synchronized同步锁,效率较低,已经不建议使用
  • HashTable:几乎在每个方法上都加了synchronized同步锁,效率较低,已经不建议使用
  • Stack
  • Enumeration:枚举,是迭代器的早期版本