Java的容器
在Java中,我们想要保存对象可以使用很多种手段。最简单的就是数组。但是数组具有固定的尺寸,而通常来说,程序总是在运行时根据条件来创建对象,我们无法预知将要创建对象的个数以及类型,所以Java推出了容器类来解决这一问题。
Java的容器类分为List,Set,Queue和Map。
Java容器的基本概念
Java容器类库是用来保存对象的,他有两种不同的概念:
- Collection,独立元素的序列,这些元素都服从一条或多条规则。List、Set以及Queue都是Collection的一种,List必须按照顺序保存元素,而Set不能有重复元素,Queue需要按照排队规则来确定对象的顺序。
- Map,Map是键值对类型,允许用户通过键来查找对象。Hash表允许我们使用另一个对象来查找某个对象。
Collection接口
尽管存在这两种概念,我们在工程中,大部分代码还是和接口打交道。Collection是最基本的集合接口。一个Collection代表一组Object,即Collection的元素(Elements)。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”。ArrayList,HashSet等具体类均实现了Collection接口或Collection接口的子接口(List接口和Set接口等)。所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个 Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。
Java使用泛型来实现容器类,例如我们要使用顺序表这一数据结构,Java提供了ArrayList和LinkedList两种实现类,ArrayList的实现就是基于数组的。比如我们要存储一组用户,在Java8之前的版本,我们就可以这样声明对象:List<User> users = new ArrayList<User>();。然后通过add方法来添加变量。
迭代器
从之前的Collection接口中可以看出,任何容器类,都可以以某种方式插入、获取和删除元素。add()作为最基本的插入元素方法而get()则是基本取元素的方法。
但是如果我们仅仅使用get和add方法来进行元素操作,如果将一个类的方法实现了,如果想要将相同的代码用在其他容器类中就会遇到问题,那么我们如何解决这一问题呢?
在这里我们就引入了面向对象的设计模式迭代器模式。迭代器是一个对象,它的工作是遍历并选择序列中的对象。客户端不需要知道序列的底层架构。
Java的Iterator的定义如下:
public interface Iterator<E> {
boolean hasNext();
E next();
void remove();
}
我们可以使用:
- next()方法来获取序列的下一个元素。
- hasNext()检查序列中是否还有元素。
- 使用remove()将迭代器新近返回的元素删除。比如我们要遍历一个容器:
List<String> keywords = new ArrayList<>();
keywords.add("hello");
keywords.add(0, "thank");
Iterator<String> iterator = keywords.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
当然也可以使用foreach语法进行遍历:
List<String> keywords = new ArrayList<>();
keywords.add("hello");
keywords.add(0, "thank");
for (String keyword : keywords) {
System.out.println(iterator.next());
}
Iterator还有一些功能更为强大的子类型,我们会在下文予以介绍。
参考:
http://blog.csdn.net/u014136713/article/details/52089156
https://www.tianmaying.com/tutorial/java_collection
我们可以使用:
- next()方法来获取序列的下一个元素。
- hasNext()检查序列中是否还有元素。
- 使用remove()将迭代器新近返回的元素删除。比如我们要遍历一个容器:
List<String> keywords = new ArrayList<>();keywords.add("hello");keywords.add(0, "thank");Iterator<String> iterator = keywords.iterator();while (iterator.hasNext()) { System.out.println(iterator.next());}
当然也可以使用foreach语法进行遍历:
List<String> keywords = new ArrayList<>();keywords.add("hello");keywords.add(0, "thank");for (String keyword : keywords) { System.out.println(iterator.next());}
Iterator还有一些功能更为强大的子类型,我们会在下文予以介绍。