集合框架的详解,List(ArrayList,LinkedList,Vector),Set(HashSet,TreeSet)-(14)
集合详解:
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());
}
}
}