有容乃大——Java集合

1.常见的数据结构
1.数组(ArrayList)
2.链表(LinkedList)
3.堆栈(栈) 特点 FILO
4.队列 FIFO
2.集合框架的体系
继承体系

Collection(所有集合类接口的超级接口)
|–List:特点 有序(添加的顺序)可以重复的数据
|–ArrayList :查询和修改效率高,但是删除和插入效率低。(线程不安全)
|–LinkedList :插入和删除效率高 (线程不安全)
|–Vector : 线程安全
如何选择

	到底怎么使用如何选择:
		1.有序(添加的顺序)可以重复的数据
		2.如果查询和修改的频率高-ArrayList
		3.如果插入删除频率高-LinkedList
		4.如果要求线程安全 Vector

3.ArrayList

1多查询API
2.基本数据的维护 常用的CRUD 方法
3.集合的遍历
1.for
2.增强for循环
3.迭代器
1.单向迭代器
1)Iterable 接口 有接口方法
Iterable 接口 有接口方法 Iterator iterator();
返回一个Iterator

Iterator
	hasNext() 是否有下一个(不会移动指针)
	next()  返回下一个元素(要移动指针)
	remove() 删除下一个元素
	注意:如果尚未调用 next 方法,或者在上一次调用 next 方法之后已经调用了 remove 方法
	ConcurrentModificationException:不能在迭代过程中对数据源进行改变

2.双向迭代器
2)listIterator
是List下面的方法
所有的list的实现类都可以获取 这个对象
4.LinkedList
1.多查询API
2.基于数据结构的不同,他提供了很多操作头 和尾的方法

2.不重复元素的容器
2.1 如何自定义不能存放重复元素的容器
1、现在需要我们自己设计一个容器类,不能够添加重复元素(如果元素重复了就添加不进去)
2、在前面我们设计的基于数组的自定义容器类的基础上改版
3、需要在add方法内部判断重复
4、如何判断:
每一次调用add会传入一个参数: 用户希望添加的元素 ele
遍历内部的数组,判断数组中是否包含ele
2.2 代码实现

3.HashSet

3.1 语法特点:不重复,无序(不保证和添加顺序一致)
1、不能够添加重复元素
2、初体验
可以添加案例:测试不重复和有序。

3.2 是否重复判断规则
3.2.1 引入
通过一步步测试发现:我们不同HashSet内部到底是如何判断重复的?

3.2.2判断重复的方式
① 通过添加进去的元素的hashCode+eqauls 两者进行比较
② 如果两个对象的hashCode相等 并且 两个对象调用equals结果是true 才认为两个元素重复
③ 示意图

3.2.3验证上面的规则
1 打印上面示例中的元素的hashCode和equals的结果
2 尝试自定义类,覆写hashCode 和 equals 这两个方法中的代码随便写

3.2.4 解读Integer规则
查看hashcode和equals方法源码

3.2.5实际开发情况分析(重点)
1、从上面的示例来看,结果两个都添加进去了,原因:hashCode不等,equals为false
2、从业务上来看(需要向源码时代学生管理系统中添加两个学生信息),觉得这两天数据是同一个人
3、应该怎么做: 在Student中覆写hashCode 和equals方法

4、怎么覆写?
覆写的时候应该参考实际业务中的比较规则,例如姓名,年龄等(还得看Student类中有哪些字段,并且这些字段是业务人员判断的标准)
自动生成:

4.TreeSet

4.1 语法特点
无序:不保证(不记录)我们的添加顺序;但是可以保证添加里面元素是有序的。
public static void main(String[] args) {
Set set = new HashSet();
set.add(“catepillar”);
set.add(“momor”);
set.add(“bush”);
set.add(“cateprillar”);

     System.out.println(set);
}

不重复:不能够添加重复元素(多个心眼)如何判断重复的呢?

4.2 简单体验
体验1

结果: 虽然打印结果的顺序和添加顺序可能不一致,但是感觉结果是有某种规则排序的
说明String类也实现了Comparable接口,String对象可以调用compareTo方法

体验2

结果:居然不能够放不同的类型,但是编译没有错

体验3: 添加自定义的类的对象 Student对象

结果:
疑问1:上面的代码添加的都是同种类型的数据,为什么还报错;
疑问2:为什么提示要把Student转成Comparable
正常情况 ----》 TreeSet 或者 Comparable的文档

4.3 TreeSet的结构(存储原理)分析

4.4 自然排序与定制排序(比较器)
4.4.1 自然排序 Comparable
从TreeSet的API文档中点击 “自然排序” —》 Comparable接口中
文档中的描述:
此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法

理解:
如果一个类实现了Comparable接口,可以认为这个类的对象具有自然排序的能力(本质就是这个对象可以调用比较的方法compareTo),这种比较和排序的规则就是自然排序

4.4.2 定制排序(比较器)Comparator
1、根据上面的分析,如果我们的对象没有实现Comparable接口,感觉就无法添加到TreeSet中去;(这些对象就没有自然排序的能力);
2、上面的示例设计有点问题:Student类中覆写的compareTo方法按照年龄从小到大排列的,万一有的人也是用我们的Student,希望年龄从大到小进行排列,怎么办?
不管Student里面使用何种规则都不能满足所有的人
3、解决办法: 可以给TreeSet单独的提供一个比较器(理解为比较的一个工具)
4、Comparator 是一个比较器的接口(标准),必须得有进行比较的方法 :compare(Object o1,Object o2);
自定义一个类实现Comparator接口,其中写比较规则 —》 比较器的模板
我们现在需要的是一个具体的比较器对象

示例:

4.5 判断重复的标准
1、如果采用的是自然排序调用对象的compareTo方法,如果返回0 表示相等;
2、如果使用的定制排序(比较器),调用比较器的方法compare 返回0 表示相等;

5.Collection体系

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值