在Java编程中常会用到集合(Collection),但Java API提供了大量的集合的实现 ,而每种集合的实现又有不同的优点,可以简化我们的编程 。尤其是在各大公司笔试面试时,会出现大量的有关于集合的各种实现的题,而多种实现又容易记混或忘记,导致各种情况的发生。下面是我的一些学习体会和总结,希望能对大家有所帮助。
首先介绍集合的所有实现:
1.Vector
2.ArrayList
3.LinkedList
4.HashSet
5.LinkedHashSet
6.TreeSet
其中Vector、ArrayList、LinkedList实现了List接口,同时List接口有继承了Collection接口。LinkedHashSet继承了HashSet类,HashSet又实现了Set接口,Set接口继承了Collection接口。
接下来介绍集合的所有实现每种所具有的优点:
1.Vector 线程较为安全且支持多线程,但效率不高
2.ArrayList 线程不安全且不支持多线程,常用于需要大量查询的程序,效率较高
3.LinkedList 经常用于需要大量增加或删除数据的程序
4.HashSet 不可向其中插入重复的元素,且插入的元素随机存储
5.LinkedHashSet 此实现与 HashSet 的不同之外在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,即按照将元素插入到 set 中的顺序(插入顺序)进行迭代。注意,插入顺序不 受在 set 中重新插入的 元素的影响。
6.TreeSet 对插入的元素进行排序,排序方法由CompareTo()方法进行定义。
下面是我编写的一些小程序能够更直观的理解Collection的实现的优缺点和注意事项:
1.Vector编写的程序:
package collection; import java.util.Calendar; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Vector; public class Test007 { public static void main(String[] args) { Listlist = new Vector (); list.add("A"); list.add("A"); list.add("B"); list.add("C"); list.add("A"); list.add("D"); Iterator ite = list.iterator(); while(ite.hasNext()){ System.out.println(ite.next()); } System.out.println(list); Calendar c = Calendar.getInstance(); long l1 = System.currentTimeMillis(); System.out.println(l1); for(int i=0;i<1000000;i++){ list.add("A"); } long l2 = System.currentTimeMillis(); System.out.println(l2); System.out.println("程序运行的时间(单位:毫秒):"+(l2-l1)); } }
输出的结果为:
2.用ArrayList编写的程序:
package collection; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Test006 { public static void main(String[] args) { Listlist = new ArrayList (); list.add("1"); list.add("2"); list.add("2"); list.add("3"); list.add("4"); list.add("5"); list.add("2"); list.add("6"); list.add("7"); System.out.println(list); Iterator ite = list.iterator(); while(ite.hasNext()){ System.out.println(ite.next()); } long l1 = System.currentTimeMillis(); System.out.println(l1); for(int i=0;i<1000000;i++){ list.add("a"); } long l2 = System.currentTimeMillis(); System.out.println(l2); long l3 = l2 - l1; System.out.println("程序运行时间(单位:毫秒):"+l3); } }
程序运行的结果为:
3.用LinkedList编写的程序:
package collection; import java.util.Iterator; import java.util.LinkedList; import java.util.List; public class Test006 { public static void main(String[] args) { Listlist = new LinkedList (); list.add("1"); list.add("2"); list.add("2"); list.add("3"); list.add("4"); list.add("5"); list.add("2"); list.add("6"); list.add("7"); System.out.println(list); Iterator ite = list.iterator(); while(ite.hasNext()){ System.out.println(ite.next()); } long l1 = System.currentTimeMillis(); System.out.println(l1); for(int i=0;i<1000000;i++){ list.add("a"); } long l2 = System.currentTimeMillis(); System.out.println(l2); long l3 = l2 - l1; System.out.println("程序运行时间(单位:毫秒):"+l3); } }
程序运行的结果为:
4.用HashSet编写的程序:
package collection; import java.util.Calendar; import java.util.HashSet; import java.util.Iterator; public class Test001 { public static void main(String[] args) { HashSeths = new HashSet (); hs.add("one"); hs.add("one"); hs.add("two"); hs.add("three"); hs.add("four"); hs.add("five"); hs.add("five"); System.out.println(hs); Iterator ite = hs.iterator(); while(ite.hasNext()){ System.out.println(ite.next()); } System.out.println(hs); Calendar c = Calendar.getInstance(); long l1 = System.currentTimeMillis(); System.out.println(l1); for(int i=0;i<1000000;i++){ hs.add("A"); } long l2 = System.currentTimeMillis(); System.out.println(l2); System.out.println("程序运行的时间(单位:毫秒):"+(l2-l1)); } }
程序运行的结果为:
5.用LinkedHashSet写的程序:
package collection; import java.util.Calendar; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; public class Test001 { public static void main(String[] args) { HashSeths = new LinkedHashSet (); hs.add("one"); hs.add("one"); hs.add("two"); hs.add("three"); hs.add("four"); hs.add("five"); hs.add("five"); System.out.println(hs); Iterator ite = hs.iterator(); while(ite.hasNext()){ System.out.println(ite.next()); } System.out.println(hs); Calendar c = Calendar.getInstance(); long l1 = System.currentTimeMillis(); System.out.println(l1); for(int i=0;i<1000000;i++){ hs.add("A"); } long l2 = System.currentTimeMillis(); System.out.println(l2); System.out.println("程序运行的时间(单位:毫秒):"+(l2-l1)); } }
程序的运行结果为:
6.用TreeSet写的程序:
这是Perion类 其中包含一些属性和方法:
package collection; public class Perion /*implements Comparable*/{ private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public int hashCode() { System.out.println(this.name+"hashcode"); final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { System.out.println(this.name+"equals"); if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Perion other = (Perion) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } public Perion(String name, int age) { super(); this.name = name; this.age = age; } @Override public String toString() { return "Perion [name=" + name + ", age=" + age + "]"; } /*public int compareTo(Perion o){ return o.age-this.age; }*/ }
下面是用TreeSet写的程序,其中TreeSet存储的是Perion对象及属性:
package collection; import java.util.Comparator; import java.util.Iterator; import java.util.TreeSet; public class Test005 { public static void main(String[] args) { TreeSetlt = new TreeSet (new Comparator (){ @Override public int compare(Perion o1, Perion o2) { // System.out.println(o1.getName()+":"+o2.getName()); return o1.getAge()-o2.getAge(); } }); Perion p1 = new Perion("zhangsan",30); Perion p2 = new Perion("lisi",20); Perion p3 = new Perion("zhangsan",30); Perion p4= new Perion("liebei",40); lt.add(p1); lt.add(p2); lt.add(p3); lt.add(p4); System.out.println(lt); Iterator ite = lt.iterator(); while(ite.hasNext()){ System.out.println(ite.next()); } long l1 = System.currentTimeMillis(); System.out.println(l1); for(int i=0;i<1000000;i++){ lt.add(p1); } long l2 = System.currentTimeMillis(); System.out.println(l2); long l3 = l2 - l1; System.out.println("程序运行时间(单位:毫秒):"+l3); } /*static class PerionCom implements Comparator { @Override public int compare(Perion o1, Perion o2) { System.out.println(o1.getName()+":"+o2.getName()); return o1.getAge()-o2.getAge(); } }*/ }
程序的运行结果为:
在本程序中有两处被注释掉了 在此我解释下,在TreeSet中存储的元素必须是可排序的,如果向其中存储对象,必须给定排序的方法,本程序给了最常用的三种方法:
1.在Perion类中重写CompareTo()方法实现可排序
2.在Test005类中利用内部类重写CompareTo()方法实现可排序
3.在Test005类中利用匿名类重写CompareTo()方法实现可排序
以上是我学习过程中的一些总结 希望能对大家排除一些疑惑
此敬