叨逼叨两句
如果想把事情做的尽可能好,事情还真是不少啊,这个星期估计都没法一天完成一天的课程了,但一定要做到分的次数不超过三次,哪怕熬夜也要完成。
17-1:HashSet存储字符串并遍历
- Set集合,无索引,不可重复,无序(存取顺序不一致)
package com.test.demo30;
import java.util.HashSet;
public class Demo37 {
public static void main(String[] args) {
//Set集合,无索引,不可重复,无序(存取顺序不一致)
HashSet<String> a = new HashSet<String>();
boolean b1 = a.add("a");
boolean b2 = a.add("a");
System.out.println(a); //HashSet的继承体系中重写了toString方法
System.out.println(b1); //true
System.out.println(b2); //false
}
}
17-(2-4):HashSet保证元素唯一性的原理
原理
- 使用HashSet存储元素时需要去除重复元素,如果每次存储时都用equals方法进行比较,那效率实在是低,为解决这个问题,人们想出用哈希算法提高去重效率。
-
简单来说,就是用hashCode方法算出一个哈希值,然后在集合中查找是否有哈希值相同的对象
- 如果没有哈希值相同的对象,则直接存入集合。
- 若有哈希值相同的对象,则用equals方法进行比较,结果为false就存入,true则不存。
将自定义类的对象存入HashSet去重复
- 类中必须重写hashCode()和equals()方法
- hashCode():属性相同的对象返回值必须相同,属性不同的返回值尽量不同(提高效率)
- equals():属性相同返回true,属性不同返回false,返回false的时候存储
自动生成的hashCode代码说明
public int hashCode() {
final int prime = 31; //选取31的三个原因:1. 是质数 2. 不大不小,避免重复,也避免溢出 3. 31这个数好算,2的五次方-1,2向左移动5位
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
自动生成的equals代码说明
public boolean equals(Object obj) {
if (this == obj) //调用的对象和传入的对象是一个对象
return true;
if (obj == null) //传入的对象为null
return false;
if (getClass() != obj.getClass()) //内存中字节码文件是唯一的,这里判断两个对象对应的字节码文件是否是一个
return false;
Person other = (Person) obj;// 上面三步已经确定它是Person对象,所以在这里强制转换,不会有异常
if (age != other.age) //调用对象的年龄不等于传入的对象的年龄
return false;
if (name == null) { //调用对象的姓名为null时的情况
if (other.name != null)
return false;
} else if (!name.equals(other.name)) //调用对象的姓名不为null的情况【此时可以放心用equals方法,不担心空指针异常】
return false;
return true;
}