【⼀起学习Java8】数组去重,你会⼏种⽅式?
每⽇⼀句:你知道我喜欢吃什么吗?痴痴地望着你
前⾔
数据去重是项⽬中经常出现的应⽤场景,并且⾯试中可能也会问到,那么你会⼏种数组去重⽅式呢?
实战
使⽤额外空间去重
List<String> list = Arrays.asList("java","html","js","sql","java");
@Test
public void test8(){
List<String> newList =new ArrayList<>();
for(String el : list){
if(!ains(el)){
newList.add(el);
}
}
System.out.println(newList);
}
优点:实现简单、并且在循环判断过程中可以增加额外操作
缺点:需要⼀个额外空间⼤⼩的数组,浪费空间,多⾏代码实现
Set集合⾃动去重
List<String> list = Arrays.asList("java","html","js","sql","java");
@Test
public void test8(){
Set<String> set =new HashSet<>(list);
List<String> newList =new ArrayList<>(set);
System.out.println(newList);
}
优点:利⽤Set集合的不重复特性去重更简单
缺点:使⽤额外空间,需要来回转换,不太优雅
Java8⼀键去重(distinct)
List<String> list2 = Arrays.asList("java","html","js","sql","java");
@Test
public void test9(){
/
/ java8 stream-api去重
学习java的学习方法list2.stream()
.distinct()
.forEach(System.out::println);
}
优点:java8新特性,流式操作简单⽅便(和sql⼀样),代码优雅
缺点:⽆法在去重的过程中进⾏额外操作
distinct去重注意事项
既然这么好⽤,那distinct是通过什么去重的呢?如果是引⽤类型,是通过地址去重还是通过某些字段去重呢?
distinct去重失效⽰例代码
List<Employee> list = Arrays.asList(
new Employee("⼩明",18),
new Employee("赵六",38),
new Employee("张三",6),
new Employee("⼩明",18)
);
class Employee {
private String name;
private Integer age;
public Employee(String name, Integer age){
this.name = name;
this.age = age;
}
@Override
public String toString(){
return"Employee{"+
"name='"+ name +'\''+
", age="+ age +
'}';
}
}
@Test
public void test9(){
list.stream()
.distinct()
.forEach(System.out::println);
}
控制台输出:
Employee{name='⼩明', age=18}
Employee{name='赵六', age=38}
Employee{name='张三', age=6}
Employee{name='⼩明', age=18}
结果:使⽤⾃定义对象distinct⽆法去重,难道distinct⽆法作⽤引⽤类型吗?但是刚才的String也是引⽤类型,但是也可以去重。⾃定义的对象Employee和String有什么区别吗?没错,就是hashcode()和equals()⽅法,String已经重写了这两个⽅法,⾃定义
的Employee没有重写这两个⽅法。
注意:只要是涉及Map和Set这种去重的集合,或者Java8的distinct去重,都是通过hashcode()和equals来作为数据去重的依据,所以要注意重写这两个⽅法
修改测试
class Employee {
private String name;
private Integer age;
...
// 重写equals和hashcode⽅法
// 重写equals和hashcode⽅法
@Override
public boolean equals(Object o){
if(this== o)return true;
if(o == null ||getClass()!= o.getClass())return false;
Employee employee =(Employee) o;
return Objects.equals(name, employee.name)&&
Objects.equals(age, employee.age);
}
@Override
public int hashCode(){
return Objects.hash(name, age);
}
...
}
@Test
public void test9(){
list.stream()
.distinct()
.forEach(System.out::println);
}
控制台输出:
Employee{name='⼩明', age=18}
Employee{name='赵六', age=38}
Employee{name='张三', age=6}
重写hashcode和equals可以实现去重。
⼩总结
⽆论使⽤Set集合去重还是使⽤Java8的新特性stream流的distinct去重,都是通过hashcode()和equals()⾃定义的策略进⾏去重。最后
指尖上的代码
「指尖上的代码」,欢迎关注~
你的点赞和关注是写⽂章最⼤的动⼒~
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论