集合类是Java中很重要的一个知识点,它是一个容器,可以存储各种引用数据类型的对象。那么同样是容器的数组,跟集合类比较起来有什么区别呢?首先,数组一旦创建,长度也就确定了。而往集合类里面添加对象,那么集合类的容量是可变的;再者,数组可以存储基本数据类型,而集合类只能存对象;最后,集合类可以存储不同类型的对象,而数组只能存相同类型的。
集合类的框架是很庞大的,不过其中有很多类是用于特定的场合的(很少用到),我们经常使用的集合类体系如下图:
可以看到它的体系还是很庞大的。在Collection的这些实现类中,每一种集合类内部都有其自己存放对象的规则。学习一个庞大的体系的要点就是学顶层,用底层。在图片中可以看到,Collection是所有集合类的一个顶层接口,所以它的里面已经定义了一些集合类共有的方法:
-
添加
boolean add(E e)
boolean addAll(Collection<? extends E> c) -
删除
boolean remove(Object o)
boolean removeAll(Collection<?> c)
void clear() //全部清除 -
判断
boolean contains(Object o) //如果此 collection 包含指定的元素,则返回 true
boolean containsAll(Collection<?> c) //如果此 collection 包含指定 collection 中的所有元素,则返回 true -
获取
int size() //返回此 collection 中的元素数
Iterator iterator() //返回在此 collection 的元素上进行迭代的迭代器 -
其他
boolean retainAll(Collection<?> c) //取交集
Object[] toArray() //返回包含此 collection 中所有元素的数组
这里面值得一提的是iterator方法,它返回的是一个迭代器对象。迭代器的作用是取出容器中的对象,其使用方法如下(例子里面使用的实现类是ArrayList):
Collection<String> coll = new ArrayList<>();
coll.add("hahaha");
coll.add("hehehe");
coll.add("xixixi");
//方法1
/*Iterator<String> it = al.iterator();
while(it.hasNext()) {
String str = it.next();
System.out.println(str);
}*/
//方法2
for(Iterator<String> it = al.iterator(); it.hasNext(); ) {
String str = it.next();
System.out.println(str);
}
可以看到有两种方法取出容器中的对象,方法2的好处就是for循环结束之后,迭代器对象it内存就会马上被释放,所以在开发中建议使用这种方法。
上面提到过,每一种容器存放对象的规则都是不同的,所以从容器中取对象也要根据不同的容器使用相应的方法。Iterator接口就是对所有的容器进行元素取出的公共接口,每一个具体的集合类都有一个内部类实现了这个接口,而每个集合类实现了Collection接口定义的iterator方法来获取到这个内部类的对象。对于我们开发者来说,Iterator的具体实现并不重要,只要通过容器获取到实现Iterator接口的对象即可。