Java容器(一)

时间:2019-08-18
本文章向大家介绍Java容器(一),主要包括Java容器(一)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

容器主要包括 Collection 和 Map 两种,Collection 又包含了 List、Set 以及 Queue。

1. List

  • ArrayList:基于动态数组实现,支持随机访问;

    • ArrayList 是基于数组实现的
    • 添加元素时使用 ensureCapacity() 方法来保证容量足够,如果不够时,需要进行扩容,使得新容量为旧容量的 1.5 倍。
    • Vector 和 ArrayList 几乎是完全相同的,唯一的区别在于 Vector 是同步的,因此开销就比 ArrayList 要大,访问要慢。最好使用 ArrayList 而不是 Vector,因为同步完全可以由程序员自己来控制;
    • Vector 每次扩容请求其大小的 2 倍空间,而 ArrayList 是 1.5 倍。
    • 为了使用线程安全的 ArrayList,可以使用 Collections.synchronizedList(new ArrayList<>()); 返回一个线程安全的 ArrayList,也可以使用 concurrent 并发包下的 CopyOnWriteArrayList 类;
  • LinkedList:基于双向循环链表实现,只能顺序访问,但是可以快速地在链表中间插入和删除元素。不仅如此,LinkedList 还可以用作栈、队列和双端队列。

    • LinkedList 基于双向循环链表实现;
    • ArrayList 支持随机访问,LinkedList 不支持;
    • LinkedList 在任意位置添加删除元素更快。

2. Set

  • HashSet:基于 Hash 实现,支持快速查找,但是失去有序性;

  • TreeSet:基于红黑树实现,保持有序,但是查找效率不如 HashSet;

  • LinkedListHashSet:具有 HashSet 的查找效率,且内部使用链表维护元素的插入顺序,因此具有有序性。

3. Queue

只有两个实现:LinkedList 和 PriorityQueue,其中 LinkedList 支持双向队列,PriorityQueue 是基于堆结构实现。

4. Map

  • HashMap:基于 Hash 实现

    • HashMap map = new HashMap();//底层创建了长度为 16 的 Entry 数组向 HashMap 中添加 entry1(key,value),需要首先计算 entry1 中 key 的哈希值(根据 key 所在类的 hashCode()计算得到),此哈希值经过处理以后,得到在底层 Entry[]数组中要存储的位置 i.如果位置 i 上没有元素,则 entry1 直接添加成功。如果位置 i 上已经存在 entry2(或还有链表存在的 entry3,entry4),则需要通过循环的方法,依次比较 entry1 中 key 和其他的 entry 是否 equals.如果返回值为 true.则使用 entry1 的 value 去替换 equals 为 true 的 entry 的 value.如果遍历一遍以后,发现所有的 equals 返回都为 false,则 entry1 仍可添加成功。entry1 指向原有的 entry 元素。
  • LinkedHashMap:使用链表来维护元素的顺序,顺序为插入顺序或者最近最少使用(LRU)顺序

  • TreeMap:基于红黑树实现

  • ConcurrentHashMap:线程安全 Map,不涉及类似于 HashTable 的同步加锁

5. Java 1.0/1.1 容器

对于旧的容器,我们决不应该使用它们,只需要对它们进行了解。

  • Vector:和 ArrayList 类似,但它是线程安全的

  • HashTable:和 HashMap 类似,但它是线程安全的

原文地址:https://www.cnblogs.com/noperx/p/11373125.html