1:集合(理解)
(1)java是一种面向对象语言,如果我们要针对多个对象进行操作,就必须对多个对象进行存储。
而对多个元素进行存储,前面我们学习过数组,数组的弊端,长度固定。这样,数组将不能
满足变化的要求。所以,java就提供了集合供我们使用。
(2)集合的特点:
1、长度可以发生改变
2、只能存储对象
3、可以存储多种类型对象(一般存储的还是同一种)
(3)集合和数组的区别
1、长度问题
数组固定
集合可变
2、存储元素问题
数组可以是基本类型,也可以是引用类型。
集合只能是引用类型。
3、是否同一类型
数组元素类型一致。
集合元素类型可以不一致。
(4)集合体系的由来
集合是存储多个元素的容器,但是,由于数据结构不同,java就提供了多种集合类。
而这多种集合类有共性的功能,所以,通过不断的向上抽取,最终形成了集合体系
结构。
数据结构:数据存储的方式。
程序 = 算法 + 数据结构
Collection:接口
|--List:接口
|--ArrayList
|--Vector
|--LinkedList
|--Set:接口
|--HashSet
|--TreeSet
Map:接口
|--HashMap
|--TreeMap
|--Hashtable
(5)如何学习和使用一个继承体系呢?
学习顶层:因为顶层定义的是共性内容。
使用底层:因为底层才是具体的实现。
2:Collection的功能(掌握)
(1)Collection的功能
1、添加功能(掌握)
boolean add(Object obj):向集合中添加一个元素。
boolean addAll(Collection c):向集合中添加一个集合的元素。
2、删除功能(掌握)
void clear():删除集合中所有的元素。
boolean remove(Object obj):删除集合中指定的元素。
boolean removeAll(Collection c):删除集合中指定的集合元素。
3、判断功能(掌握)
boolean isEmpty():判断集合是否为空。
boolean contains(Object obj):判断集合是否包含指定的元素。
boolean containsAll(Collection c):判断集合是否包含指定的集合中的元素。
4、遍历功能(掌握)
Iterator iterator():迭代器。
hasNext():判断是否还有元素
next():获取下一个元素
list集合特有迭代器
ListIterator listIterator():List集合特有迭代器,是Iterator的子类
hasPrevious():逆向遍历的时候用来判断集合中是否还有元素
previous():逆向遍历时用来获取前一个元素
void add(E e):迭代的时候,将指定的元素插入列表
void set(E e):用指定元素替换 next 或 previous 返回的最后一个元素
5、长度功能(掌握)
int size():获得集合的元素个数。
6、交集功能
boolean retainAll(Collection c):仅保留两个集合中的交集元素。
7、转换功能
Object[] toArray():把集合变成数组。
(2)迭代器的使用
1、使用步骤
1、通过集合对象获取迭代器对象。
2、通过迭代器对象判断。
3、通过迭代器对象获取。
2、迭代器原理
由于多种集合的数据结构不同,所以存储方式不同,所以,取出方式也不同。
这个时候,我们就把判断和获取功能定义在了一个接口中,将来,遍历哪种
集合的时候,只要该集合内部实现这个接口即可。
3:Collection体系的集合总结
Collection具体实现类的数据结构及特点
|--List 有序,不唯一
|--ArrayList
底层数据结构是数组,查询快,增删慢
线程不安全,效率高。
|--LinkedList
底层数据结构是链表,查询慢,增删快
线程不安全,效率高。
|--Vector
底层数据结构是数组,查询快,增删慢
线程安全,效率低。
|--Set 唯一 无序
|--HashSet
底层数据结构是哈希表。
如何保证元素唯一性呢?
依赖两个方法。hashCode()和equals()。
以后都自动生成。
|--TreeSet
底层数据结构是二叉树。
如何保证元素唯一性呢?如何保证元素排序呢?
根据返回值是否是0,判断元素是否重复。
排序有两种方案:
元素具备比较性 实现Comparable接口
集合具备比较性 实现Comparator接口
4:Set接口以及常用实现类的详细特点
1:Set的特点:
元素无序,唯一。
注意:这里的顺序是指存储和取出顺序。
2:HashSet(掌握)
(1)HashSet:不保证元素的迭代顺序。并且,不保证该顺序恒久不变。
(2)怎么保证的呢?
HashSet底层数据结构是哈希表。
它依赖两个方法:hashCode()和equals()
顺序:
首先,判断hashCode()值是否相同。
相同:
继续走equals()方法,根据其返回值:
true:说明元素重复,不添加到集合。
false:说明元素不重复,添加到集合。
不同:直接添加到集合。
(3)怎么重写hashCode()和equals()方法呢?(忘了吧)
hashCode():
把对象的所有成员变量值相加即可。
如果是基本类型,就加值。如果是引用类型,就加哈希值。
equals():
A:this==obj
B:!(obj instanceof Student)
C:所有成员变量的值比较。基本类型用==,引用类型用equals()。
如果不会,自动生成。
(4)案例:(掌握)
HashSet存储字符串并遍历
HashSet存储自定义对象并遍历
针对自定义对象:
需求:如果对象的成员都相同,我们就认为是同一个元素。
3:TreeSet(理解)
(1)TreeSet:根据构造方法的不用,选择使用自然排序或者比较器排序。
按照实际的需求,可以对元素进行排序。并且保证唯一。
(2)怎么保证的呢?
排序:底层结构是二叉树。按照树节点进行存储和取出。
两种实现:
A:自然排序(元素具备比较性)
TreeSet的无参构造,要求对象所属的类实现Comparable接口。
B:比较器排序(集合具备比较性)
TreeSet的带参构造,要求构造方法接收一个实现了Comparator接口的对象。
唯一:根据返回值是否为0。
注意:
如果同时有两种方案,以谁为主呢?以比较器为主。
(3)案例:(理解)
TreeSet存储字符串并遍历
TreeSet存储Integer并遍历
TreeSet存储自定义对象并遍历
5:增强for循环(掌握)
(1)格式:
for(数组或者Collection集合的元素类型 变量 : 数组或者Collection集合的对象)
{
直接使用变量即可。
}
(2)好处:
方便了数组和Collection集合的遍历。
(3)注意(注意):
A:增强for是用来替代迭代器的。
B:不要在用增强for遍历集合的时候,用集合对集合本身进行修改。
(4)遍历集合三种方式
迭代器(Iterator)List接口还有一个特有的迭代器(ListIterator)
普通for+get
增强for(工作时候用)
|
|