美文网首页
集合总览

集合总览

作者: 奔向学霸的路上 | 来源:发表于2020-04-16 16:58 被阅读0次

概览

容器,就是可以容纳其他Java对象的对象。Java Collections Framework(JCF)为Java开发者提供了通用的容器,其始于JDK1.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那样需要专门的空间适配器。另外,由于对象在堆上,且对象只能通过引用(reference,跟C++中的引用不是同一个概率,可以理解成经过包装后的指针)访问,容器里放的其实是对象的引用而不是对象本身,也就不存在C++容器的复制拷贝问题。

接口和实现

接口

为了规范容器的行为,统一设计,JCF定义了14中容器接口(collection interface),它们的关系如下图所示:


image.png

Map接口没有继承自Collection接口,因为Map表示的是关联式容器而不是集合,但Java为我们提供了从Map转换到Collection的方法,可以方便的将Map切换到集合视图。上图中提供了Queue接口,却没有Stack,这是因为Stack的功能已被JDK 1.6引入的Deque取代。

实现

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


image.png

迭代器

JCF的迭代器为我们提供了遍历容器中元素的方法。只有容器本身清楚容器里元素的组织方式,因此迭代器只能通过容器本身得到。每个容器会通过内部类的形式实现自己的迭代器。

        ArrayList<String> list = new ArrayList<>();
        list.add("Monday");
        list.add("Tuesday");
        list.add("Wensday");
        Iterator iterable = list.iterator();
        while (iterable.hasNext()){
            System.out.println(iterable.next());
        }

JDK1.5引入了增加的for循环,简化了迭代容器时的写法。
注意删除元素时,必须调用Iterator的remove()方法,而不能调用Collection的remove()方法。

原文链接:https://github.com/CarpenterLee/JCFInternals/blob/master/markdown/1-Overview.md
https://docs.oracle.com/javase/6/docs/technotes/guides/collections/overview.html

相关文章

网友评论

      本文标题:集合总览

      本文链接:https://www.haomeiwen.com/subject/hqirvhtx.html