Java容器的简单介绍

216 阅读4分钟

Java容器类类库的用途是”保存对象“,并将其划分为两个不同的概念

  1. Collection

    ​ 一个独立元素的序列,这些元素都服从一条或多条规则。List必须按照插入的顺序保存元素;而Set不能有重复元素;Queue按照排队规则来确定对象产生的顺序(通常与它们被插入的顺序相同)

  2. Map

    ​ 一组成对的“键值对”对象,允许你使用键来查找值。ArrayList允许你使用数字来查找值,因此在某种意义上讲,它将数字与对象关联在了一起。映射表允许我们使用另一个对象来查找某个对象,它也被称为“关联数组”,因为它将某些对象与另外一些对象关联在了一起;或者被称为“字典”,因为你可以使用键对象来查找值对象,就像在字典中使用单词来定义一样。Map是强大的编程工具。

package p10;

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>()));
    }
    /**
     * [rat, cat, dog, dog]
     * [rat, cat, dog, dog]
     * [rat, cat, dog]
     * [cat, dog, rat]
     * [rat, cat, dog]
     * {rat=Fuzzy, cat=Rags, dog=Spot}
     * {cat=Rags, dog=Spot, rat=Fuzzy}
     * {rat=Fuzzy, cat=Rags, dog=Spot}
     */
}

      这里展示了Java容器类库中的两种主要类型,它们的区别在于容器中每个“槽”保存的元素个数。Collection在每个槽中只能保存一个元素。此类容器包括:List,它以特定的顺序保存一组元素;Set,元素不能重复;Queue,之允许在容器的一“端”插入对象,并在另外一“端”移除对象(对于本例来说,这只是另外一种观察序列的方式,因此并没有展示它)。Map在每个槽内保存了两个对象,即键和与之相关联的值。

      查看输出会发现,默认的打印行为(适用容器提供的toString()方法)即可生产可读性很好的结果。Collection打印出来的内容用方括号括住,每个元素由逗号分隔。Map则用大括号括住,键与值由等号联系(键在等号左边,值在右边)。

      第一个fill()方法可以适用于所有类型的Collection,这些类型都实现了用来添加新元素的add()方法。

      ArrayList和LinkedList都是List类型,从输出可以看出,它们都按照被插入的顺序保存元素。两者的不同之处不仅在于执行某些类型的操作时的性能,而且LinkedList包含的操作也多于ArrayList。这些将在后面的博客中列出来。

      HashSet,TreeSet和LinkedHashSet都是Set类型,输出显示在Set中,每个相同的项只有保存一次,但是输出也显示了不同的Set实现存储元素的方式也是不同的。HashSet使用的是相当复杂的方式来存储元素的,这种技术是最快获取元素方式,存储顺序看起来并无实际意义(通常你只会关心某事物是否是某个Set的成员,而不是关心它在Set出现的顺序)。如果存储顺序很重要,那么可以使用TreeSet,它按照比较结果的升序保存对象;或者使用LinkedHashSet,它按照被添加的顺序保存对象。

      Map(也被称为关联数组)使得你可以用键来查找对象,就像一个简单的数据库。键所关联的对象称为值。使用Map可以将美国州名与其首府联系起来。

      Map.put(key,value)方法将增加一个值(你想要增加的对象),并将它与某个键(你用来查找这对象)关联起来。Map.get(key)方法将产生与这个键相关联的值。

      注意,你不必指定Map的尺寸,因为它自己会自动地调整尺寸。Map还知道如果打印自己,它会显示相关联的键和值。键和值在Map中的保存顺序并不是它们的插入顺序,因为HashMap实现使用的是一种非常快的算法来控制顺序。

      本例使用了三种基本风格的Map:HashMap,TreeMap和LinkedHashMap。与HashSet一样,HashMap也提供了最快的查找技术,也没有按照任何明显的顺序来保存其元素。TreeMap按照比较结果的肾虚保存键,而LinkedHashMap则按照插入顺序保存键,同时还保留了HashMap的查询速度。