黑马程序员——基础知识——Set

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

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,只可以遍历不可以删除

 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值