【Java编程思想笔记】-集合1
1.为什么要用集合?
一般情况下,数组是保存一组对象(或基本数据类型)最有效的方式。但是数组有着固定的尺寸,而在更一般的情况下,我们在写程序时不知道将需要保存多少个对象,或者是否需要更复杂的存储结构来保存对象,因此数组尺寸固定是一个非常大的限制。
Java提供了一套相当完整的容器类(集合)来解决这个问题,其中基本的类型是List,Set,Queue和Map。这些对象类型也称为集合类,集合类提供了完善的方法来保存对象,我们可以使用这些工具来解决数量惊人的问题。
2.基本概念
Java集合类的用途是“保存对象”,并将其划分为两个概念:
(1)Collection: 一个独立元素的序列,这些元素都是服从一条或多条规则。如List必须按照插入的顺序保存元素,而Set不能有重复元素。Queue按照排队规则来确定对象产生的顺序。
(2)Map: 一组成对的“键值对”对象,允许你使用键来查找值。ArrayList允许你使用数字来查找值,因此在某种意义上讲,它将数字与对象关联在一起。映射表,允许我们使用另一个对象来查找某一个对象,它也被称为“关联数组”,因为它将某些对象与另外一些对象关联在了一起;你可以使用键对象来查找值对象,就像使用字典一样。
3.类型安全问题
一般使用数组时,我们会规定该数组的大小和存储的对象类型,因此无法在数组中保存非规定类型的对象。
而集合在Java SE5之前的一个主要问题就是,编译器允许你向容器中插入不正确的类型。如下:
1 class Dog{ } 2 3 class Human{ 4 private static long counter; 5 private final long id = counter++; 6 public long id(){return id;} 7 } 8 9 public class TypeSafeTest { 10 @SuppressWarnings("unchecked") 11 public static void main(String[] args){ 12 ArrayList humans = new ArrayList();//无规定类型的容器 13 for(int i = 0; i<3; i++){ 14 humans.add(new Human()); 15 } 16 //向人的容器中加入一只狗 17 humans.add(new Dog()); 18 19 for(int i = 0; i<humans.size(); i++){ 20 ((Human)humans.get(i)).id(); 21 //由于容器中默认为保存Object类,再取出时要强制转型为Human类,并获取容器中每个人的ID 22 } 23 } 24 }
这里需要@SuppressWarnings 来帮助完成,因为在正常情况下,Java编译器会提示 没有使用泛型。
以上,在不使用泛型时,ArrayList默认保存对象为Object类,而Object类是所有类的父类,因此对于实现的不同的类型,都可以保存到其中。
但是应用预定义的泛型,就可以在编译期 防止将错误类型的对象放置到容器中。如:
public class TypeSafeTest { public static void main(String[] args){ ArrayList<Human> humans = new ArrayList<>();//规定保存类型的容器 for(int i = 0; i<3; i++){ humans.add(new Human()); } //向人的容器中加入一只狗时就会报错 humans.add(new Dog()); for(int i = 0; i<humans.size(); i++){ humans.get(i).id(); //同时取出时不需要再强制转型 } } }