0°

Java Collections Framework概览

内容预览:
  • Java Collections Framework(JCF)为Java开发者提供了通用的容器,其始...~
  • 接口和实现(Interfaces and Implementations) 接口 为了规范容器的行...~
  • 每个容器都会通过内部类的形式实现自己的迭代器~

始发于微信公众号: 程序员小乐

分享编程技能、互联网技术、生活感悟、打造干货分享平台,将总结的技术、心得、经验分享给大家,这里不只限于技术!还有职场心得、生活感悟、以及面经点击上方 “程序员小乐” ,选择“置顶公众号”,第一时间送达!


每日英文
Don’t hurry to say have you’v no choice, perhaps you will meet hope next intersection. 
不要急着说别无选择,也许,下个路口就会遇见希望。

乐乐有话说
“当你处于低潮期的时候,好好想想,就算现在攒不到钱,攒点知识,交情,经验,最不济攒点教训也行。”  

 一、概览


容器,就是可以容纳其他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),它们的关系如下图所示:

Java Collections Framework概览

Map接口没有继承自Collection接口,因为Map表示的是关联式容器而不是集合。但Java为我们提供了从Map转换到Collection的方法,可以方便的将Map切换到集合视图。

上图中提供了Queue接口,却没有Stack,这是因为Stack的功能已被JDK 1.6引入的Deque取代。

实现

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

Java Collections Framework概览

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

 四、迭代器(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的源码

http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html

 六、参考文献


  • Collections Framework Overview

  • The For-Each Loop

如果您觉得不错,请别忘了转发、分享、点赞让更多的人去学习, 您的举手之劳,就是对乐乐最好的支持,非常感谢!


如何您想进技术群和大牛们交流,关注公众号在后台回复 “加群”,或者 “学习” 即可

来自:CarpenterLee

链接:http://www.cnblogs.com/CarpenterLee

著作权归作者所有。本文已获得授权。欢迎投稿。

Java Collections Framework概览

推荐阅读


Java Collections Framework概览

看完本文有收获?请转发分享给更多人
关注「程序员小乐」,提升技能

以上就是:Java Collections Framework概览 的全部内容。

本站部分内容来源于互联网和用户投稿,如有侵权请联系我们删除,谢谢。
Email:[email protected]


0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论