hashNext:在迭代器中经常用到:判断后面还有没有元素。
Iterator<String> itr = hs.iterator() ;
while(itr.hasNext()){
}
HashSet集合:Set集合的子类,不存储重复的元素,同时也不像TreeSet一样添加元素的同时对元素进行排序。
hashCode方法:hashCode方法经常和equals方法一起使用,当自定义类的对象进行比较的时候,首先自动调用hashCode方法,hashCode方法会返回一个数值,如果这个数值不相同,那么就直接向HashSet中添加该对象,如果hashCode值相同,那么就再调用equals方法比较内容,如果equals返回值为false,那么就添加进集合,为true不添加。注意:比较自定义类的对象时,才调用hashCode和equals两个方法。
重写hashCode和equals方法只能尽量去除重复,不能完全去除重复。
1. 简单的 HashSet 使用迭代器的 代码:
package com.demo.main;
import java.util.HashSet;
import java.util.Iterator;
public class Main {
public static void main(String[] args) {
HashSet<String> hs = new HashSet<>() ;
hs.add("f");
hs.add("g");
hs.add("c");
hs.add("b");
hs.add("b");
hs.add("a");
hs.add("b");
hs.add("d");
hs.add("d");
hs.add("d");
hs.add("d");
hs.add("d");
hs.add("d");
hs.add("d");
hs.add("d");
hs.add("g");
hs.add("g");
System.out.println(hs);//[f, g, d, b, c, a]
Iterator<String> itr = hs.iterator() ;
while(itr.hasNext()){
String str = itr.next() ;
System.out.print(str+" ");//f g d b c a
}
}
}
系统重写的hashCode方法:
系统重写的equals方法:
面试时候可能会问:
为什么这里的prime=31?
1. 31为质数,只能被1和自身整除的数。
2. 31在质数里面不大不小
3. 31比较好计算,2的五次方-1 = 31 。
2. 比较自定义类对象 并且 尽量去除重复元素 的 代码如下:
Student.java:
package com.demo.main;
public class Student {
private String name ;
private int age ;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
Main.java:
package com.demo.main;
import java.util.HashSet;
import java.util.Iterator;
public class Main {
public static void main(String[] args) {
HashSet<Student> hs = new HashSet<>() ;
hs.add(new Student("张三",13));
hs.add(new Student("李四",14));
hs.add(new Student("王五",15));
hs.add(new Student("李四",14));
hs.add(new Student("李四",14));
hs.add(new Student("李四",14));
hs.add(new Student("赵六",16));
hs.add(new Student("陈七",17));
hs.add(new Student("陈七",17));
hs.add(new Student("陈七",17));
hs.add(new Student("陈七",17));
hs.add(new Student("陈七",17));
hs.add(new Student("陈七",17));
hs.add(new Student("陈七",17));
System.out.println(hs);
}
}
总结:
1. 比较 自定义类的对象的时候 需要重写 hashCode 和 equals 方法 ,Alt + Shift + s 系统自动重写 。
2. 重写 hashCode 和 equals ,和上火车一样 , hashCode 是 检查车票 , 如果 车票不一样 就 直接 坐到座位上,如果车票一样了,然后再用equals 核对 车票上的信息 , 车票不一样就不需要比较了,车票一样了,才进行比较,找出真正的乘客。
3. 重写了hashCode 和 equals 两个方法 , 只能尽量的去除重复 ,不能保证完全去除重复。