Java 集合:HashSet 与 ArrayList
Set 集合是无序不可以重复的的、List 集合是有序可以重复的。
Java 集合:HashSet 与 hashCode、equals 博客里面已经说到这个问题,但是解释的还是不够清楚。
看一个小例子:
package mark.zhang;
import java.util.ArrayList;
import java.util.HashSet;
public class Test {
public static void main(String[] args) {
ArrayList<Integer> loadsList = new ArrayList<Integer>();
loadsList.add(1);
loadsList.add(2);
loadsList.add(0);
loadsList.add(3);
loadsList.add(2);
loadsList.add(1);
loadsList.add(3);
loadsList.add(5);
loadsList.add(0);
System.out.println("the arrayList: " + loadsList);
HashSet<Integer> loadsSet = new HashSet<Integer>();
loadsSet.add(1);
loadsSet.add(2);
loadsSet.add(0);
loadsSet.add(3);
loadsSet.add(2);
loadsSet.add(1);
loadsSet.add(3);
loadsSet.add(5);
loadsSet.add(0);
System.out.println("the hashSet: " + loadsSet);
}
}
import java.util.ArrayList;
import java.util.HashSet;
public class Test {
public static void main(String[] args) {
ArrayList<Integer> loadsList = new ArrayList<Integer>();
loadsList.add(1);
loadsList.add(2);
loadsList.add(0);
loadsList.add(3);
loadsList.add(2);
loadsList.add(1);
loadsList.add(3);
loadsList.add(5);
loadsList.add(0);
System.out.println("the arrayList: " + loadsList);
HashSet<Integer> loadsSet = new HashSet<Integer>();
loadsSet.add(1);
loadsSet.add(2);
loadsSet.add(0);
loadsSet.add(3);
loadsSet.add(2);
loadsSet.add(1);
loadsSet.add(3);
loadsSet.add(5);
loadsSet.add(0);
System.out.println("the hashSet: " + loadsSet);
}
}
代码很简单,分别使用 ArrayList、HashSet 装载 Integer 数据,然后打印集合的内容。
List 中的元素是按照 add 顺序加载的,并且里面有重复的元素。这就是有序可重复的意思。
Set 中的元素并没有按照 add 顺序加载的,并且里面没有重复的元素。这就是无序不可重复的意思。
换句话说,有序不是指按照字母顺序或者数字大小来排列的,重复是指元素之间 equals 为 true。
这里选择 Integer,因为其重写了 equals 方法。
那麽,我们思考一个问题:如何去掉 List 里面重复的元素?参考代码:
package mark.zhang;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
public class Test {
public static void main(String[] args) {
ArrayList<Integer> loadsList = new ArrayList<Integer>();
loadsList.add(1);
loadsList.add(2);
loadsList.add(0);
loadsList.add(3);
loadsList.add(2);
loadsList.add(1);
loadsList.add(3);
loadsList.add(5);
loadsList.add(0);
System.out.println("remove before--- the arrayList: " + loadsList);
// remove the repeated element
// rmRepeatedElement(loadsList);
rmRepeadtedElementByOrder(loadsList);
System.out.println("remove after--- the arrayList: " + loadsList);
}
public static void rmRepeatedElement(List<Integer> list) {
HashSet<Integer> loadsSet = new HashSet<Integer>(list);
list.clear();
list.addAll(loadsSet);
}
public static void rmRepeadtedElementByOrder(List<Integer> list) {
HashSet<Integer> loadsSet = new HashSet<Integer>();
ArrayList<Integer> loadsList = new ArrayList<Integer>();
for(Iterator<Integer> iterator = list.iterator(); iterator.hasNext();) {
Integer element = iterator.next();
if(loadsSet.add(element)) {
loadsList.add(element);
}
}
list.clear();
list.addAll(loadsList);
}
}
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
public class Test {
public static void main(String[] args) {
ArrayList<Integer> loadsList = new ArrayList<Integer>();
loadsList.add(1);
loadsList.add(2);
loadsList.add(0);
loadsList.add(3);
loadsList.add(2);
loadsList.add(1);
loadsList.add(3);
loadsList.add(5);
loadsList.add(0);
System.out.println("remove before--- the arrayList: " + loadsList);
// remove the repeated element
// rmRepeatedElement(loadsList);
rmRepeadtedElementByOrder(loadsList);
System.out.println("remove after--- the arrayList: " + loadsList);
}
public static void rmRepeatedElement(List<Integer> list) {
HashSet<Integer> loadsSet = new HashSet<Integer>(list);
list.clear();
list.addAll(loadsSet);
}
public static void rmRepeadtedElementByOrder(List<Integer> list) {
HashSet<Integer> loadsSet = new HashSet<Integer>();
ArrayList<Integer> loadsList = new ArrayList<Integer>();
for(Iterator<Integer> iterator = list.iterator(); iterator.hasNext();) {
Integer element = iterator.next();
if(loadsSet.add(element)) {
loadsList.add(element);
}
}
list.clear();
list.addAll(loadsList);
}
}
What Doesn't Kill Me Makes Me Stronger