面试题答案
一键面试1. distinct方法在基本数据类型流和对象流上去重原理的不同
- 基本数据类型流:在基本数据类型流(如
IntStream
、DoubleStream
等)中,distinct
方法基于值本身进行去重。基本数据类型的值是直接存储在内存中的,distinct
方法通过比较值来判断元素是否重复。例如,在IntStream
中,两个int
值相等(即数值完全一样)就被视为重复元素,会被去除。 - 对象流:对于对象流(如
Stream<User>
),distinct
方法默认基于对象的内存地址(即对象的标识)来判断重复。如果两个对象的内存地址相同,就认为它们是重复的。然而,通常情况下,我们希望基于对象的某些属性来判断重复,而不是内存地址。这就需要自定义重复判断逻辑。
2. 对User对象组成的流进行去重(name和age都相同时视为重复元素)
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
class User {
private String name;
private int age;
public User(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;
User user = (User) o;
return age == user.age && Objects.equals(name, user.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
public class Main {
public static void main(String[] args) {
List<User> userList = new ArrayList<>();
userList.add(new User("Alice", 25));
userList.add(new User("Bob", 30));
userList.add(new User("Alice", 25));
List<User> distinctUserList = userList.stream()
.distinct()
.collect(Collectors.toList());
distinctUserList.forEach(user -> System.out.println("Name: " + user.getName() + ", Age: " + user.getAge()));
}
}
在上述代码中:
- 首先在
User
类中重写了equals
方法,定义了两个User
对象相等的条件是name
和age
都相同。 - 同时重写了
hashCode
方法,以确保在使用distinct
方法时,哈希表能够正确地判断对象是否重复。因为distinct
方法在内部使用HashSet
来实现去重,HashSet
依赖hashCode
和equals
方法来判断元素是否重复。 - 然后通过
Stream
的distinct
方法对User
对象流进行去重,最后收集结果。