在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) {
List<String> list = new Vector<String>();
list.add("A");
list.add("A");
list.add("B");
list.add("C");
list.add("A");
list.add("D");
Iterator<String> 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));
}
}

  输出的结果为:

195840453.jpg

 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) {
List<String> list = new ArrayList<String>();
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<String> 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);
}
}

   程序运行的结果为:

200242488.jpg

  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) {
List<String> list = new LinkedList<String>();
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<String> 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);
}
}

 程序运行的结果为:

200640193.jpg

 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) {
HashSet<String> hs = new HashSet<String>();
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<String> 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));
}
}

 程序运行的结果为:

201329809.jpg

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) {
HashSet<String> hs = new LinkedHashSet<String>();
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<String> 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));
}
}

程序的运行结果为:

201639916.jpg

6.用TreeSet写的程序:

                                       这是Perion类 其中包含一些属性和方法:

package collection;
public class Perion /*implements Comparable<Perion>*/{
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) {
TreeSet<Perion> lt = new TreeSet<Perion>(new Comparator<Perion>(){
@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<Perion> 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<Perion>{
@Override
public int compare(Perion o1, Perion o2) {
System.out.println(o1.getName()+":"+o2.getName());
return o1.getAge()-o2.getAge();
}
}*/
}

程序的运行结果为:

203226719.jpg

在本程序中有两处被注释掉了 在此我解释下,在TreeSet中存储的元素必须是可排序的,如果向其中存储对象,必须给定排序的方法,本程序给了最常用的三种方法:

   1.在Perion类中重写CompareTo()方法实现可排序

   2.在Test005类中利用内部类重写CompareTo()方法实现可排序

   3.在Test005类中利用匿名类重写CompareTo()方法实现可排序

以上是我学习过程中的一些总结 希望能对大家排除一些疑惑

此敬