面试中经常被问到的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)
{
People p = (People) arg0;
return
name.equals(p.name) && phoneNumber.equals(p.phoneNumber);
}
@Override
public
int
hashCode
()
{
String str = name + phoneNumber;
return
str.hashCode();
}
}
此时运行上面的test方法,去重就成功了。
最后,我们拿出String中的equals()方法和hashCode()方法源码来加深认识: