专栏名称: java那些事
分享java开发中常用的技术,分享软件开发中各种新技术的应用方法。每天推送java技术相关或者互联网相关文章。关注“java那些事”,让自己做一个潮流的java技术人!《java程序员由笨鸟到菜鸟》系列文章火热更新中。
目录
相关文章推荐
Java编程精选  ·  为什么不建议用 equals 判断对象相等? ·  昨天  
Java编程精选  ·  字节员工自曝:再强调一遍OD ... ·  2 天前  
芋道源码  ·  某公司新招了个牛逼的架构师后... ·  2 天前  
芋道源码  ·  用 Spring AOP 优化 IN ... ·  3 天前  
芋道源码  ·  几个必会的JDK性能监控和故障处理工具 ·  5 天前  
51好读  ›  专栏  ›  java那些事

面试中常问的List去重问题,你都答对了吗?

java那些事  · 公众号  · Java  · 2018-11-07 09:04

正文


面试中经常被问到的list如何去重,用来考察你对list数据结构,以及相关方法的掌握,体现你的java基础学的是否牢固。

我们大家都知道,set集合的特点就是没有重复的元素。如果集合中的数据类型是基本数据类型,可以直接将list集合转换成set,就会自动去除重复的元素,这个就相对比较简单。

如下示例:


public class Test {

public static void main (String[] args) {
List list = new ArrayList();
list .add( 11 );
list .add( 12 );
list .add( 13 );
list .add( 14 );
list .add( 15 );
list .add( 11 );
System.out.println( list );

Set set = new HashSet();
List newList = new ArrayList();
set .addAll( list );
newList.addAll( set );
System.out.println(newList);

}

}


输出结果为:

我们可以看到去重成功了。

在面试中被问到list去重问题,大部分回答都会是list和set互转,利用set自动去除重复属性的方法去重,但是这样的回答并不会得分。

当list集合中存储的类型是对象类型的时候,我们就不能简单的只把list集合转换成set集合。

我们定义一个对象类:


public class People {

private String name;
private String phoneNumber;

public String getName () {
return name;
}

public void setName (String name) {
this .name = name;
}

public String getPhoneNumber () {
return phoneNumber;
}

public void setPhoneNumber (String phoneNumber) {
this .phoneNumber = phoneNumber;
}

public People (String name, String phoneNumber) {
super ();
this .name = name;
this .phoneNumber = phoneNumber;
}

@Override
public String toString () {
return "People{" +
"name='" + name + '\'' +
", phoneNumber='" + phoneNumber + '\'' +
'}' ;
}

}


我们使用上面的set去重的方法去重:


public static void main ( String[] args ) {
List listPeople = new ArrayList ();
listPeople. add ( new People( "张三" , "11111" ));
listPeople. add ( new People( "张三" , "22222" ));
listPeople. add ( new People( "李四" , "33333" ));
listPeople. add ( new People( "张三" , "22222" ));

Set setData = new HashSet ();
setData.addAll(listPeople);
System. out .println( "list:" + listPeople.toString());
System. out .println( "set:" + setData.toString());

}


运行后输出的结果为:

我们可以看到第二个张三和最后一个张三,信息都一样,却没有被去重。

当list集合中存储的是对象时,我们需要在对象的实体类中去重写equals()方法和hashCode()方法,如下:


public class People {

private String name;
private String phoneNumber;

public String getName () {
return name;
}

public void setName (String name) {
this .name = name;
}

public String getPhoneNumber () {
return phoneNumber;
}

public void setPhoneNumber (String phoneNumber) {
this .phoneNumber = phoneNumber;
}

public People (String name, String phoneNumber) {
super ();
this .name = name;
this .phoneNumber = phoneNumber;
}

@Override
public String toString () {
return "People{" +
"name='" + name + '\'' +
", phoneNumber='" + phoneNumber + '\'' +
'}' ;
}

@Override
public boolean equals (Object arg0) {
// TODO Auto-generated method stub
People p = (People) arg0;
return name.equals(p.name) && phoneNumber.equals(p.phoneNumber);
}

@Override
public int hashCode () {
// TODO Auto-generated method stub
String str = name + phoneNumber;
return str.hashCode();
}

}


此时运行上面的test方法,去重就成功了。

最后,我们拿出String中的equals()方法和hashCode()方法源码来加深认识:







请到「今天看啥」查看全文