Java的集合类型主要有如下几种:
Set/Queue/List/Set/Tree/Stack等。
我们首先来看一个HashSet的用法:
package com.freesoft.javaadvanced; import java.util.HashSet; import com.freesoft.testentity.Kalamata; import com.freesoft.testentity.Ligurio; import com.freesoft.testentity.Olive; import com.freesoft.testentity.Picholine; public class TestHashSet { public static void printSize(HashSet<Olive> olives){ System.out.println("There are " + olives.size() + " olives in the set."); } public static void main(String[] args) { HashSet<Olive> olives = new HashSet<>(); Olive k = new Kalamata(); Olive l = new Ligurio(); Olive p = new Picholine(); olives.add(k); olives.add(l); printSize(olives); olives.add(p); printSize(olives); // 由于HashSet内部元素需要通过Hash Value识别,所以同一个元素无法保存两次 olives.add(p); printSize(olives); // HashSet中可以添加null olives.add(null); printSize(olives); // 删除元素 olives.remove(k); printSize(olives); } }
注意每次运行的时候HashSet内元素的顺序不是一成不变的。
接下来我们看看如何使用TreeSet。TreeSet是一个自动排序的集合,所以我们需要对泛型对象的类实现Comparable接口:
package com.freesoft.testentity; public class Olive implements Comparable<Olive>{ public static final long BLACK = 0x000000; private String name; private long color = BLACK; public Olive(){ } public Olive(String name) { // 由于字段color已经被设置为默认值为BLACK,故这里无需再次设置 this.name = name; } public Olive(String name, long value) { super(); this.name = name; this.color = value; } @Override public String toString() { return "Olive [name=" + name + ", color=" + color + "]"; } @Override public int compareTo(Olive arg0) { String s1 = this.name; String s2 = arg0.name; return s1.compareTo(s2); } }
package com.freesoft.testentity; public class Kalamata extends Olive { public Kalamata() { super("Kalamata"); } }
package com.freesoft.javaadvanced; import java.util.HashSet; import java.util.TreeSet; import com.freesoft.testentity.Kalamata; import com.freesoft.testentity.Ligurio; import com.freesoft.testentity.Olive; import com.freesoft.testentity.Picholine; public class TestTreeSet { public static void printSize(TreeSet<Olive> olives){ System.out.println("There are " + olives.size() + " olives in the set."); } public static void main(String[] args) { Olive l = new Ligurio(); Olive p = new Picholine(); Olive k = new Kalamata(); TreeSet<Olive> olives = new TreeSet<>(); try { olives.add(k); olives.add(l); olives.add(p); } catch (Exception e) { e.printStackTrace(); } System.out.println(olives); } }
我们在来看看LinkedList这个列表:
package com.freesoft.javaadvanced; import java.util.LinkedList; import com.freesoft.testentity.Kalamata; import com.freesoft.testentity.Ligurio; import com.freesoft.testentity.Olive; import com.freesoft.testentity.Picholine; public class TestLinkedList { public static void main(String[] args) { Olive k = new Kalamata(); Olive l = new Ligurio(); Olive p = new Picholine(); LinkedList<Olive> list = new LinkedList<>(); list.add(k); list.add(l); list.add(p); System.out.println(list); // 这里的add实际上是执行插入操作,且列表中的元素可以反复添加 list.add(2, k); System.out.println(list); // 改变元素属性,该对象在列表中的引用也会及时更新 k.setColor(0xff0000); System.out.println(list); } }
我们先看一下之前的list,我们通过帮助得知LinkedList实现了Queue接口。注意体会peek和poll的区别,一个删除元素一个不删除。
package com.freesoft.javaadvanced; import java.util.LinkedList; import com.freesoft.testentity.Kalamata; import com.freesoft.testentity.Ligurio; import com.freesoft.testentity.Olive; import com.freesoft.testentity.Picholine; public class TestLinkedList { public static void main(String[] args) { Olive k = new Kalamata(); Olive l = new Ligurio(); Olive p = new Picholine(); LinkedList<Olive> olives = new LinkedList<>(); olives.add(k); olives.add(l); olives.add(p); System.out.println(olives); // 这里的add实际上是执行插入操作,且列表中的元素可以反复添加 olives.add(2, k); System.out.println(olives); // 改变元素属性,该对象在列表中的引用也会及时更新 k.setColor(0xff0000); System.out.println(olives); Olive o1 = olives.poll(); System.out.println(o1); System.out.println(olives); } }