Java编程思想——第十一章

来源:互联网 发布:飞跃淘宝数据采集软件 编辑:程序博客网 时间:2024/05/18 11:19
容器:容器就是可以装东西的一个器具,我们知道他的名字,这个名字的背后是一个不知道大小的容器,反正有方法可以操作这个这个名字,使容器中的内容变化,增删改查,我们不用在开始就指定容器大小,那不是我们的事了。
最基本最可靠的容器是ArrayList,当做可变大小数组对待吧。add()插入对象,get()访问对象,size()数容器对象个数。
ArrayList apples = new ArrayList();//@SuppressWarnings("unchecked")
ArrayList<Apple> apples = new ArrayList<Apple>();
apples.get(i)提取出一个对象。
其中上面的那个apples能装各种类型的对象,都被转型成为Object,而下面的那个只能装<Apple>的对象。否则在编译过程中报错。

基本概念:
Collection:一个独立元素的序列,这些元素服从一条或多条规则。List必须按照插入的顺序保存元素,而Set不能有重复元素。Queue按照排队规则来确定对象产生的顺序。
Map:一组成对的“键值对”,允许你使用键来查找值。ArrayList允许你使用数字来查找值,将数字与对象关联在一起。映射表允许我们使用另一个对象来查找某个对象,它也称“关联数组”,因为他把某些对象与另一些对象关联在一起;或者被称为“字典”,因为你可以使用键对象来查找值对象。
由于经常与接口打交道,所以有时唯一一个需要制定所使用的精确类型的地方就是在创建的时候,例:
List<Apple> apples = new ArrayList<Apple>();
使用接口了,如果决定修改实现时,只需要在创建处改变它,例:
List<Apple> apples = new LinkedList<apple>();
但有时有问题,子类的方法在基类中没有接口,也就是说这是一个完全新写的方法,那么的话就不能向上转型。

Collection——一种存放一组对象的方式。

添加一组数据:
Collection<Integer> collection = new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4, 5)); 
//ArrayList.asList():接受一个数组或用逗号分隔的元素列表,并转换成List对象。
Integer[] moreInts = { 6, 7, 8, 9, 10 };
collection.addAll(Arrays.asList(moreInts));
//Collections.addAll():接受Collection对象,或数组或用逗号分隔的列表,将元素添加到Collection中。
Collections.addAll(collection, 11, 12, 13, 14, 15);
Collections.addAll(collection, moreInts);
List<Integer> list = Arrays.asList(16, 17, 18, 19, 20);
Collection的构造器可以接受另一个Collection,因此你可以用其将自身初始化,因此可以使用ArrayList.List来为这个构造器产生输入。但Collection.addAll()方法运行起来要快得多,而且构建一个不包含元素的Collection,然后调用Collection.addAll()很方便,是首选方法。

Collection.addAll()成员方法只能接受另一个Collection对象作为参数,因此它不如Arrays.asList()或Collection.addAll灵活,这两个都使用可变参数列表。
也可以使用Arrays.asList()的输出,当作List,底层表示的是数组,不能调整尺寸。
class Snow {}
class Powder extends Snow {}
class Light extends Powder {}
class Heavy extends Powder {}
class Crusty extends Snow {}
class Slush extends Snow {}
public class AsListInference {
    public static void main(String[] args) {
        List<Snow> snow1 = Arrays.asList(
            new Crusty(), new Slush(), new Powder());
        // Won't compile:
        // List<Snow> snow2 = Arrays.asList(
        // new Light(), new Heavy());
        // Compiler says:
        // found : java.util.List<Powder>
        // required: java.util.List<Snow>
        // Collections.addAll() doesn't get confused:
        List<Snow> snow3 = new ArrayList<Snow>();
        Collections.addAll(snow3, new Light(), new Heavy());
        List<Snow> snow4 = Arrays.<Snow>asList(
             new Light(), new Heavy());
    }
}
Map除了用另一个Map初始化外,标准库没有提供自动初始化方法。

容器的打印:必须使用Arrays.toString()来产生数组的可打印表示,但是打印容器无需任何帮助。
import java.util.*;
public class PrintingContainers {
    static Collection fill(Collection<String> collection) {
        collection.add("rat");
        collection.add("cat");
        collection.add("dog");
        collection.add("dog");
        return collection;
    }
    static Map fill(Map<String,String> map) {
        map.put("rat", "Fuzzy");
        map.put("cat", "Rags");
        map.put("dog", "Bosco");
        map.put("dog", "Spot");
        return map;
    }
    public static void main(String[] args) {
        System.out.println(fill(new ArrayList<String>())); //被插入顺序
        System.out.println(fill(new LinkedList<String>())); //被插入顺序
        System.out.println(fill(new HashSet<String>())); //最快
        System.out.println(fill(new TreeSet<String>())); //升序
        System.out.println(fill(new LinkedHashSet<String>())); //被添加顺序

        System.out.println(fill(new HashMap<String,String>())); //最快,无序
        System.out.println(fill(new TreeMap<String,String>())); //升序
        System.out.println(fill(new LinkedHashMap<String,String>())); //快速,插入顺序
    }
}
/* Output:
[rat, cat, dog, dog]
[rat, cat, dog, dog]
[dog, cat, rat]
[cat, dog, rat]
[rat, cat, dog]
{dog=Spot, cat=Rags, rat=Fuzzy}
{cat=Rags, dog=Spot, rat=Fuzzy}
{rat=Fuzzy, cat=Rags, dog=Spot}
*///:~
Collection在每个槽中只能保存一个元素。List,以特定元素保存一组元素;Set,元素不能重复,Queue,只允许在容器的一端插入对象,并从另一端移除对象。Map在每个槽内保存两个对象,键与键值。

Collection打印出来的内容用方括号括住,每个元素由括号分隔。
Map用大括号括住,等号联系。map中每一个键只能接受一次。
map.put(key,value)添加一个值,并与某个键关联起来。map.put(key)产生与这个键相关联的值。map中不要主动调整大小。

0 0