Day17
17.01 HashSet存储字符串并遍历
1、Set集合概述及特点
查看API,Set集合和Collection方法一模一样,没有特有的方法,我们主要学习其子类如何保证元素唯一。
HashSet实现Set接口,存和取得顺序是不一致的,每次顺序都不一样,允许存null元素,是通过HashCode算法去存储对象的
2、案例演示
HashSet存储字符串并遍历
17.02 HashSet存储自定义对象保证元素唯一性
1、案例演示
存储自定义对象,并保证元素唯一性
一个类想具备什么特点是由其功能决定的
17.02 HashSet存储自定义对象保证元素唯一性
1、案例演示
存储自定义对象,并保证元素唯一性
一个类想具备什么特点是由其功能决定的
在调用hashCode方法时,自动调用了equals方法
17.03 HashSet存储自定义对象保证元素唯一性图解及代码优化
1、画图演示说明比较过程
在调用hashCode方法时,自动调用了equals方法
俩对象只有HashCode值一样,才会去用equals进行比较,HashCode值一样的equals比较后的不同对象全部挂在了同一个HashCode下面。但是如果给属性不一样的对象算出不一样的HashCode值,就不用去对不同属性的对象进行比较了,减少了比较次数。
String类重写了HashCode,可返回字符串的哈希值
2、代码优化
为了减少比较,优化hashCode()代码写法
最终版就是自动生成即可
17.04 HashSet如何保证元素唯一性的原理
1、HashSet原理
我们使用Set集合都是需要去掉重复元素的,如果在存储的时候逐个equals方法去比较,效率较低,哈希算法提高了去重复的效率,降低了使用equals的次数
当hashSet调用add方法存储对象的时候,先调用对象的hashCode方法得到一个哈希值,然后再集合中查找是否有哈希值相同的对象:如果没有哈希值相同的对象就直接存入集合,如果有哈希值相同的对象,就和哈细值相同的对象逐个进行equals方法比较,比较结果false就存入,true就不存
2、将自定义类的对象存入HashSet去重复
类中必须重写hashCode方法和equals方法
hashCode:属性相同的对象返回值必须相同,属性不同的返回值尽量不同(提高效率,降低使用equals次数)
equals:属性相同则返回true,属性不同返回false,返回false的时候存储,如果不重写返回的equals是地址值。17.05 LinkedHashSet的概述和使用
1、LinkedHashSet的特点
底层是用链表实现的,可以保证怎么存怎么取,HashSet会保证元素唯一。只有几个构造方法,自己没有直接方法,全部来自父类HashSet或父类的父类。
2、案例演示
LinkedHashSet的特点 可以保证怎么存就怎么取,Set类中唯一可保证怎么存怎么取的集合对象
17.06 产生10个1-20之间的随机数要求随机数不能重复
1、案例演示
17.07 去除重复练习
1、使用Scanner从键盘读取一行输入,去掉其中重复字符,打印出不同的那些字符
17.08 将集合中的重复元素去掉(练习)
17.09 TreeSet存储Integer类型的元素并遍历
1、案例演示
17.10 TreeSet存储自定义对象
1、存储Person对象
17.11 TreeSet保证元素唯一和自然排序的原理和图解
TreeSet保证元素唯一和排序就看compareTo的返回值,唯一的指标
1、画图演示
17.12 TreeSet存储自定义对象并遍历练习1
1、按照姓名排序
17.13 TreeSet存储自定义对象并遍历练习2
1、按照姓名的长度排序
17.14 TreeSet保证元素唯一和比较器排序的原理及代码实现
1、案例演示
Comparator是一个比较器接口,有compare和equals方法,compare与compareTo一样,返回的是int数,0就不存,整数往右存,负数往左存。
TreeSet方法的构造函数可添加比较器,需要有个子类实现Comparator接口(子类对象就是比较器,父类引用指向子类对象),重写compare方法,不写equals方法也可以,因为从Object中默认继承了equals,重写需要的方法就可以了。
17.15 TreeSet原理
1、特点
TreeSet是用来排序的,可以指定一个顺序,对象存入之后会按照指定的顺序排列
2、使用方式
A自然排序(Comparable)
TreeSet类的add方法中会把存入的对象提升为Comparable类型
调用对象的compareTo方法和集合中的对象比较
根据compareTo方法返回的结果进行存储
B比较器排序(Comparator)
创建TreeSet的时候可以制定一个Comparator。
如果传入了Comparator的子类对象,那么TreeSet就会按照比较器
中的顺序排序,调用的对象compare方法的第一个参数,集合中的对象是compare方法的第二个参数。
add方法内部会自动调用Comparator接口中的compare方法排序。
C两种方式的区别
TreeSet构造函数什么都不传,默认按照类中Comparable的顺序(没有就报错ClassCastException)
TreeSet如果传入Comparator,就优先按照Comparator比较
17.16 练习1
在一个集合中存储了无序并且重复的字符串,定义一个方法,让其有序(字典顺序),而且还不能去除重复。
分析:无序并且重复的字符串一定是List集合。TreeSet比较时返回时0就存不进去,非0就可以存
1、定义一个List集合,用于存储重复的无序的字符串
2、定义方法对其排序,并保留重复
3、打印List集合
17.17 练习2
从键盘接收一个字符串,程序对其中所有字符进行排序,例如键盘输入:helloitcast程序打印acehillostt
17.18 练习3
程序启动后,可以从键盘输入接受多个整数,直到输入quit时结束输入,把所有输入的整数倒序(数字顺序的倒序)排列打印
八种基本数据包装类都实现了Comparable接口,重写了compareTo方法。
17.19 键盘录入学生信息按照总分排序后输出在控制台
1、案例演示
键盘录入5个学生信息(姓名,语文,数学,英语),按照总分从高到低
输出到控制台
17.20 总结
1、List
普通for循环,使用get()逐个获取(因为有索引)
调用iterator()方法得到Iterator,使用hasNext和next方法,List中有特有方法ListIterator方法
增强for循环,只要可以使用iterator的类都可以用
Vector集合可以使用Enumeration的hasMoreElements和nextElement方法
2、Set
调用iterator方法得到Iterator,使用hasNext和next方法
增强for循环,只要可以使用iterator的类都可以用
3、普通for循环,迭代器,增强for循环是否可以在遍历的过程中删除
普通for可以,但索引需要 减减
迭代器可以,使用自身的remove方法
增强for,只可以遍历不可以删除