26集合框架
Java基础——集合框架
1 集合的概念
- 概念:对象的容器,定义了对多个对象进行操作的常用方法。可实现数组的
功能。 - 和数组的区别:
- (1)数组长度固定,集合长度不固定
- (2)数组可以存储基本类型和引用类型,集合只能存储引用类型
2 Collection接口
2.1 Collection体系集合

2.2 Collection父接口
- 特点:代表一组任意类型的对象,无序、无下标、不能重复。
- 方法
boolean add (Object obj) //添加一个对象。
boolean addAll (Collection c) //将一个集合中的所有对象添加到此集合中。
void clear() //清空此集合中的所有对象。
boolean contains (Object o) //检 查此集合中是否包含o对象
boolean equals (Object o) //比较此集合是否与指定对象相等。
boolean isEmpty() //判断此集合是否为空
boolean remove (Object o) //在此集合中移除o对象
int size() //返回此集合中的元素个数。
Object[] toArray() //将此集合转换成数组。
Collection接口的使用 (1)
注意接口不能实例化,在创建集合时可以选择接口下的class,例如

(1)添加元素

结果:

(2)删除元素

(3)遍历元素【重点】
- 第一种方式:使用增强for(因为collection没有下标的方法,所以不能用for)

结果:

- 第二种方式:使用迭代器,专门用来遍历集合
collection.iterator()这个方法的返回值就是一个Iterator类型的对象,但Iterator是一个接口
iterator方法


注意:
- it.next()默认返回的对象类型是Object,但是由于我们可能知道要遍历的集合的数据类型可以对数据类型进行强转,比如此例中,String s = (String)it.next();
- 在迭代过程中是不允许使用collection.remove()方法的,会引起
ConcurrentModificationException并发修改异常,要想进行删除可以使用iterator.remove()

(4)判断

判断含不含有西瓜,判断是否为空
结果:true false
Collection接口的使用 (2)
新建一个Student类
(1)创建集合,添加数据

结果:

(2)删除

清除,只是把这三个元素的地址给删掉了,这三个元素还在堆中存在

(3)遍历
- 第一种方式:使用增强for

结果:

- 第二种方式:使用迭代器

(4)判断

注意:
这个一定是false
3 List接口与实现类
- 特点:有序(添加的顺序和遍历的顺序是一致的)、有下标、元素可以重复。
- 方法:
void add(int index, 0bject o) //在 index位置插入对象o。
boolean addAll(int index, Collection c) //将一个集合中的元素添加到此集合中的index位置。
Object get(int index) //返回集合中指定位置的元素。
List subList(int fromIndex,int toIndex) //返回fromIndex和toIndex之间的集合元素。
3.1 List 接口使用(1)
(1)添加元素

结果:

(2)删除元素

(3)遍历
第一种方式:使用for

第二种方式:使用增强for

第三种方式:使用迭代器

第四种方式:使用列表迭代器
和Iterator的区别,ListIterator可以向前或向后遍历, 添加,删除,修改元素
由前向后遍历

由后向前遍历
由于在前向遍历时指针已经挪到了最后

结果:

(4)判断

(5)获取位置

3.2 List 接口使用(2)
(1)创建集合并添加数字数据

结果:

注意:添加数字数据的时候隐藏了一个自动装箱的操作,众所周知集合不能添加基本类型,只能添加引用类型
(2)删除操作
删除数字20

正确方法除了采用Index来删除20,还可以采用:


结果:

(3)补充方法subList(fromIndex,toIndex),返回子集合 有头无尾

3.3 List实现类

3.4 ArrayList的使用
创建集合
ArrayList arrayList=new ArrayList<>();
- 添加元素:添加三个学生对象

- 删除元素
添加:

结果:

删除:
- 下面操作行不通

因为remove方法是继承了equals方法,equals(this==obj),既然这里的equals上不满足,我们可以对equals进行重写,五步法重写
@override
public boolean equals(Object obj) {
//1判断是不是网-一个对象
if(this==obj) {
return true;
}
//2判断是否为空
if(obj==nu11) {
return false;
}
//3判断是否是Student类型
if(obj instanceof student) {
student s=(student)obj;
//4比较属性
if(this.name.equals(s.getName())&&this.age=s.getAge()){
return true;
}
}//5不满足就返回false
return false
}
重写以后,就可以采取上述图的方式进行比较
- 遍历元素
- 使用迭代器

- 列表迭代器
正序

逆序

- 判断

- 查找
![image-20220408181704956]()
3.5 Vector使用



3.6 LinkedList
-
链表结构实现,增删快, 查询慢。
-
存储结构:双向链表
创建集合:

- 添加元素

- 删除 linkedList.remove()

- 遍历
for遍历

增强for遍历

迭代器

ListIterator

- 判断

- 获取

3.7 ArrayList与LinkedList的区别

-
ArrayList:必须开辟连续空间,查询快,增删慢。
-
LinkedList:无需开辟连续空间,查询慢,增删快。
4 泛型和工具类

4.1 泛型类
类名<T> T是类型占用符,只能表示一种引用类型,如果编写多个使用逗号隔开
不可以实例化,即new,因为不知道他的构造函数是私有的还是什么情况
不同泛型对象不能相互赋值
如果调用类是不写这个和泛型,说明是Object类型
创建泛型类

使用泛型类创建对象

4.2 泛型接口
接口名
创建泛型接口 不可以用泛型定义变量

实现泛型接口
方式一 给T确定类型

方式二 不给T确定类型

此时导致MyInterfaceImpl2也成了一个泛型类,通过给MyInterfaceImpl2赋值,然后实现接口中的泛型,此时调用

4.3 泛型方法

创建

调用
根据传入的数据的类型自动确定类型

4.4 泛型集合

5 Set接口与实现类
5.1 Set接口概述及使用
-
特点:无序、无下标、元素不可重复。
-
方法:全部继承自Collection中的方法。
-
实现类:
HashSet [重点] :
- 基于HashCode实现元素不重复。
- 当存入元素的哈希码相同时,会调用equals进行确认,如结果为true,则拒绝后者存入。
TreeSet:
- 基于排列顺序实现元素不重复。
创建Set类接口并添加数据

删除数据

遍历

判断

5.2 HashSet

- 代码演示——HashSet集合的使用:
存储结构:哈希表(数字+链表+红黑树)
创建HashSet类接口并添加数据

删除数据

遍历

判断

例子:

Q:怎样使框起来的重复的传不进去
了解HashCode存储过程

解决方式
(1)重写HashCode方法

此时,二者的HashCode值一样,形成链表
(2)重写equals方法

系统提供方法可以自己来重写这两个方法

重写时用到了31,为什么用到了31?
(1)31是一个质数,减少散列冲突(计算出来的HashCode尽量不同)
(2)31提高执行效事
5.3 TreeSet

- 代码演示——TreeSet集合的使用:
存储结构:红黑树
创建TreeSet类接口并添加数据
简单使用

- 使用TreeSet保存数据
存储结构:红黑树

报错:
why:红黑树要比较大小,现在没有比较的标准
要求:元素必须要实现Comparable接口,compareTo()方法返回值为日,认为是重复元素

实现方法:

字符串的comparreTo,return为双目
补充:Comparator接口
TreeSet集合等使用
Comparator :实现订制比较(比较器)
在实例化Comparator时发现:在创建集合的时候,就可以把比较规则告诉他
新建对象时,采用匿名内部类的方法,实现Comparator接口

TreeSet案例



6 Map接口与实现类

6.1 Map父接口

6.2 Map接口的使用
创建与添加元素
- 加重复的KEY时,后面的会把前面的键值覆盖掉

结果

删除

遍历
方法一:使用keySet

keyset获取的是key

map.get(key)可以通过key获取value
方法二:使用entrySet(效率较高!!!)

map.entrySet返回一个Set类,把他们封装成一个个entry,类型是Map.Entry
一个Map.Entry是一个映射对,包含一个key和value

判断

方法三:使用containsKey方法
// 判断map中是否有key
if(!map.containKey(key)){
map.put(key,1)//没有则把key存入map中
};
map中的containsKey(Key)方法是判断该key在map中是否有key存在。
6.3 HashMap


使用

结果:

注意:

怎么使他重复的键就加不进去!
使用key"hashcode和equals作为重复,重写hashcode和equals使用快捷键
- 遍历


- 判断

结果:true true
源码总结
(1)HashMap刚创建时,table是null, 为了节省空间,工当漆加第一个 元素是,table容量调整为16
(2)当元素个数大于阈值(16*0.75=12)时,会进行扩容,扩容后大小为原来的2倍。日的是减少调整元素的个数。
(3)jdk1.8当每个链表长度大于8,并且数组元素个数大于等于64时,会调整为红黑树,目的提高执行效率
(4)jdk1.8当链表长度小于6时,调整成链表
(5)jdk1.8以前,链表时头插入,jdk1. 8以后时是尾插入
(6)hashset里面用的就是hashmap的key
6.4 Hashtable与Properties

6.5 TreeMap




7 Collections工具类


结果:

二分查找:

结果:-4 ,没找到
复制:要求前后两个集合的大小一样

list转成数组

结果:Integer[]中的数字小于list长度时与list保持一致


结果:

数组转成集合

结果:集合是-一个受限集合,不能添加和删除

把基本类型数组转成集合时,雷要修改为包装炎型,例如int,不要写int



浙公网安备 33010602011771号