Java容器

Java容器

    • 容器
    • Collection 的基本使用
    • Arrays 和 Collections
    • 容器的打印
          • 欢迎关注公众号:一盐难进

我们在 数组初始化 中已经学习过数组,它是编译器支持的类型,数组是保存一组对象或基本类型最有效的方式,但是数组有固定的尺寸,那么在某些场景中,需要更加复杂的方式来存储对象,数组就明显不合适了。但是 Java 类库提供了一套相当完整的容器类来解决这个问题。

容器

容器的基本类型是 List、Set、Queue,这些类型也叫集合类,由于 Java 类库使用 Collection 这个名词只带该类库,所以使用术语 “容器” 来称呼,容器提供了完整的方法来保存对象,Java 容器类都可以自动地调节尺寸。

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

Collection 框架图:

Java容器_第1张图片

这张图可以清晰看出,上面提到的 Set、Queue、List 都继承自 Collection,但是 Map 不在此列,它是一个单独的接口,后面的文章将对它们一一介绍,我们先来看看 Collection。

Collection 的基本使用

Collection 是一个接口,它概括了序列的概念,即:一种存放一组对象的方式。现在我们看看 Collection 的基本使用(以 ArrayList 为例):

public class CollectionTest {

    public static void main(String[] args) {
        //创建 Collection 对象(向上转型)
        Collection collection = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            //添加元素
            collection.add(i);
        }
        //遍历 collection 并打印
        for (Integer i : collection) {
            System.out.println(i);
        }
    }
}

打印结果:

0
1
2
3
4

代码展示了 Collection 对象的创建,任何继承自 Collection 的类的对象都可以通过向上转型创建 Collection 对象,ArrayList 是最基本的序列类型,可参考上图。add() 方法是向 Collection 中添加一个元素, 同时,所有的 Collection 都可以用 foreach 语法进行遍历。

Arrays 和 Collections

java.util 包中的 ArraysCollections 类中包含很多实用的方法,可以在 Collection 中添加一组元素,简单实例如下:

public class CollectionTest {

    public static void main(String[] args) {
        //创建 Collection 对象(向上转型)
        Collection collection = new ArrayList<>(Arrays.asList(1,2,3));
        //创建数组
        Integer [] ints = {4,5,6};
        //Collection 的 addAll 方法,可添加所有 Collection 对象
        collection.addAll(Arrays.asList(ints));
        //Collections 的 addAll 方法,接受一个 Collection 对象以及一个数组或者列表
        Collections.addAll(collection,ints);
        Collections.addAll(collection,7,8,9);
        //遍历 collection 并打印
        for (Integer i : collection) {
            System.out.print(i + ",");
        }
    }
}

打印结果:

1,2,3,4,5,6,4,5,6,7,8,9,

Arrays.asList() 方法可以接受一个数组或者一个用逗号分隔的元素列表(可变参数),并将其转换成一个 List 对象。Collection 的 addAll() 方法只能接受另一个 Collection 对象作为参数,但是 Collections.addAll() 方法接受一个 Collection 对象以及一个数组或者元素列表,并且将元素添加到 Collection 中。因此 Arrays.asList() 和 Collections.addAll() 方法更加灵活,因为它们使用的都是可变参数列表。

:使用 Arrays.asList() 来创建 List 对象时,因为其底层表示的是数组,因此不能调整尺寸,当试图使用 add() 或者 delete() 方法来对其添加或者删除元素的时候,那么运行时将会报错!

容器的打印

现在我们写一段代码看看各容器的 toString() 方法有什么不同:

/**
     * 添加元素
     * @param collection
     * @return
     */
    public static Collection add(Collection collection) {
        collection.add(1);
        collection.add(3);
        collection.add(3);
        collection.add(2);
        return collection;
    }

    public static void main(String[] args) {
        System.out.print(add(new ArrayList()));
        System.out.print(add(new LinkedList()));
        System.out.print(add(new HashSet()));
        System.out.print(add(new TreeSet()));
        System.out.print(add(new LinkedHashSet()));
    }

打印如下:

[1, 3, 3, 2][1, 3, 3, 2][1, 2, 3][1, 2, 3][1, 3, 2]

代码中写了一个 add() 方法,传入 Collection 对象,添加几个元素,然后返回该对象。从打印结果可以看出,Collection 打印的内容使用方括号括住,每个元素使用逗号分隔

ArrayListLinkedList 都是 List 类型,他们都是按照插入的顺序保存元素,元素可重复,但是两者执行某些操作的性能不同,LinkedList 的操作也多于 ArrayList,后面详细介绍。HashSetTreeSetLinkedHashSet 都是 Set 类型,每个相同的值只保存一次,HashSet 存储方式相当复杂,但是速度最快,如果要保证存储顺序,那么就是用 TreeSet,它按照升序保存对象,而 LinkedHashSet 是按照添加的顺序保存对象。

欢迎关注公众号:一盐难进

Java容器_第2张图片

你可能感兴趣的:(Java)