Java Collections Framework概览

本文github地址

概览

容器,就是可包容其他Java对象的目标。Java Collections
Framework(JCF)
为Java开发者提供了通用的容器,其始于JDK 1.2,优点是:

  • 降落编程难度
  • 增进程序性能
  • 增长API间的互操作性
  • 落学习难度
  • 落设计和兑现相关API的难度
  • 加程序的重用性

Java容器里只能放对象,对于核心类型(int, long, float,
double等),需要拿其卷入成靶子类型后(Integer, Long, Float,
Double等)才能够放容器里。很多辰光拆包装和解包装能够自行完成。这则会招致额外的属性和空间开发,但简化了计划和编程。

泛型(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++容器的复制拷贝问题。

接口及贯彻(Interfaces and Implementations)

接口

以规范容器的作为,统一设计,JCF定义了14种植容器接口(collection
interfaces),它们的干如下图所示:
图片 1
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

联网下去的篇幅,会挨个介绍及说明中容器的数据结构以及用的算法。

迭代器(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循环,简化了迭代容器时的写法。

//使用增强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底源码,下载地址。此间复制了同一份。

参考文献

  • Collections Framework
    Overview
  • The For-Each
    Loop

相关文章