首页 > 技术文章 > 集合框架的详解,List(ArrayList,LinkedList,Vector),Set(HashSet,TreeSet)-(14)

itcqx 2016-09-09 10:09 原文

 

 

集合详解:

 1 /*
 2 Collection
 3     |--List:元素是有序的,元素可以重复。因为该集合体系有索引。
 4         |--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。
 5         |--LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢。线程不同步。
 6         |--Vector:底层是数组数据结构。线程同步。被ArrayList替代了。因为效率低。
 7 
 8 
 9     |--Set:元素是无序,元素不可以重复。、
10 
11 
12 List:
13     特有方法。凡是可以操作角标的方法都是该体系特有的方法。
14 
15 16     add(index,element);
17     addAll(index,Collection);
18 
19 20     remove(index);
21 
22 23     set(index,element);
24 25     get(index):
26     subList(from,to);
27     listIterator();
28     int indexOf(obj):获取指定元素的位置。
29     ListIterator listIterator();
30 
31 
32 
33 
34 
35 List集合特有的迭代器。ListIterator是Iterator的子接口。
36 
37 在迭代时,不可以通过集合对象的方法操作集合中的元素。
38 因为会发生ConcurrentModificationException异常。
39 
40 所以,在迭代器时,只能用迭代器的放过操作元素,可是Iterator方法是有限的,
41 只能对元素进行判断,取出,删除的操作,
42 如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。
43 
44 该接口只能通过List集合的listIterator方法获取。
45 
46 */
47 
48 /*
49 |--Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。、
50     |--HashSet:底层数据结构是哈希表。是线程不安全的。不同步。
51             HashSet是如何保证元素唯一性的呢?
52             是通过元素的两个方法,hashCode和equals来完成。
53             如果元素的HashCode值相同,才会判断equals是否为true。
54             如果元素的hashcode值不同,不会调用equals。
55 
56             注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。
57 
58 
59     |--TreeSet:
60 
61 Set集合的功能和Collection是一致的。
62 
63 
64 
65 
66 */

 

 

 

 

 

  1 /*
  2 Collection
  3     |--List:元素是有序的,元素可以重复。因为该集合体系有索引。
  4         |--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。
  5         |--LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢。线程不同步。
  6         |--Vector:底层是数组数据结构。线程同步。被ArrayList替代了。因为效率低。
  7 
  8 
  9     |--Set:元素是无序,元素不可以重复。、
 10 
 11 
 12 List:
 13     特有方法。凡是可以操作角标的方法都是该体系特有的方法。
 14 
 15  16     add(index,element);
 17     addAll(index,Collection);
 18 
 19  20     remove(index);
 21 
 22  23     set(index,element);
 24  25     get(index):
 26     subList(from,to);
 27     listIterator();
 28     int indexOf(obj):获取指定元素的位置。
 29     ListIterator listIterator();
 30 
 31 
 32 
 33 
 34 
 35 List集合特有的迭代器。ListIterator是Iterator的子接口。
 36 
 37 在迭代时,不可以通过集合对象的方法操作集合中的元素。
 38 因为会发生ConcurrentModificationException异常。
 39 
 40 所以,在迭代器时,只能用迭代器的放过操作元素,可是Iterator方法是有限的,
 41 只能对元素进行判断,取出,删除的操作,
 42 如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。
 43 
 44 该接口只能通过List集合的listIterator方法获取。
 45 
 46 */
 47 
 48 
 49 import java.util.*;
 50 class ListDemo 
 51 {
 52     public static void sop(Object obj)
 53     {
 54         System.out.println(obj);
 55     }
 56     public static void method()
 57     {
 58         
 59         ArrayList al = new ArrayList();
 60 
 61         //添加元素
 62         al.add("java01");
 63         al.add("java02");
 64         al.add("java03");
 65         
 66         sop("原集合是:"+al);
 67         //在指定位置添加元素。
 68         al.add(1,"java09");
 69 
 70         //删除指定位置的元素。
 71         //al.remove(2);
 72 
 73         //修改元素。
 74         //al.set(2,"java007");
 75 
 76         //通过角标获取元素。
 77         sop("get(1):"+al.get(1));
 78 
 79         sop(al);
 80 
 81         //获取所有元素。
 82         for(int x=0; x<al.size(); x++)
 83         {
 84             System.out.println("al("+x+")="+al.get(x));
 85         }
 86 
 87         Iterator it = al.iterator();
 88 
 89         while(it.hasNext())
 90         {
 91             sop("next:"+it.next());
 92         }
 93 
 94 
 95         //通过indexOf获取对象的位置。
 96         sop("index="+al.indexOf("java02"));
 97 
 98         List sub = al.subList(1,3);
 99 
100         sop("sub="+sub);
101     }
102 
103     
104     public static void main(String[] args) 
105     {
106 
107         //演示列表迭代器。
108         ArrayList al = new ArrayList();
109 
110         //添加元素
111         al.add("java01");
112         al.add("java02");
113         al.add("java03");
114 
115         sop(al);
116 
117         
118         ListIterator li = al.listIterator();
119 
120         
121         //sop("hasPrevious():"+li.hasPrevious());
122 
123         while(li.hasNext())
124         {
125             Object obj = li.next();
126 
127             if(obj.equals("java02"))
128                 //li.add("java009");
129                 li.set("java006");
130 
131 
132         }
133 
134         while(li.hasPrevious())
135         {
136             sop("pre::"+li.previous());
137         }
138         //sop("hasNext():"+li.hasNext());
139         //sop("hasPrevious():"+li.hasPrevious());
140 
141 
142         sop(al);
143 
144 
145 
146         /*
147         //在迭代过程中,准备添加或者删除元素。
148 
149         Iterator it = al.iterator();
150 
151         while(it.hasNext())
152         {
153             Object obj = it.next();
154 
155             if(obj.equals("java02"))
156                 //al.add("java008");
157                 it.remove();//将java02的引用从集合中删除了。
158 
159             sop("obj="+obj);
160 
161 
162         }
163         sop(al);
164         */
165         
166 
167 
168     }
169 }

 

 1 import java.util.*;
 2 
 3 /*
 4 去除ArrayList集合中的重复元素。
 5 
 6 */
 7 
 8 class ArrayListTest 
 9 {
10 
11     public static void sop(Object obj)
12     {
13         System.out.println(obj);
14     }
15     public static void main(String[] args) 
16     {
17         ArrayList al = new ArrayList();
18 
19         al.add("java01");
20         al.add("java02");
21         al.add("java01");
22         al.add("java02");
23         al.add("java01");
24 //        al.add("java03");
25 
26 
27         /*
28         在迭代时循环中next调用一次,就要hasNext判断一次。
29         Iterator it = al.iterator();
30 
31         while(it.hasNext())
32         {
33             sop(it.next()+"...."+it.next());
34         }
35         */
36 
37         /**/
38         sop(al);
39         
40         al = singleElement(al);
41 
42         sop(al);
43         
44 
45     }
46 
47     public static ArrayList singleElement(ArrayList al)
48     {
49         //定义一个临时容器。
50         ArrayList newAl = new ArrayList();
51 
52         Iterator it = al.iterator();
53 
54         while(it.hasNext())
55         {
56             Object obj = it.next();
57 
58             if(!newAl.contains(obj))
59                 newAl.add(obj);
60 
61         }
62 
63         return newAl;
64     }
65 }

 

  1 import java.util.*;
  2 
  3 /*
  4 将自定义对象作为元素存到ArrayList集合中,并去除重复元素。
  5 
  6 比如:存人对象。同姓名同年龄,视为同一个人。为重复元素。
  7 
  8 
  9 思路:
 10 1,对人描述,将数据封装进人对象。
 11 2,定义容器,将人存入。
 12 3,取出。
 13 
 14 
 15 
 16 List集合判断元素是否相同,依据是元素的equals方法。
 17 
 18 
 19 
 20 */
 21 
 22 
 23 
 24 class Person
 25 {
 26     private String name;
 27     private int age;
 28     Person(String name,int age)
 29     {
 30         this.name = name;
 31         this.age = age;
 32     }
 33     
 34     public boolean equals(Object obj)
 35     {
 36 
 37         if(!(obj instanceof Person))
 38             return false;
 39 
 40         Person p = (Person)obj;
 41         //System.out.println(this.name+"....."+p.name);
 42 
 43         return this.name.equals(p.name) && this.age == p.age;
 44     }
 45     /**/
 46     public String getName()
 47     {
 48         return name;
 49     }
 50     public int getAge()
 51     {
 52         return age;
 53     }
 54 }
 55 class ArrayListTest2 
 56 {
 57     public static void sop(Object obj)
 58     {
 59         System.out.println(obj);
 60     }
 61     public static void main(String[] args) 
 62     {
 63         ArrayList al = new ArrayList();
 64 
 65         al.add(new Demo());
 66 
 67         al.add(new Person("lisi01",30));//al.add(Object obj);//Object obj = new Person("lisi01",30);
 68         //al.add(new Person("lisi02",32));
 69         al.add(new Person("lisi02",32));
 70         al.add(new Person("lisi04",35));
 71         al.add(new Person("lisi03",33));
 72         //al.add(new Person("lisi04",35));
 73 
 74         
 75         //al = singleElement(al);
 76 
 77         sop("remove 03 :"+al.remove(new Person("lisi03",33)));//remove方法底层也是依赖于元素的equals方法。
 78 
 79 
 80         Iterator it = al.iterator();
 81 
 82 
 83         while(it.hasNext())
 84         {
 85             Person p = (Person)it.next();
 86             sop(p.getName()+"::"+p.getAge());
 87         }
 88     }
 89 
 90 
 91     public static ArrayList singleElement(ArrayList al)
 92     {
 93         //定义一个临时容器。
 94         ArrayList newAl = new ArrayList();
 95 
 96         Iterator it = al.iterator();
 97 
 98         while(it.hasNext())
 99         {
100             Object obj = it.next();
101 
102             if(!newAl.contains(obj))
103                 newAl.add(obj);
104 
105         }
106 
107         return newAl;
108     }
109 }

 

  1 import java.util.*;
  2 
  3 /*
  4 Collection定义了集合框架的共性功能。
  5 1,添加
  6     add(e);
  7     addAll(collection);
  8 
  9 2,删除
 10     remove(e);
 11     removeAll(collection);
 12     clear();
 13 
 14 3,判断。
 15     contains(e);
 16     isEmpty();
 17 
 18 4,获取
 19     iterator();
 20     size();
 21 
 22 5,获取交集。
 23     retainAll();
 24 
 25 6,集合变数组。
 26     toArray();
 27 
 28 
 29 
 30 1,add方法的参数类型是Object。以便于接收任意类型对象。
 31 
 32 2,集合中存储的都是对象的引用(地址)
 33 
 34 
 35 什么是迭代器呢?
 36 其实就是集合的取出元素的方式。
 37 如同抓娃娃游戏机中的夹子。
 38 
 39 迭代器是取出方式,会直接访问集合中的元素。
 40 所以将迭代器通过内部类的形式来进行描述。
 41 通过容器的iterator()方法获取该内部类的对象。
 42 
 43 
 44 
 45 
 46 */
 47 class  CollectionDemo
 48 {
 49     public static void main(String[] args) 
 50     {
 51         
 52         method_get();
 53     }
 54     public static void method_get()
 55     {
 56         ArrayList al = new ArrayList();
 57 
 58         //1,添加元素。
 59         al.add("java01");//add(Object obj);
 60         al.add("java02");
 61         al.add("java03");
 62         al.add("java04");
 63 
 64         /*
 65         Iterator it = al.iterator();//获取迭代器,用于取出集合中的元素。
 66 
 67         while(it.hasNext())
 68         {
 69             sop(it.next());
 70         }
 71         */
 72 
 73         for(Iterator it = al.iterator(); it.hasNext() ; )
 74         {
 75             sop(it.next());
 76         }
 77     }
 78 
 79 
 80     public static void method_2()
 81     {
 82         ArrayList al1 = new ArrayList();
 83 
 84         al1.add("java01");
 85         al1.add("java02");
 86         al1.add("java03");
 87         al1.add("java04");
 88         ArrayList al2 = new ArrayList();
 89 
 90         al2.add("java03");
 91         al2.add("java04");
 92         al2.add("java05");
 93         al2.add("java06");
 94 
 95         
 96         //al1.retainAll(al2);//去交集,al1中只会保留和al2中相同的元素。
 97         al1.removeAll(al2);
 98 
 99         sop("al1:"+al1);
100         sop("al2:"+al2);
101 
102 
103 
104 
105     }
106 
107     public static void base_method()
108     {
109         //创建一个集合容器。使用Collection接口的子类。ArrayList
110         ArrayList al = new ArrayList();
111 
112         //1,添加元素。
113         al.add("java01");//add(Object obj);
114         al.add("java02");
115         al.add("java03");
116         al.add("java04");
117 
118         //打印原集合。
119         sop("原集合:"+al);
120 
121 
122         //3,删除元素。
123         //al.remove("java02");
124         //al.clear();//清空集合。
125 
126 
127         //4,判断元素。
128         sop("java03是否存在:"+al.contains("java03"));
129         sop("集合是否为空?"+al.isEmpty());
130 
131 
132         //2,获取个数。集合长度。
133         sop("size:"+al.size());
134 
135         //打印改变后的集合。
136         sop(al);
137 
138     }
139 
140     public static void sop(Object obj)
141     {
142         System.out.println(obj);
143     }
144 }
 1 import java.util.*;
 2 /*
 3 |--Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。、
 4     |--HashSet:底层数据结构是哈希表。是线程不安全的。不同步。
 5             HashSet是如何保证元素唯一性的呢?
 6             是通过元素的两个方法,hashCode和equals来完成。
 7             如果元素的HashCode值相同,才会判断equals是否为true。
 8             如果元素的hashcode值不同,不会调用equals。
 9 
10             注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。
11 
12 
13     |--TreeSet:
14 
15 Set集合的功能和Collection是一致的。
16 
17 
18 
19 
20 */
21 
22 
23 class HashSetDemo 
24 {
25     public static void sop(Object obj)
26     {
27         System.out.println(obj);
28     }
29     public static void main(String[] args) 
30     {
31         
32         HashSet hs = new HashSet();
33 
34         sop(hs.add("java01"));
35         sop(hs.add("java01"));
36         hs.add("java02");
37         hs.add("java03");
38         hs.add("java03");
39         hs.add("java04");
40 
41         Iterator it = hs.iterator();
42 
43         while(it.hasNext())
44         {
45             sop(it.next());
46         }
47     }
48 }

 

 1 import java.util.*;
 2 
 3 /*
 4 往hashSet集合中存入自定对象
 5 姓名和年龄相同为同一个人,重复元素。
 6 
 7 
 8 
 9 
10 
11 */
12 class HashSetTest 
13 {
14     public static void sop(Object obj)
15     {
16         System.out.println(obj);
17     }
18     public static void main(String[] args) 
19     {
20         HashSet hs = new HashSet();
21 
22         hs.add(new Person("a1",11));
23         hs.add(new Person("a2",12));
24         hs.add(new Person("a3",13));
25 //        hs.add(new Person("a2",12));
26 //        hs.add(new Person("a4",14));
27 
28         //sop("a1:"+hs.contains(new Person("a2",12)));
29             
30 //        hs.remove(new Person("a4",13));
31         
32 
33         Iterator it = hs.iterator();
34 
35         while(it.hasNext())
36         {
37             Person p = (Person)it.next();
38             sop(p.getName()+"::"+p.getAge());
39         }
40     }
41 }
42 class Person
43 {
44     private String name;
45     private int age;
46     Person(String name,int age)
47     {
48         this.name = name;
49         this.age = age;
50     }
51     
52     public int hashCode()
53     {
54         System.out.println(this.name+"....hashCode");
55         return name.hashCode()+age*37;
56     }
57 
58     public boolean equals(Object obj)
59     {
60 
61         if(!(obj instanceof Person))
62             return false;
63 
64         Person p = (Person)obj;
65         System.out.println(this.name+"...equals.."+p.name);
66 
67         return this.name.equals(p.name) && this.age == p.age;
68     }
69 
70     
71     public String getName()
72     {
73         return name;
74     }
75     public int getAge()
76     {
77         return age;
78     }
79 }
80 
81 /*
82 
83 
84 */
 1 import java.util.*;
 2 
 3 /*
 4 LinkedList:特有方法:
 5 addFirst();
 6 addLast();
 7 
 8 getFirst();
 9 getLast();
10 获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException
11 
12 removeFirst();
13 removeLast();
14 获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException
15 
16 
17 在JDK1.6出现了替代方法。
18 
19 offerFirst();
20 offerLast();
21 
22 
23 peekFirst();
24 peekLast();
25 获取元素,但不删除元素。如果集合中没有元素,会返回null。
26 
27 pollFirst();
28 pollLast();
29 获取元素,但是元素被删除。如果集合中没有元素,会返回null。
30 
31 
32 
33 
34 */
35 
36 class LinkedListDemo 
37 {
38     public static void main(String[] args) 
39     {
40         LinkedList link = new LinkedList();
41 
42         link.addLast("java01");
43         link.addLast("java02");
44         link.addLast("java03");
45         link.addLast("java04");
46 
47         //sop(link);
48 //        sop(link.getFirst());
49 //        sop(link.getFirst());
50         //sop(link.getLast());
51         //sop(link.removeFirst());
52         //sop(link.removeFirst());
53 
54         //sop("size="+link.size());
55 
56         while(!link.isEmpty())
57         {
58             sop(link.removeLast());
59         }
60 
61     }
62 
63     public static void sop(Object obj)
64     {
65         System.out.println(obj);
66     }
67 }
68 /*
69 
70 ---
71 java01
72 java02
73 java03
74 java04
75 
76 ----
77 java04
78 java03
79 java02
80 java01
81 ---
82 */
/*
使用LinkedList模拟一个堆栈或者队列数据结构。

堆栈:先进后出  如同一个杯子。
队列:先进先出 First in First out  FIFO 如同一个水管。



*/

import java.util.*;
class DuiLie
{
    private LinkedList link;

    DuiLie()
    {
        link = new LinkedList();
    }
    
    public void myAdd(Object obj)
    {
        link.addFirst(obj);
    }
    public Object myGet()
    {
        return link.removeFirst();
    }
    public boolean isNull()
    {
        return link.isEmpty();
    }

}



class  LinkedListTest
{
    public static void main(String[] args) 
    {
        DuiLie dl = new DuiLie();
        dl.myAdd("java01");
        dl.myAdd("java02");
        dl.myAdd("java03");
        dl.myAdd("java04");

        while(!dl.isNull())
        {
            System.out.println(dl.myGet());
        }
    }
}

 

推荐阅读