浅谈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,这些都是早期的类,接口设计不良,性能一般,所以在新的工程中一般不再使用。


除了这三个类,其他的类都不支持多线程。如果确实需要用到多线程,可以调用\path{Collections.synchronizedMap}或者\path {Collections.synchronizedSet}让对象支持对线程。


算法细节

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


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


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


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


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


使用堆实现的类有:PriorityQueue。

浅谈Java集合框架,布布扣,bubuko.com

浅谈Java集合框架

上一篇:javascript---BOM


下一篇:m2014_c->c语言容器类工具列