一.介绍
集合(简称集)是数学中一个基本概念,它是集合论的研究对象,集合论的基本理论直到19世纪才被创立。最简单的说法,即是在最原始的集合论——朴素集合论中的定义,集合就是“确定的一堆东西”。集合里的“东西”,叫作元素。
由一个或多个确定的元素所构成的整体叫做集合。若x是集合A的元素。集合中的 元素有三个特征:
1、确定性(集合中的元素必须是确定的)。
2、互异性(集合中的元素互不相同)。
3、无序性(集合中的元素没有先后之分)。
集合类存放于java.util包中,集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用。
集合类型主要有3种:set(集)、list(列表)和map(映射)。
二.知识点介绍
1、java中的集合
2、集合分类
3、Collection
三.上课对应视频的说明文档
1、java中的集合
在java实际的项目开发中,一定会出现保存多个对象的操作,根据之前学习的知识来讲,此时一定会使用对数组的概念。但传统的对象数组有一定问题:长度是固定的(因为此缺陷,所以数组一般不会使用)。为了可以动态地实现多个对象的保存,可以利用链表来实现一个动态的对象数组 ,但是对于链表的数据结构编写会存在以下3个问题:
(1)由于需要处理大量的引用关系,如果要开发链表工具类,对初学者而言难度较高;
(2)为了保证链表在实际的开发中可用,在编写链表实现时必须更多地考虑到性能问题
(3)链表为了可以保存做任意对象类型,统一使用了Object类型进行保存。那么所有要保存的对象必须发生向上转型,而在进行对象信息取出时又必须强制性地向下转型操作。如果一个链表中所保存的数据不是某种类型,这样的操作会带来安全隐患。
综合以上问题,可以得出一个结论:如果在开发项目里面由用户自己去实现一个链表,那么这种项目的开发难度对于大部份开发者而言实在是太高了。同时在所有的项目里面都会存在数据结构的应用。在java设计之初就考虑到了此类问题,所以提供了一个与链表类似的工具类-Vector(向量类)。但是随着时间的推移,这个类并不能很好的描述出所需要的数据结构,所以Java2(jdk1.2)之后提供了一个专门上实现数据结构的开发框架-类集框架[集合]。在jdk1.5之后,泛型技术的引入,又解决了类集框架中,所有操作类型都使用Object所带来的安全隐患。
2、集合分类
java集合的所有程序都是保存在java.util这个包中,在整个的类集框架中,其核心的接口为:List,Set,Map,Iterator,Enumeration。
3、Collection
Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。
3.1、Collection常用方法
(1)int size() 获取元素个数
(2)boolean isEmpty() 是否个数为 0
(3)boolean contains(Object element) 是否包含指定元素
(4)boolean add(E element)添加元素,成功时返回 true
(5)boolean remove(Object element) 删除元素,成功时返回 true
(6)void clear() 删除所有元素
代码示例:
public class CollectionDemo {
public static void main(String[] args) {
// 测试不带All的方法
// 创建集合对象
// Collection c = new Collection(); //错误,因为接口不能实例化
Collection c = new ArrayList();
// boolean add(Object obj):添加一个元素
// System.out.println("add:"+c.add("hello"));
c.add("hello");
c.add("world");
c.add("java");
// void clear():移除所有元素
// c.clear();
// boolean remove(Object o):移除一个元素
// System.out.println("remove:" + c.remove("hello"));
// System.out.println("remove:" + c.remove("javaee"));
// boolean contains(Object o):判断集合中是否包含指定的元素
// System.out.println("contains:"+c.contains("hello"));
// System.out.println("contains:"+c.contains("android"));
// boolean isEmpty():判断集合是否为空
// System.out.println("isEmpty:"+c.isEmpty());
//int size():元素的个数
System.out.println("size:"+c.size());
System.out.println("c:" + c);
}
}
3.2、Collection操作整个集合的方法
(1)boolean containsAll(Collection<?> c) 是否包含指定集合 c 的全部元素
(2)boolean addAll(Collection<? extends E> c) 添加集合 c 中所有的元素到本集合中,如果集合有改变就返回 true
(3)boolean removeAll(Collection<?> c) 删除本集合中和 c 集合中一致的元素,如果集合有改变就返回 true
(4)boolean retainAll(Collection<?> c) 保留本集合中 c 集合中两者共有的,如果集合有改变就返回 true
代码示例:
public class CollectionDemo2 {
public static void main(String[] args) {
// 创建集合1
Collection c1 = new ArrayList();
c1.add("abc1");
c1.add("abc2");
c1.add("abc3");
c1.add("abc4");
// 创建集合2
Collection c2 = new ArrayList();
c2.add("abc1");
c2.add("abc2");
c2.add("abc3");
c2.add("abc4");
c2.add("abc5");
c2.add("abc6");
c2.add("abc7");
// boolean addAll(Collection c):添加一个集合的元素
// System.out.println("addAll:" + c1.addAll(c2));
//boolean removeAll(Collection c):移除一个集合的元素(是一个还是所有)
//只要有一个元素被移除了,就返回true。
//System.out.println("removeAll:"+c1.removeAll(c2));
//boolean containsAll(Collection c):判断集合中是否包含指定的集合元素(是一个还是所有)
//只有包含所有的元素,才叫包含
// System.out.println("containsAll:"+c1.containsAll(c2));
//boolean retainAll(Collection c):两个集合都有的元素?思考元素去哪了,返回的boolean又是什么意思呢?
//假设有两个集合A,B。
//A对B做交集,最终的结果保存在A中,B不变。
//返回值表示的是A是否发生过改变。
System.out.println("retainAll:"+c1.retainAll(c2));
System.out.println("c1:" + c1);
System.out.println("c2:" + c2);
}
}
3.3、Collection对数组操作的方法
Object[] toArray() 返回一个包含集合中所有元素的数组
<T> T[] toArray(T[] a) 返回一个包含集合中所有元素的数组,运行时根据集合元素的类型指定数组的类型
代码示例:
public class CollectionDemo3 {
public static void main(String[] args) {
// 创建集合对象
Collection c = new ArrayList();
// 添加元素
c.add("hello"); // Object obj = "hello"; 向上转型
c.add("world");
c.add("java");
// 遍历
// Object[] toArray():把集合转成数组,可以实现集合的遍历
Object[] objs = c.toArray();
for (int x = 0; x < objs.length; x++) {
// System.out.println(objs[x]);
// 我知道元素是字符串,我在获取到元素的的同时,还想知道元素的长度。
// System.out.println(objs[x] + "---" + objs[x].length());
// 上面的实现不了,原因是Object中没有length()方法
// 我们要想使用字符串的方法,就必须把元素还原成字符串
// 向下转型
String s = (String) objs[x];
System.out.println(s + "---" + s.length());
}
}
}
3.4、遍历 Collection
遍历 Collection的方式:使用 Iterator 迭代器
Collection<Person> persons = new ArrayList<Person>();
Iterator iterator = persons.iterator();
while (iterator.hasNext) {
System.out.println(iterator.next);
}