泛型和类型安全的集合
泛型和类型安全的集合
使用java5之前集合的一个主要问题是编译器允许你向集合中插入不正确的类型。
java5之前的集合没有泛型的概念,可以存储任意类型的数据(可以看做是泛型Object的集合),在取出对象时需要强制类型转换,但因为无法确定集合中对象的类型,将会产生语法错误。
java5提出了泛型的概念
ArrayList<Apple> apples = new ArrayList<Apple>();
尖括号括起来的是参数类型,他指定了这个集合可以保存的类型。
在java7中又提出了类型推断
ArrayList<Apple> apples = new ArrayList<>();
new集合时不需要再书写类型。
程序打印一个对象时使用默认的Object的toString()产生的,该方法打印类名,后面跟着对象的散列码的无符号十六进制表示。
基本概念
- 集合(Collection):一个独立元素的序列,这些元素都服从一条或多条规则。List必须以插入的顺序保存元素,Set不能包含重复元素,Queue按照排队规则来确定对象产生的顺序(通常与他们插入的顺序相同)。
- 映射(Map):一组成对的“键值对”对象,允许使用键来查找值。ArrayList使用数字来查找对象,因此在某种意义上讲,他是讲数字和对象关联在一起。map允许我们使用一个对象来查找另一个对象,他也被称作关联数组,因为它将对象和其他对象关联在一起;或者称作字典,因为可以使用一个键对象查找值对象,就像在字典中使用单词查找定义一样。Map是强大的编程工具。
添加元素组
在 java.util 包中的 Arrays 和 Collections 类中都有很多实用的方法,可以在一个 Collection 中添 加一组元素。
Arrays.asList()方法接收一个数组或者是都好分割的元素列表,并将其转换为LIst对象。
Collections.addAll()方法接收一个Collection对象,以及一个数组或者是都好分割的列表,将其元素添加到Collection中。
public class AddingGroups {
/**
* Arrays.asList()方法将一个数组或是都好分割的元素列表,转换为List对象。
*
* Collections.addAll()方法接收一个Collection对象以及一个逗号分割的列表。
* @param args
*/
public static void main(String[] args) {
Collection<Integer> collection = new ArrayList<>(Arrays.asList(1,2,3,4,5));
Integer[] moreInts = {6,7,8,9,10};
collection.addAll(Arrays.asList(moreInts));
Collections.addAll(collection,11,12,13,14,15);
Collections.addAll(collection,moreInts);
List<Integer> list = Arrays.asList(16,17,18,19,20);
list.set(1,99);
for (Integer integer:collection){
System.out.println(integer);
}
}
}
Collection的构造器可以接收另一个Collection,用它来将自身初始化。因此,可以使用Arrays.asList()来为这个构造器产生输入。但是,Collections.addAll()运行得更快,而且更容易构建一个不包含元素的Collection,然后调用Collection.addAll(),因此这是首选方式。
Collection<Integer> collection = new ArrayList<>();
Collections.addAll(collection,Arrays.asList(1,2,3,4,5));
也可以直接使用Arrays.asList()的输出作为一个List,但是这里的底层实现是数组,没法调整大小。如果尝试在这个List上调用add()或remove(),由于这两个方法会尝试修改数组的大小,所以会在运行时得到“Unsupported Operation(不支持的操作)”错误:
/**
* @author myf
*/
public class AsListInference {
public static void main(String[] args) {
List<Apple1> apple1s = Arrays.asList(new Apple1("mo"),new Apple1("yi"),new Apple1("feng"));
//apple1s.add(new Apple1("baocuo")); UnsupportedOperationException
List<Apple1> apple1s1 = new ArrayList<>();
Collections.addAll(apple1s,new Apple1("mo"),new Apple1("yi"));
apple1s1.add(new Apple1("feng"));
}
}
class Apple1 {
String name;
public Apple1(String name) {
this.name = name;
}
}