Java Collections Framework概览

本文github地址html

概览

容器,就是能够容纳其余Java对象的对象。Java Collections Framework(JCF)为Java开发者提供了通用的容器,其始于JDK 1.2,优势是:java

  • 下降编程难度
  • 提升程序性能
  • 提升API间的互操做性
  • 下降学习难度
  • 下降设计和实现相关API的难度
  • 增长程序的重用性

Java容器里只能放对象,对于基本类型(int, long, float, double等),须要将其包装成对象类型后(Integer, Long, Float, Double等)才能放到容器里。不少时候拆包装和解包装可以自动完成。这虽然会致使额外的性能和空间开销,但简化了设计和编程。git

泛型(Generics)

Java容器可以容纳任何类型的对象,这一点表面上是经过泛型机制完成,Java泛型不是什么神奇的东西,只是编译器为咱们提供的一个“语法糖”,泛型自己并不须要Java虚拟机的支持,只须要在编译阶段作一下简单的字符串替换便可。实质上Java的单继承机制才是保证这一特性的根本,由于全部的对象都是Object的子类,容器里只要可以存放Object对象就好了。
事实上,全部容器的内部存放的都是Object对象,泛型机制只是简化了编程,由编译器自动帮咱们完成了强制类型转换而已。JDK 1.4以及以前版本不支持泛型,类型转换须要程序员显式完成。程序员

//JDK 1.4 or before
ArrayList list = new ArrayList();
list.add(new String("Monday"));
list.add(new String("Tuesday"));
list.add(new String("Wensday"));
for(int i = 0; i < list.size(); i++){
    String weekday = (String)list.get(i);//显式类型转换
    System.out.println(weekday.toUpperCase());
}
//JDK 1.5 or latter
ArrayList<String> list = new ArrayList<String>();//参数化类型
list.add(new String("Monday"));
list.add(new String("Tuesday"));
list.add(new String("Wensday"));
for(int i = 0; i < list.size(); i++){
    String weekday = list.get(i);//隐式类型转换,编译器自动完成
    System.out.println(weekday.toUpperCase());
}

内存管理

跟C++复杂的内存管理机制不一样,Java GC自动包揽了一切,Java程序并不须要处理使人头疼的内存问题,所以JCF并不像C++ STL那样须要专门的空间适配器(alloctor)。
另外,因为Java里对象都在堆上,且对象只能经过引用(reference,跟C++中的引用不是同一个概念,能够理解成通过包装后的指针)访问,容器里放的实际上是对象的引用而不是对象自己,也就不存在C++容器的复制拷贝问题。github

接口和实现(Interfaces and Implementations)

接口

为了规范容器的行为,统一设计,JCF定义了14种容器接口(collection interfaces),它们的关系以下图所示:
pic
Map接口没有继承自Collection接口,由于Map表示的是关联式容器而不是集合。但Java为咱们提供了从Map转换到Collection的方法,能够方便的将Map切换到集合视图。
上图中提供了Queue接口,却没有Stack,这是由于Stack的功能已被JDK 1.6引入的Deque取代。算法

实现

上述接口的通用实现见下表:
编程

Implementations
Hash Table Resizable Array Balanced Tree Linked List Hash Table + Linked List
Interfaces Set HashSet TreeSet LinkedHashSet
List ArrayList LinkedList
Deque ArrayDeque LinkedList
Map HashMap TreeMap LinkedHashMap

接下来的篇幅,会逐个介绍上表中容器的数据结构以及用到的算法。markdown

迭代器(Iterator)

跟C++ STL同样,JCF的迭代器(Iterator)为咱们提供了遍历容器中元素的方法。只有容器自己清楚容器里元素的组织方式,所以迭代器只能经过容器自己获得。每一个容器都会经过内部类的形式实现本身的迭代器。相比STL的迭代器,JCF的迭代器更容易使用。数据结构

//visit a list with iterator
ArrayList<String> list = new ArrayList<String>();
list.add(new String("Monday"));
list.add(new String("Tuesday"));
list.add(new String("Wensday"));
Iterator<String> it = list.iterator();//获得迭代器
while(it.hasNext()){
    String weekday = it.next();//访问元素
    System.out.println(weekday.toUpperCase());
}

JDK 1.5 引入了加强的for循环,简化了迭代容器时的写法。oracle

//使用加强for迭代
ArrayList<String> list = new ArrayList<String>();
list.add(new String("Monday"));
list.add(new String("Tuesday"));
list.add(new String("Wensday"));
for(String weekday : list){//enhanced for statement
    System.out.println(weekday.toUpperCase());
}

源代码

JDK安装目录下的src.zip包含了Java core API的源代码,本文采用的是JDK 1.7u79的源码,下载地址这里复制了一份

参考文献

相关文章
相关标签/搜索