面试必问之去重,面试肯定会说,小伙子讲讲你所熟悉的去重吧~
哦了,你肯在想,soeasy,巴拉巴拉讲了半个小时,面试官肯定在想,小伙子可以啊,接着连环炮,炮火连天啊啊啊啊。。。。。
那就先讲一下去重咯,如果一个数组中有重复元素,用什么方法可以去重呢?
用List集合实现
这个方法呢,可以去重,但是达不到排序的功能
import java.util.ArrayList;
public class StudentItems {
public static void main(String[] args) {
int[] str = {88,99,895,88,99,87,25,65,87};
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < str.length; i++) {
if (!list.contains(str[i])){
list.add(str[i]);
}
}
System.out.println(list);
}
}
用List和set来一下
import java.util.HashSet;
import java.util.ArrayList;
public class StudentItems {
public static void main(String[] args) {
int[] str = {88, 99, 895, 88, 99, 87, 25, 65, 87};
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i : str
)
list.add(i);
final HashSet<Integer> nset = new HashSet<Integer>();
nset.addAll(list);
System.out.println(nset);
}
}
hashSet来一下
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.TreeSet;
public class StudentItems {
public static void main(String[] args) {
Integer[] str = { 99, 895, 88, 99, 87, 25, 65, 87};
HashSet<Integer> hset = new HashSet<>(Arrays.asList(str));
Iterator i = hset.iterator();
while (i.hasNext()) {
System.out.print(" "+i.next());
}
}
}
如下图并未进行排序
hashSet有三个重要特点:
1) 不能保证元素的排列顺序,顺序有可能发生变化
2) 不是同步的
3) 集合元素可以是null,但只能放入一个null
如果你向HashSet存入一个元素的时候,HashSet就会调用该对象的hashCode()方法来得到该对象的hashCode值,然后再根据 hashCode值来决定该对象在HashSet中存储位置。
简单的说,HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值相等
注意注意的是,如果要把一个对象放入HashSet中,重写该对象对应类的equals方法,也应该重写其hashCode()方法。其规则是如果两个对 象通过equals方法比较返回true时,其hashCode也应该相同。另外,对象中用作equals比较标准的属性,都应该用来计算 hashCode的值。
接下来,用TreeSet
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.TreeSet;
public class StudentItems {
public static void main(String[] args) {
Integer[] str = { 99, 895, 88, 99, 87, 25, 65, 87};
TreeSet<Integer> hset = new TreeSet<Integer>(Arrays.asList(str));
Iterator i = hset.iterator();
while (i.hasNext()) {
System.out.print(" "+i.next());
}
}
}
很明显这里实现了去重并排序
Arrays.asList()是将一个数组转化为一个List对象,而且会返回一个ArrayList类型的对象, 这个ArrayList类并非java.util.ArrayList类,而是Arrays类的静态内部类!
TreeSet不仅可以使元素不重复,而且可以实现排序等功能的集合,它在对象元素添加到集合中时会自动按照某种比较规则将其插入到有序的对象序列中。
TreeSet是SortedSet接口的唯一实现类,TreeSet可以确保集合元素处于排序状态。TreeSet支持两种排序方式,自然排序 和定制排序,其中自然排序为默认的排序方式。向TreeSet中加入的应该是同一个类的对象。
TreeSet判断两个对象不相等的方式是两个对象通过equals方法返回false,或者通过CompareTo方法比较没有返回0
最后呢,我们来做一个HashSet和TreeSet的比较吧:
1、TreeSet 是二差树实现的,Treeset中的数据是自动排好序的,不允许放入null值。
2、HashSet 是哈希表实现的,HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束。
3、HashSet要求放入的对象必须实现HashCode()方法,放入的对象,是以hashcode码作为标识的,而具有相同内容的 String对象,hashcode是一样,所以放入的内容不能重复。但是同一个类的对象可以放入不同的实例 。