0. 泛型
在使用集合之前,要先了解泛型:
当集合中存储的对象类型不同时,那么会导致程序在运行的时候的转型异常,所以jdk1.5加入了泛型机制。
以下内容要配合第一部分Collection同步。
1. Collection
为什么不愿意用数组?长度固定 ̄へ ̄
集合只能存储对象(引用数据类型),但数组可以存储基本数据类型
集合做什么
- 将对象添加到集合
- 从集合中删除对象
- 从集合中查找一个对象
- 从集合中修改一个对象
也就是增删改查
注意:集合和数组中存放的都是对象的引用而非对象本身
来瞅一个简单的栗子:
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
public class Test {
public static void main(String[] args) {
Collection collection = new ArrayList();
collection.add(123);
collection.add("abc");
collection.add(new Date());
}
}

为什么在Collection的下面出现了黄线?
jdk1.5之后引入泛型,集合在声明/创建时要标记集合所能存放的数据类型,这样再取出元素的时候就是对应的数据类型(无需强转)
那我们来加上泛型,看看加入泛型之后的Collection:
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
public class Test {
public static void main(String[] args) {
Collection<Integer> collection = new ArrayList<Integer>();
collection.add(123);
collection.add("abc"); // 编译报错
collection.add(new Date()); // 编译报错
}
}

提示:Integer的集合不允许加入String!这就有点像int[] ,也就是数组了!保证每个集合只放一类东西。
(-- 后续涉及到泛型,统一用E或者T等大写字母表示 --)
Collection有两个子接口:List(表)和Set(集)
List有序,可重
Set无序,不可重
Collection作为单列集合的顶级接口,定义了一些通用方法:
增加
1:add() 将指定对象存储到容器中。add 方法的参数类型是T,便于接收任意对象,返回值为boolean,代表添加是否成功
2:addAll() 将指定集合中的所有元素添加到调用该方法和集合中
import java.util.ArrayList;
import java.util.Collection;
public class Test {
public static void main(String[] args) {
Collection<Integer> collection = new ArrayList<Integer>();
collection.add(5); // 一次添加一个元素
collection.add(123); // jdk1.5新引入了自动拆装箱机制
Collection<Integer> collection2 = new ArrayList<Integer>();
collection2.addAll(collection); // 一次性导入一个集合
}
}
删除
3:remove() 将指定的对象从集合中删除,返回值为boolean,代表删除是否成功
4:removeAll() 将指定集合中的元素删除
import java.util.ArrayList;
import java.util.Collection;
public class Test {
public static void main(String[] args) {
Collection<Integer> collection = new ArrayList<Integer>();
collection.add(5);
collection.add(123);
boolean flag1 = collection.remove(5); // 从集合中删除 5
boolean flag2 = collection.remove(6); // 集合中没有6,没有任何反应
System.out.println(flag1);
System.out.println(flag2);
collection.removeAll(collection); // 删除自身的所有元素
System.out.println(collection.size()); // 0
}
}
修改
5:clear() 清空集合中的所有元素
注意这里的clear与removeAll(自身)的效果是一样的
import java.util.ArrayList;
import java.util.Collection;
public class Test {
public static void main(String[] args) {
Collection<Integer> collection = new ArrayList<Integer>();
collection.add(5);
collection.add(123);
collection.clear(); // 删除自身的所有元素
System.out.println(collection.size()); // 0
}
}
判断
6:isEmpty() 判断集合是否为空
7:contains() 判断集合何中是否包含指定对象
8:containsAll() 判断集合中是否包含指定集合。使用equals()判断两个对象是否相等
import java.util.ArrayList;
import java.util.Collection;
public class Test {
public static void main(String[] args) {
Collection<Integer> collection = new ArrayList<Integer>();
collection.add(5);
collection.add(123);
System.out.println(collection.contains(5)); // true
System.out.println(collection.contains(10)); // false
System.out.println(collection.isEmpty()); // false
collection.clear();
System.out.println(collection.isEmpty()); // true
}
}
获取
9:int size() 返回集合容器的大小
import java.util.ArrayList;
import java.util.Collection;
public class Test {
public static void main(String[] args) {
Collection<Integer> collection = new ArrayList<Integer>();
collection.add(5);
collection.add(123);
System.out.println(collection.size()); // 2
System.out.println(collection.isEmpty()); // false
collection.clear();
System.out.println(collection.size()); // 0
System.out.println(collection.isEmpty()); // true
}
}
转成数组
10:toArray() 集合转换数组
import java.util.ArrayList;
import java.util.Collection;
public class Test {
public static void main(String[] args) {
Collection<Integer> collection = new ArrayList<Integer>();
collection.add(5);
collection.add(123);
Integer[] arr = new Integer[collection.size()]; // 先创建一个跟集合大小一样的数组
arr = collection.toArray(arr); // 再把数组传入,collection返回的数组就是真正转换出来的数组
}
}
------------------------------多说几句----------------------------------
在面向对象的专题中,我们提过继承和多态,在集合这个范畴中可以清晰地看到它的利用之处:
如果我们定义一个动物园,里面可以放入任意动物,这个时候只需要在泛型中标记Animal,那么所有Animal以及它的子类都可以被加入到集合中:
import java.util.ArrayList;
import java.util.Collection;
public class Test {
public static void main(String[] args) {
Collection<Animal> zoo = new ArrayList<>();//jdk7增加了菱形泛型,等号右侧的尖括号可以省略
collection.add(new Cat());
collection.add(new Dog());
}
}
abstract class Animal {
protected String name;
}
class Cat extends Animal {
}
class Dog extends Animal {
}
有关更多的内容,可以多学一点:泛型的上限和下限





