小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
今天是九月的最后一天,明天就是十一假期了,提前先祝大家节日快乐!!假期注意安全
题目描述
给定一个整数数组,判断是否存在重复元素。
如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false
示例 1:
输入: [1,2,3,1]
输出: true
示例 2:
输入: [1,2,3,4]
输出: false
示例 3:
输入: [1,1,1,3,3,4,3,2,4,2]
输出: true
题解
1.使用hashMap,当插入的元素存在,返回false
public boolean containsDuplicate(int[] nums) {
Map<Integer, Integer> temp = new HashMap<>();
for (int i : nums) {
if (null != temp.get(i)) {
return true;
}else {
temp.put(i,i);
}
}
return false;
}
2.使用hashSet,使用add方法插入,如果插入的key已存在,那么就会返回false.否则返回true,可以通过返回的boolean来判断是否存在. 当插入的key已存在时,会返回false
public boolean containsDuplicate(int[] nums) {
HashSet<Integer> integers = new HashSet<>();
for (int i : nums) {
boolean add = integers.add(i);
if (!add) {
return true;
}
}
return false;
}
结果显示,hashSet的速度比hashMap快很多
下面是add的源码,底层还是map,为什么速度差距这么大呢?百思不得其解,有大佬知道吗?
private transient HashMap<E,Object> map;
private static final Object PRESENT = new Object();
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}