浅谈Java集合框架

集合框架最大的作用就是维护一组类型同样的对象。

仅仅是不同的类有不同的行为和性能。通常关注下面这些行为:

  • 是否能存放反复的元素
  • 遍历的顺序是如何的
  • 是否支持多线程

以下首先介绍集合的经常使用,随后依据每种行为分别进行讨论。

经常使用操作

经常使用的操作一般就是添加删除查询。经常使用的添加操作有add、addAll,经常使用的删除操作有remove、removeAll。经常使用的读取操作有contains、get、indexOf,还能够通过迭代器进行遍历。说这些比較抽象,以下就用代码举个样例吧。


import java.util.LinkedList;


public class Main {
    public static void main(){
        LinkedList<Integer> list = new LinkedList<Integer>();
        
        // 添加三个元素
        list.add(1);
        list.add(2);
        list.add(3);
        
        // 删除一个元素
        list.remove(2);
        
        // 输出list中全部的元素
        for(int e:list) {
            System.out.println(e);
        }
    }
}

这个程序最后输出的结果例如以下:

1
3

以上就是集合框架最简单的样例。尽管简单,可是平时编码的时候常常会用到。

反复值

除了Set和Map。其余的类都支持反复元素。

对于Map。针对的是它的Key,也就是说它的Key不能反复,而Value随便怎样取值对能够,就不在讨论范围了。


遍历的顺序

遍历的顺序是各种集合之间最大的差别。

遍历的顺序一般有三种:依照插入顺序进行遍历、依照compareTo结果进行遍历、无序遍历。


依照插入顺序进行遍历的类有List、Vector、Stack、Queue、Deque、LinkedHashMap。当中Stack的遍历顺序和插入的顺序是相反的。Deque是Stack和Queue合体。两种顺序都支持,并且性能更快。




依照compareTo结果进行遍历的类有SortedMap、TreeMap、SortedSet、PriorityQueue。




无序遍历的类有:HashMap、Set、Hashtable。


多线程

仅仅有早期版本号的集合类支持多线程,后来发现多线程不关集合框架的事,后来出现的类就都不支持多线程了。




所以。在Java的集合框架中,支持多线程的类仅仅有三个:Stack、Vector、Hashtable,这些都是早期的类,接口设计不良,性能一般,所以在新的project中一般不再使用。


除了这三个类。其它的类都不支持多线程。

假设确实须要用到多线程。能够调用path{Collections.synchronizedMap}或者path {Collections.synchronizedSet}让对象支持对线程。




算法细节

不同的类採用了不同的算法,整体上使用了链表、数组、哈希表、红黑树、堆这几种算法。以下都是我阅读了OpenJDK的源代码之后总结出来的。


使用链表进行实现的类有:LinkedList、HashMap、Hashtable。


使用数组实现的类有:ArrayList、Deque、Stack、Vector。


使用哈希表进行实现的类有:HashMap、HashSet、Hashtable、LinkedHashMap、LinkedHashSet、WeakHashMap。


使用红黑树实现的类有:TreeMap。




使用堆实现的类有:PriorityQueue。

原文地址:https://www.cnblogs.com/lxjshuju/p/7025746.html