1.集合的概念
1、集合是Java API所提供的一系列类,可以用于动态存放多个对象。–集合只能存对象
2、集合与数组的不同在于,集合是大小可变的序列,而且元素类型可以不受限定,只要是引用类型
3、集合类全部支持泛型,是一种数据安全的用法。
2.集合框架图
-
Java的集合框架从整体上可以分为两大家族。
1、Collection(接口)家族。该接口下的所有子孙均存储的是单一对象。
2、Map(接口)家族。该接口下的所有子孙均存储的是**key-value(键值对)**形式的数据。 -
另外还有三个分支,均是为上述两大家族服务的。
1、Iterator(迭代器)家族。主要用于遍历Colleciton接口的及其子类而设计。
2、Comparator(比较器), 在集合中存储对象时候,用于对象之间的比较
Collecitons是工具类。注意该类名带个s,一般就表示工具类。里面提供了N多静态方法,来对Colleciton集合进行操作。
3.Collection接口
3.1Collection接口概述
- Collection接口-定义了存取对象的方法。有两个非常常用的子接口:
- List接口:存放的元素有序且允许有重复的集合接口。
- Set接口:存放的元素无序不包含重复的集合接口。
3.2Collection接口中的常用方法
1、int size(); 返回此collection中的元素数。
2、boolean isEmpty(); 判断此collection中是否包含元素。
3、boolean contains(Object obj); 判断此collection是否包含指定的元素。
4、boolean contains(Collection c); 判断此collection是否包含指定collection中的所有元素。
5、boolean add(Object element); 向此collection中添加元素。
6、boolean addAll(Collection c);将指定collection中的所有元素添加到此collection中
7、boolean remove(Object element); 从此collection中移除指定的元素。
8、boolean removeAll(Collection c); 移除此collection中那些也包含在指定collection中的所有元素。
9、void clear(); 移除些collection中所有的元素。
10、boolean retainAll(Collection c); 仅保留此collection中那些也包含在指定collection的元素。
11、Iterator iterator(); 返回在此collection的元素上进行迭代的迭代器。
12、Object[] toArray(); 把此collection转成数组。
4.List接口
4.1.List接口概述
List中的元素是有序的,且允许重复。重点掌握ArrayList和LinkedList
4.2.List接口相比Colleciton接口的新增方法
- List接口比Collection接口中新增的几个实用方法:
1、public Object get(int index) 根据下标,返回列表中的元素
2、public Object add(int index, Object element); 在列表的指定位置插入指定元素.将当前处于该位置的元素(如果有的话)和所有后续元素向右移动
3、public Object set(int index, Object element) ; 用指定元素替换列表中指定位置的元素
4、public Object remove(int index) 移除列表中指定位置的元素
注意:list集合中的元素的索引与数组中元素的索引一样,均是从0开始。
4.3.List实现类之ArrayList集合
ArrayList相比數組的區別?容量的可扩展性,数据类型只要是Object类型就行,存储的必须是对象,不能存储基础数据类型。
4.4.List实现类之LinkedList集合
这就是面向接口编程的好处。
5.Iterator(迭代器)接口
5.1.Iterator概述
- 通过上面的学习,我们知道可以采用两个方式来遍历我们的List集合,其实API已经为我们准备了更专业的遍历工具,专门来遍历我们集合中的元素,包括我们后面要学习到的Set集合。这个工具就叫–迭代器
- Iterator对象称作迭代器,以类似指针的方式来遍历我们的集合元素。
5.2.获得Iterator对象
- 调用集合对象的iterator()方法,可以获得一个与该集合对象关联的迭代器对象。
例如:
List list = new ArrayList<>();
Iterator iterator = list.iterator(); //获得Iterator对象
5.3.Iterator的常用方法
- Iterator定义如下两个方法:
boolean hasNext(); //判断游标右边是否有元素。如果有返回true,否则false
Object next() ; //返回游标右边的元素并将游标移动到下一个位置
6.泛型(Generic)的使用
6.1.集合中使用泛型
上面我们的程序存在严重的安全隐患!
- JDK1.4以前不能使用泛型的弊端:
1、装入集合的数据都会被当作Object对象来存放,从而失去了自己的实际类型。
2、从集合中取出元素时,需要进行强制类型转换。效率低,容易产生错误。
从JDK1.5开始,sun公司推出了泛型来解决上述问题:
1、在定义一个集合时就指定集合存储的对象的数据类型
如:List list = new ArrayList<>();
2、存入数据时只能存入泛型指定的数据类型,如果存入其他数据类型,则会编译错误,避数据存入时的问题。
list.add(1); //编译错误!
3、从集合中取出元素时,无需转型了。
如:Student st = it.next(); - 优点
1、简化集合的使用
2、增强代码的可读性和稳定性
7.Set接口
1.Set接口:存放的元素无序不包含重复的集合接口。重点掌握HashSet和TreeSet
7.1.Set实现类之HashSet集合
- 掌握HashSet的使用,以及感受它的唯一无序的特点
- 分析思考,HashSet怎么保证了唯一性?
- 存储自定义类对象
- 实验看是否可以保证唯一性
- 问题:如果hashcode返回的结果都一样,可以吗?
- 小技巧,自动生成相关方法(hashcode,equals)
7.2.Set实现类之TreeSet集合
- 掌握TreeSet的使用,以及感受它的可排序,唯一的特点
- 分析思考,HashSet怎么保证了可排序和唯一性?
- 存储自定义类对象
- 实验看是否可以保证可排序与唯一性
- 能够按照某种规则对元素进行排序,且唯一,排序两种方式如下:
(1),自然排序
(2),比较器进行比较