LinkedHashSet介绍
LinkedHashSet是Java中Set接口的一个实现类,它基于哈希表和链表实现。 和HashSet类似,它也是一个不允许重复元素的集合。但是,LinkedHashSet保留了元素插入的顺序,这意味着元素的顺序在迭代中保持不变。
用户定义的对象
在Java中,所有的对象都继承了Object类,因此,每个对象都有toString()方法,可以用来将对象转换为字符串表示形式。
但是,如果我们想在LinkedHashSet中查找用户定义的对象,需要在对象中重写equals方法和hashCode方法,以确保对象可以与其他对象进行比较和哈希。
重写equals方法和hashCode方法
在Java中,equals方法是用来比较两个对象是否相等的。如果我们没有重写equals方法,默认情况下它会比较对象的地址,即两个对象是否指向同一内存地址。
hashCode方法用来返回对象的哈希码。如果我们没有重写hashCode方法,默认情况下它会返回对象的内存地址的哈希码。
因此,重写equals方法和hashCode方法可以确保对象可以正确比较和哈希。
重写equals方法
重写equals方法的目的是比较两个对象的内容是否相等。通常,我们需要比较对象的所有属性值是否相等。
例如,我们定义了一个Person类:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
}
}
在上面的代码中,equals方法比较了Person对象的name属性和age属性是否相等。
重写hashCode方法
重写hashCode方法的目的是确保哈希表可以正确地找到存储元素的位置。如果两个对象相等,则它们的哈希码也应相等。
例如,我们可以按以下方式重写hashCode方法:
@Override
public int hashCode() {
return Objects.hash(name, age);
}
在上面的代码中,hashCode方法返回了name属性和age属性的哈希码的和。
从LinkedHashSet中查找对象
使用contains方法可以查找对象是否在集合中。
Person person1 = new Person("张三", 20);
Person person2 = new Person("李四", 30);
Person person3 = new Person("张三", 20);
Set<Person> set = new LinkedHashSet<>();
set.add(person1);
set.add(person2);
if (set.contains(person3)) {
System.out.println("集合中包含对象");
} else {
System.out.println("集合中不包含对象");
}
在上面的代码中,我们创建了一个LinkedHashSet,并向其中添加了person1和person2对象。然后,我们创建了一个新的Person对象person3,它的name和age属性与person1相同。调用contains方法时,它将返回true,因为LinkedHashSet将根据equals方法判断两个对象是否相等。
总结
在Java中,使用LinkedHashSet存储对象可以保持元素的插入顺序,并且确保元素不重复。如果要在LinkedHashSet中查找用户定义的对象,则需要重写equals方法和hashCode方法。
重写equals方法的目的是比较对象的内容是否相等。重写hashCode方法的目的是确保哈希表可以正确地找到存储元素的位置。
使用contains方法可以查找对象是否在集合中。它将根据equals方法进行比较。