Java中的容器用途是“保存对象”。
Java中将容器分为两大类:Collection和Map。
Collection:一个独立元素的序列,这些元素都服从一条或多条规则。
Map:一组成对的“键值对”对象,允许你使用键来查找对象。
在这两大类容器下面又划分了很多小类。我们先通过一张图看一下
图中基本上包含了全部的容器类型,但是我们常用的不多,主要是ArrayList,LinkedList,HashMap以及HashSet这四种。
关于常用容器的特点,我准备了另外一篇文章【CoreJava】常用容器。
说到容器就必须要提一下泛型了,泛型存在的目的是防止在容器中添加了错误的类型。
如果我们有一个intList是用来存放int类型的数据的,但是不小心放进去了一个String类型的数据。
Integer num = new Integer(1);
List intList = new ArrayList();
intList.add(num);
String str = "a";
intList.add(str);
如果是这种情况的话,程序在编译和运行的时候都不会报错(但是编译器会报警告,提示你没加泛型)。
但是当我们想取出intList中的元素的时候,我们会利索当然的认为是int类型,但是里面存放了一个String类型的,程序在这个时候就会抛出异常。
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
如何才能避免这种情况呢?除了编程的时候小心谨慎的添加元素外,我们还能使用泛型来控制添加到intList中元素的类型。
Integer num = new Integer(1);
List<Integer > intList = new ArrayList<Integer>();
intList.add(num);
这样在你使用向intList 中添加String类型的元素的时候,编译器就会产生错误,提示你添加了错误的类型。
同时使用泛型的另一个好处就是,在你从容器中取出元素的时候,不必再进行强制转换就可以直接使用了。
使用了泛型就一定只能在容器中添加一种类型的元素吗?当然不是。
向上转型也可以作用于泛型。
public class Demo {
public static void main(String[] args) {
List animalList = new ArrayList();
Cat cat = new Cat();
animalList.add(cat);
}
}
class Animal{
}
class Cat extends Animal{
}
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。
迭代器的基础功能:
public class IteratorDemo {
public static void main(String[] args) {
List list = new ArrayList();
list.add(new Integer(1));
list.add(new Integer(2));
list.add(new Integer(3));
Iterator iterator = list.iterator();
while(iterator.hasNext()) {
Integer num = iterator.next();
if(num.equals(3)) {
iterator.remove();
}else {
System.out.print(num + " ");
}
}
System.out.println();
System.out.println(list);
}
}
我们添加了3个Integer类型的元素到list中,使用Iterator遍历出3个元素,并将为3的元素删除。
ListIterator是Iterator的一个子类,只能用于List及实现List接口的类的访问,但是功能更加强大。
ListIterator的相对于Iterator的特殊功能:
public static void main(String[] args) {
List list = new ArrayList();
list.add(new Integer(1));
list.add(new Integer(2));
list.add(new Integer(3));
ListIterator listIterator = list.listIterator();
while (listIterator.hasNext()) {
Integer num = listIterator.next();
System.out.print(num + "(" + (listIterator.nextIndex() - 1) + ")" + " ");
}
System.out.println();
while (listIterator.hasPrevious()) {
Integer num = listIterator.previous();
System.out.print(num + "(" + (listIterator.previousIndex() + 1) + ")" + " ");
}
}
注意:
欢迎关注个人公众号,搜索:公子照谏或者QCzhaojian
也可以通过扫描二维码关注。