java基础复习第十五天

Set集合里面没有什么特别的方法,学他如何保持元素唯一。

HashSet

Set集合,无索引,不可以重复,无序(存取不一致)

此类实现Set接口

HashSet<String> hs = new HashSet<>();//创建HashSet对象
boolean b1 = hs.add("a");
boolean b2 = hs.add("a");
System.out.println(hs);//[a]  HashSet的继承体系重有重写toString方法
System.out.pritnln(b1);//true
System.out.println(b2);//false

for (String string : hs){
    System.out.println(String);
}
//只要能使用迭代器的就能使用增强for

HashSet存储自定义对象保证元素唯一性

  • 存储自定义对象,并保证元素唯一。

重写了hashCode方法

public int hashCode(){
    final int Num = 38;
    return name.hashCode() * Num + age;
}
//hashCode一样的话就会调用equals方法

在开发中一般生成hashCode值,少调用equals方法。

生成的方法里面 prime = 31

1.31是一个质数,质数是能被1和自己本身整除的数

2.31这个数既不大也不小

3.31这个数好算,2的五次方-1,2向左移动五位

印度软件 -- 健壮性判断

//调用的对象和传入的对象是同一个对象

euqals方法

HashSet如何保证元素唯一性原理

HashSet原理

  • 我们使用Set集合都是需要去掉重复元素的,如果在存储的时候逐个equals()比较,效率较低,哈希算法提高了去重复的效率,降低了使用equals()方法的次数。
  • 当HashSet调用add()方法存储对象的时候,先调用对象的hashCode()方法得到一个哈希值,然后再集合重查找是否有哈希值相同的对象

    • 如果没有哈希值相同的对象就直接存入集合
    • 如果有哈希值相同的对象,就和哈希值相同的对象逐个进行equals()比较,比较结果为false就存入,true则不存入。
  • 将自定义类的对象存入HashSet去重复

    • 类重必须重写hashCode()和equals()方法
    • hashCode():属性相同的对象返回值必须相同,属性不同的返回值尽量不同(提高效率)
    • equals():属性相同返回true,属性不同返回false,返回false的时候存储

LinkedHashSet

链表实现、存取唯一

底层是链表实现的,是set集合重唯一一个能保证怎么存就怎么取的集合对象

因为是HashSet的子类,所以也保证元素唯一,与HashSet一样。

/*
案例演示:
需求:编写一个程序,获取10个1至20的随机数,要求随机数不能重复,并把最终的随机数输出到控制台。
分析:
1.有Random类创建随机数对象
2.需要存储10个随机数,而且不能重复,所以我们用HashSet集合
3.如果HashSet的size是小于10就可以不断的存储,如果大于等于10就停止存储
4.通过Random类重的nextInt(n)方法会哦去1到20之间的随机数,并将这些随机数存储再HashSet集合中
5.遍历HashSet
*/

Random r = new Random();
HashSet<Integer> hs = new HashSet<>();
while(hs.seize() < 10){
    hs.add(r.nextInt())
}

集合框架练习

使用Scanner从键盘读取一行输入,去掉其中重复字符,打印出不同的那些字符。

1.创建Scanner对象

2.创建HashSet对象,将字符存储,去掉重复

3.将字符串转换为字符数组,获取每一个字符存储再HashSet集合中,自动去除重复。

4.遍历HashSet,打印每一个字符

TreeSet集合

TreeSet集合是用来对象元素进行排序的,同样他也可以保证元素的唯一。

当compareTo方法返回0的时候集合中只有一个元素

当compareTo方法返回正数的时候集合会怎么存就怎么取

当compareTO方法返回负数的时候集合会倒叙存储

二叉树:两个叉

小的存储在左边(负数),大的存储在右边(正数),相等就不存(0)

compareTo方法,在TreeSet集合如何存储元素取决于compareTo方法的返回值

1.返回0,集合中只有一个元素

2.返回-1集合会将存储的元素倒序

3.返回1,集合会怎么存就怎么取

可以实现按啥啥啥存取

写一个比较器

1.特点:

  • TreeSet类是用来排序的,可以指定一个顺序,对象存入之后会按照指定的顺序排序。

a.自然顺序(Comparable)

  • TreeSet类的add()方法中会把存入的对象提升为Comparable类型
  • 调用对象compareTo()方法和集合中的对象比较
  • 根据compareTo()方法返回的结果进行存储

b.比较器顺序(Comparator)

  • 创建TreeSet的时候可以制定一个Comparator
  • 如果传入了Comparator的子类对象,那么TreeSet就会按照比较器中的顺序排序
  • add()方法内部会自动调用Comparator接口中compare()方法排序

c.两种方式的区别

  • TreeSet构造函数什么都不传,默认按照类中Comparable的顺序
  • TreeSet如果传入Comparator就有限按照Comparator

练习

1.有一个集合存储了无序并且重复的字符串,定义一个方法,让其有序(字典顺序),而且还不能重复。

2.从键盘录入一串i字符串,程序对其中所有字符进行排序。

分析:

  1. 键盘录入字符串,Scanner
  2. 将字符串转换成字符数组
  3. 定义TreeSet集合,传入比较器对字符 排序并保留重复。
  4. 遍历TreeSet打印每一个字符

3.程序启动后,可以从键盘输入接收多个正数,直到输入quit时结束输入,把所有输入的正数倒数排列打印。

  1. 创建Scanner对象,键盘录入
  2. 创建TreeSet集合对象,TreeSet集合中传入比较器
  3. 无限循环不断接收正数,遇到quit退出,因为退出时quit,所以键盘录入的时候应该都以字符串的形式录入
  4. 判断时quit就退出,不是将其转换为Interger,并添加到集合中
  5. 遍历TreeSet集合并打印每一个元素

4.键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低输出到控制台。

本文链接:

https://heyzen.club/index.php/J/256.html
1 + 5 =
快来做第一个评论的人吧~