###17.01_集合框架(HashSet存储字符串并遍历)(掌握)
-
A:Set集合的特点(无序、不重复)
*与之相对的List是可以重复的(查看API即可)B:案例演示
- HashSet存储字符串并遍历
HashSet<String> hs = new HashSet<>(); //创建HashSet对象
boolean b1 = hs.add("a");
boolean b2 = hs.add("a"); //当向set集合中存储重复元素的时候返回为false
hs.add("b");
hs.add("c");
hs.add("d");
System.out.println(hs); //HashSet的继承体系中有重写toString方法
System.out.println(b1);
System.out.println(b2);
for (String string : hs){
//只要能用迭代器迭代的,就可以使用增强for循环遍历
System.out.println(string);
}
###17.02_集合框架(HashSet存储自定义对象元素保证元素的唯一性)(掌握)
-
A:案例演示
HashSet hs = new HashSet<>();
hs.add(new Person(“张三”, 23));
hs.add(new Person(“张三”, 23));
hs.add(new Person(“李四”, 24));
hs.add(new Person(“李四”, 24));
hs.add(new Person(“李四”, 24));
hs.add(new Person(“李四”, 24)); -
重写equals()方法 和 hashCode()方法//自动生成Ctrl+Shift+s
@Opublic int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((age == null) ? 0 : age.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
} -
为什么是31?
1> 31是一个质数,质数是能被1和自己本身整除的数
2> 31这个数既不大也不小
3> 31这个数好算,2的五次方-1,2向左移动5位
总结:
在添加的时候会调用add方法触发hashCode(),根据hashcode的返回值再确定是否调用 equals方法
1> 如果hashcode()返回值相同 就会调用equals方法
2> 不同则不会调用equals方法
###17.03_集合框架(HashSet存储自定义对象元素保证元素的唯一性图解以及优化)(掌握)
- A:画图演示
- 画图演示比较过程
- B:代码优化
- 为了减少比较优化hashCode()代码
- 最终版就是自动生成
###17.04_集合框架(HashSet如何保证元素的唯一性原理)(掌握)
-
1:Hash原理
-
我们使用Set集合都是需要去掉重复元素的,如果在存储的时候逐个equals()方法去比较,效率较低,哈希算法提高了去重复的效率,降低了equals()方法的次数
-
当HashSet调用add()方法存储对象的时候,先调用对象的hashCode()方法得到一个哈希值,然后在集合中查找是否有哈希值相同的对象
* 如果没有有哈希值相同的对象直接存入 -
如果有哈希值相同的对象,就和哈希值相同的对象逐个进行equals()比较,比较结果为false就存入,true则不存
-
2:将自定义类对象存入hashSet去重复
- 类中重写hashCode()和equals()方法
- hashCode()属性相同对象返回值必须相同,属性不同的返回值尽量不同(提高效率)
- equals() 属性相同返回true,属性不相同返回false,返回false的时候存储
###17.05_集合框架(用LinkedHashSet的概述和使用)
- A:LinkedHashSet的特点
- B:案例演示
- LinkedHashSet的特点
- 可以保证怎么存怎么取
- LinkedHashSet的特点
###17.06_集合框架(练习-产生10个 1-20之间的随机数要求不重复)(掌握)
- A:案例演示
- 需求:编写一个程序,获取10个1至20的随机数,要求随机数不能重复。并把最终的随机数输出到控制台。
- 分析:
1.用Random类创建随机数对象。
2.需要存储10个随机数,而且不能重复,所以我们用HashSet集合。
3.如果HashSet的size是小于10就可以不断的存储,如果大于等于10就停止存储。
4.通过Random类中的nextInt(n)方法获取1到20之间的随机数,并将这些随机数存储在HashSet集合中。
5.遍历HashSet
//1.用Random类创建随机数对象
Random r = new Random();
//2.需要存储10个随机数,而且不能重复,所以我们用HashSet集合
HashSet<Integer> hs = new HashSet<>();
//3.如果HashSet的size是小于10就可以不断的存储,如果大于等于10就停止存储
while(hs.size() < 10) {
/*4.通过Random类中的nextInt(n)方法获取1到20之间的随机数,并将这些随机数存储在HashSet集合中*/
hs.add(r.nextInt(20) + 1);
}
// 5.遍历HashSet
for (Integer integer : hs) {
System.out.println(integer);
}
###17.07_集合框架(练习-使用Scanner从键盘读取一行输入,去掉其中重复字符, 打印出不同的那些字符)(掌握)
- A:使用Scanner从键盘读取一行输入,去掉其中重复字符, 打印出不同的那些字符
- B:步骤
分析:
1.创建Scanner对象
2.创建HashSet对象,将字符存储,去掉重复
3.将字符串转换为字符数组,获取每一个字符存储在HashSet集合中,自动去除重复
4.遍历HashSet,打印每一个字符 - C:代码
//1.创建Scanner对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入一行字符串:");
//2.创建HashSet对象,将字符存储,去掉重复
HashSet<Character> hs = new HashSet<>();
//3.将字符串转换为字符数组,获取每一个字符存储在HashSet集合中,自动去除重复
String line = sc.nextLine();
char[] arr = line.toCharArray();
for (char c : arr) { //遍历字符数组
hs.add(c);
}
//4.遍历HashSet,打印每一个字符
for(Character ch : hs) {
System.out.print(ch);
}
###17.08_集合框架(练习-将List集合中的重复元素去掉)
- A:需求:将集合中的重复元素去掉
- B:分析:
* 1.创建List集合存储若干个重复元素
* 2.单独定义方法去除重复
* 3.打印一下List集合 - C:代码
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
public class Test04 {
public static void main(String[] args) {
String[] s = {"aa","bb","aa","cc"};
List<String> asList = Arrays.asList(s);
//1.创建List集合存储若干个重复元素
List<String> list = new ArrayList<>(asList);
//2.单独定义方法去除重复
List<String> list1= delElement(list);
//3.打印
System.out.println(list1);
}
private static List<String> delElement(List<String> list) {
// 创建 set
HashSet<String> set = new HashSet<>();
// 添加到set 去重复
set.addAll(list);
// 清空
list.clear();
list.addAll(set);
return list;
}
}
###17.09_集合框架(TreeSet存储Integer类型的元素并遍历)
- A:案例演示
- TreeSet存储Integer类型的元素并遍历
###17.10_集合框架((TreeSet存储自定义对象)
- A:案例演示
- 存储Person对象
###17.11_集合框架(TreeSet保证元素的唯一和自然排序的原理图解)
- A:画图演示
*TreeSet保证元素的唯一和自然排序的原理图解
###17.12_集合框架(TreeSet存储自定义对象并遍历练习)
- A:案例演示
- TreeSet存储自定义对象并遍历 - (按照姓名排序)
###17.13_集合框架(TreeSet存储自定义对象并遍历练习)
- A:案例演示
- TreeSet存储自定义对象并遍历 - (按照姓名长度排序)
###17.14_集合框架((TreeSet保证元素的唯一和比较器排序的原理以及代码实现)
- A:案例演示
- TreeSet保证元素的唯一和比较器排序的原理以及代码实现
###17.15_集合框架(TreeSet原理)(掌握)
- 1.特点
- TreeSet是用来排序的,可以指定一个顺序,对象存入之后就会按照指定的顺序排列
- 2.使用方式
- a.自然排序
TreeSet类的add()方法中会把存入的对象提升为Comparable类型
调用对象的compareTo()方法和集合的对象比较
根据compareTo()方法返回的结果进行存储 - b.比较器比较(Comparator)
创建TreeSet的时候可以制定一个Comparator
如果传入了Comparator的子类对象,那么TreeSet就会按照比较器中的顺序排序
add()方法内部会自动调用Comparator接口中的compare()方法排序 - c.区别
TreeSet构造函数什么都不传。默认是按照Comparable的顺序,没有就报错
TreeSet如果传入Comparator,就会按照Comparator的进行排序
- a.自然排序
###17.16_集合框架(练习)
-
在一个集合中存储了无序并且重复的字符串,定义一个方法,让其有序(字典顺序),而且还不能去除重复
-
分析:
-
1.定义一个List集合,并存储重复的无序的字符串
-
2.定义方法对其排序保留重复
-
3.打印List集合
###17.17_集合框架(练习)
- 从键盘接收一个字符串, 程序对其中所有字符进行排序,例如键盘输入: helloneudeu程序打印:deeehllnouu
- 分析:
- 1.键盘录入字符串,Scanner
- 2.将字符串转换为字符数组
- 3.定义TreeSet集合,传入比较器对字符排序并保留重复
- 4.遍历字符数组,将每一个字符存储在TreeSet集合中
- 5.遍历TreeSet集合,打印每一个字符
###16.18_集合框架(练习)
- 程序启动后, 可以从键盘输入接收多个整数, 直到输入quit时结束输入. 把所有输入的整数倒序排列打印.
- 1.创建Scanner对象,键盘录入
- 2.创建TreeSet集合对象,TreeSet集合中传入比较器
- 3.无限循环不断接收整数,遇到quit退出,因为退出是quit,所以键盘录入的时候应该都以字符串的形式录入
- 4.判断是quit就退出,不是将其转换为Integer,并添加到集合中
- 5.遍历TreeSet集合并打印每一个元素