如何在Java中从LinkedHashSet中查找用户定义的对象?

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方法进行比较。

后端开发标签