栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java集合

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java集合

集合

Java集合框架被设计成要满足以下几个目标。

  1. 该框架必须是高性能的。基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的。
  2. 该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性。
  3. 对一个集合的扩展和适应必须是简单的。

为此,整个集合框架就围绕一组标准接口而设计。你可以直接使用这些接口的标准实现,诸如: linkedList, HashSet, 和 TreeSet 等,除此之外你也可以通过这些接口实现自己的集合。

1.Java集合框架

从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、linkedList、HashSet、linkedHashSet、HashMap、linkedHashMap 等等。

集合框架是一个用来代表和操纵集合的统一架构。所有的集合框架都包含如下内容:

  • 接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象
  • 实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、linkedList、HashSet、HashMap。
  • 算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。

除了集合,该框架也定义了几个 Map 接口和类。Map 里存储的是键/值对。尽管 Map 不是集合,但是它们完全整合在集合中。

1.1将集合的接口与实现分离

与现代的数据结构类库的常见情况一样,Java集合类库也将接口(interface)与实现(implementation)分离。
比如队列(queue):队列接口指出可以在队列的尾部添加元素,在队列的头部删除元素,并且可以查找队列中元素的个数。当需要收集对象,并按照“先进先出”的规则检索对象时就应该使用队列。
队列接口的最简形式可能类似下面这样:

public interface Queue //a simlified form of the interface in the standard library
{
    void add(E element);
    E remove();
    int size();
}

这个接口并没有说明队列是如何实现的。队列通常有两种实现方式:一种是使用循环数组;另一种是使用链表。
每一个实现都可以通过一个实现了的Queue接口的类表示。

public class CircularArrayQueue implements Queue //not an actual library class
{
    private int head;
    private int tail;

    CircularArrayQueue(int capacity){...}
    public void add(E element){...}
    public E remove(){...}
    public int size(){...}
    private E[] elements;
}

public class linkedListQueue implements Queue//not actual library class
{
    private link head;
    private link tail;

    linkedListQueue(){...}
    public void add(E element){...}
    public E remove(){...}
    public int size(){...}
}

当在程序中使用队列时,一旦构建了集合就不需要知道究竟使用了哪种实现。因此,只有在构建集合对象时,使用具体的类才有意义。可以使用接口类型存放集合的引用。

Queue expressLane=new CircularArrayQueue<>(100);
expressLane.add(new Customer("Harry));

利用这种方法,一旦改变了想法,可以轻松地使用另外一种不同的实现。只需要对程序的一个地方做出修改,即调用构造器的地方。如果觉得linkedListQueue是个更好的选择,就将代码修改为:

Queue expressLane=new linkedListQueue();
expressLane.add(new Customer("Harry"));
1.2 Collection接口

在Java库中,集合类的基本接口是Collection接口。这个接口有两个基本方法:

public interface Collection
{
    boolean add(E element);
    Iterator iterator();
    ...
}
  • add方法用于向集合中添加元素。如果添加元素确实改变了集合就返回true,如果集合没有发生变化就返回false。例如,如果试图向集中添加一个对象,而这个对象在集中已经存在,这个添加请求就没有实效,因为集中不允许有重复的对象。
  • iterator方法用于返回一个实现了Iterator接口的对象。可以使用这个迭代器对象依次访问集合中的元素。
1.3 迭代器

Iterator接口包含4个方法:

public interface Iterator
{
    E next();
    boolean hasNext();
    void remove();
    default void forEachRemaining(Consumer action);
}

通过反复调用next方法,可以逐个访问集合中的每个元素。但是,如果到达了集合的末尾,next方法将抛出一个NoSuchElementException。因此,需要在调用next之前调用hasNext方法。如果迭代器对象还有多个供访问的元素,这个方法就返回true。如果想要查看集合中的所有元素,就请求一个迭代器,并在hasNext返回true时反复地调用next方法。例如:

Collection c=...;
Iterator iter=c.iterator();
while(iter.hasNext())
{
    String element=iter.next();
    //do something with element
}

用“for each”循环可以更加简练地表示同样的循环操作:

for(String element:c)
{
    //do something with element
}

for each循环可以与任何实现了Iterable接口的对象一起工作,这个接口只包含一个抽象方法:

public interface Iterable
{
    Iterable iterator();
    ...
}

Collection接口扩展了Iterable接口。因此,对于标准类库中的任何集合都可以使用for each循环。
JavaSE 8中,可以调用forEachRemaining方法并提供一个lambda表达式。将对迭代器的每一个元素调用这个lambda表达式,直到再没有元素为止。

iterator.forEachRemaining(element -> do something with element);

元素被访问的顺序取决于集合类。

2.具体的集合 3.映射 4.视图与包装器 5.算法 6.遗留的集合
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/354257.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号