chapter11 -- 持有对象(概念)

基本内容

  • 容器
  • 泛型
  • 迭代器

1.容器

Java中的容器用途是“保存对象”。

Java中将容器分为两大类:Collection和Map。
Collection:一个独立元素的序列,这些元素都服从一条或多条规则。
Map:一组成对的“键值对”对象,允许你使用键来查找对象。

在这两大类容器下面又划分了很多小类。我们先通过一张图看一下

图中基本上包含了全部的容器类型,但是我们常用的不多,主要是ArrayList,LinkedList,HashMap以及HashSet这四种。

关于常用容器的特点,我准备了另外一篇文章【CoreJava】常用容器。

2.泛型

说到容器就必须要提一下泛型了,泛型存在的目的是防止在容器中添加了错误的类型。
如果我们有一个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{

}

3.迭代器(Iterator)

迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。

迭代器的基础功能:

  • Iterator只能单向移动
  • Iterator使用next()方法获取下一个元素,如果是第一次使用,则获取第一个元素。
  • Iterator使用hasNext()方法检查序列中是否还有元素。
  • Iterator使用remove()方法删除迭代器返回的元素。
    我们用一个例子说明Iterator的基本功能。
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的元素删除。

3.1.ListIterator

ListIterator是Iterator的一个子类,只能用于List及实现List接口的类的访问,但是功能更加强大。

ListIterator的相对于Iterator的特殊功能:

  • ListIterator拥有hasPrevious()和previous()方法,可实现倒序遍历。
  • ListIterator拥有nextIndex()方法和previousIndex()方法,可以获取下一个或上一个索引位置。
  • ListIterator拥有set()方法,可以对当前位置的元素对象进行修改。
  • ListIterator拥有add()方法,可以向List中添加元素。
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) + ")" + "  ");
    }
}

注意:

  • 我们在获取索引位置的时候分别-1和+1。这是因为我们使用next()或previous()获取元素后,ListIterator已经向后移动一位了,此时获取的是下一个元素的下标。
  • 我们在使用hasPrevious方法遍历的时候,一定要注意此时索引的位置,只有索引大于等于0的时候才能倒序遍历。

欢迎关注个人公众号,搜索:公子照谏或者QCzhaojian
也可以通过扫描二维码关注。

chapter11 -- 持有对象(概念)_第1张图片

你可能感兴趣的:(《Thinking,in,Java》读书笔记,java,迭代器,泛型,容器)