hash如何判断元素重复,HashSet添加元素时,HashSet会调用对象的HashCode()方法来获得对应的hashCode然后根据hashCode来运算这个元素应该存放的位置,如果equals方法比较返回值为true,但是hashCode值不同,hashCode添加到不同位置,依然添加成功,如果hashCode相同,但是equals返回false,在相同位置添加两个元素(通过链表方法存储)。
开发时判断两个元素是否相等,我们需要重写equals和hashCode,保证hashCode与equals 的一致性,如果equals返回为true,则他们的hashCode应该相等
代码实例
package com.hsahset;
import java.util.HashSet;
import java.util.Set;
import java.util.function.Consumer;
public class HashSetTest {
private static class User{
private String name;
public User(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
@Override
public boolean equals(Object obj) {
System.out.println("equals使用");
return super.equals(obj);
//return true;
}
@Override
public int hashCode() {
System.out.println("hashcode使用");
return super.hashCode();
//return 1;
}
}
public static void main(String[] args) {
Set persons = new HashSet();
persons.add(new User("hhh"));
persons.add(new User("aaa"));
persons.add(new User("bbb"));
persons.add(new User("cccc"));
persons.add(new User("cccc"));
//hashset只能添加不同的元素
System.out.println(persons);
persons.forEach(o -> System.out.println(o));
}
}
package com.hsahset;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.function.Consumer;
public class LinkHashSetTest {
public static void main(String[] args) {
//
Set person = new LinkedHashSet();
person.add(5);
person.add(3);
person.add(7);
person.add(2);
person.add(8);
person.add(9);
person.forEach(new Consumer() {
@Override
public void accept(Object o) {
if (person.contains(7)){
System.out.println("7chuxian");
}
}
});
System.out.println(person);
}
}
package com.hsahset;
import java.util.Set;
import java.util.TreeSet;
public class TreeSetTest {
public static void main(String[] args) {
TreeSet num = new TreeSet();
num.add(5);
num.add(3);
num.add(7);
num.add(8);
num.add(2);
num.add(1);
System.out.println(num);
System.out.println(num.first());
System.out.println(num.last());
//返回指定元素之前元素
System.out.println(num.lower(7));
//返回指定元素之后元素
System.out.println(num.higher(7));
//返回元素之间的元素
System.out.println(num.subSet(2, 5));
//小于值输出
System.out.println(num.headSet(5));
}
}
当输入其他时
对象比较大小继承Comparable接口比较大小
TreeSet会调用集合元素comparaTo(Object obj)方法来比较集合元素的大小关系,然后将集合元素按照升序排列,这种方式叫做自然排列
Comparable接口,接口中定义了comparaTo(Object obj)方法,该方法返回一个整数值,当我们调用该方法和另外一个对象比较时
obj1.comparaTo(obj2)
Java中有一些类已经实现了这个Comparable接口了,比如BigDecimal,BigIntrger,Character,Boolean,String,Date,Time
package com.hsahset;
import java.util.Set;
import java.util.TreeSet;
public class TreeSetTest {
public static class User implements Comparable{
//User实现了Comparable之后,User对象边长一个可比较大小对象
private int age;
public User(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"age=" + age +
'}';
}
//判断当前对象和参数对象比较大小
//if当前对象比参数对象小,返回一个负整数,相等返回零,大于返回正整数
@Override
public int compareTo(Object o) {
User user = (User) o;
return this.age-user.age;
}
}
public static void main(String[] args) {
TreeSet user = new TreeSet();
user.add(new User(16));
user.add(new User(12));
user.add(new User(17));
user.add(new User(14));
user.add(new User(18));
user.add(new User(19));
user.add(new User(11));
System.out.println(user);
}
}
定制排序
通过对元素对象实现Comparable接口来做我们的排序,但是有时候使用的类已经提供好了,打包到jar文件里面去了,无法编辑对应的代码,这个时候我们可以在创建代码的时候定制我们的排序
package com.hsahset;
import java.util.Comparator;
import java.util.TreeSet;
public class TreeSetTest02 {
public static class User{
//User实现了Comparable之后,User对象边长一个可比较大小对象
private int age;
public User(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"age=" + age +
'}';
}
}
public static void main(String[] args) {
TreeSet user = new TreeSet((o1, o2) -> {
User u1 = (User) o1;
User u2 = (User) o2;
return u1.age-u2.age;
});
user.add(new User(16));
user.add(new User(12));
user.add(new User(17));
user.add(new User(14));
user.add(new User(18));
user.add(new User(19));
user.add(new User(11));
System.out.println(user);
}
}
枚举的集合类
package com.hsahset;
import java.util.EnumSet;
public class EnumSetTest {
//定义一个枚举
private static enum Season{
SPRING,SUMMER,AUTUMN,WINTER
}
public static void main(String[] args) {
EnumSet es1 = EnumSet.allOf(Season.class);
System.out.println(es1);
EnumSet es2 = EnumSet.noneOf(Season.class);
System.out.println(es2);
es2.add(Season.SUMMER);
}
}