1 集合类的由来:
2 对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定
3 就使用集合容器进行存储。
4
5 集合特点:(数组和集合的区别)
6 1,用于存储对象的容器。
7 2,集合的长度是可变的。
8 3,集合中不可以存储基本数据类型值。
9
10
11 集合容器因为内部的数据结构不同,有多种具体容器。
12 不断的向上抽取,就形成了集合框架。
13
14 框架的顶层Collection接口:
15
16 Collection的常见方法:
17
18 1,添加。
19 boolean add(Object obj):
20 boolean addAll(Collection coll):
21
22 2,删除。
23 boolean remove(Object obj):
24 boolean removeAll(Collection coll):
25 void clear();
26
27
28 3,判断:
29 boolean contains(Object obj):
30 boolean containsAll(Collection coll):
31 boolean isEmpty():判断集合中是否有元素
32
33 4,获取:
34 int size():
35 Iterator iterator():取出元素的方式:迭代器。
36 该对象必须依赖于具体容器,因为每一个容器的数据结构都不同。
37 所以该迭代器对象是在容器中进行内部实现的。
38 对于使用容器者而言,具体的实现不重要,只要通过容器获取到该实现的迭代器对象即可
39 也就是iterator方法。
40
41 Iterator接口就是对所有的Collection容器进行元素取出的公共接口。
42 //一个事物访问另外一个事物内部的成员,可以用内部类实现
43
44 5,其他:
45 boolean retainAll(Collection coll):取交集。
46 Object[] toArray();将集合转成数组
47
48 ------------------------
49 Collection
50 |--List:有序(存入和取出的顺序一致),元素都有索引(角标),元素可以重复。
51 |--Set:元素不能重复,无序。(有可能有序,因为如果你存的就是他这里面的顺序,你就会觉得是有序)
52
53 List:特有的常见方法:有一个共性特点就是都可以操作角标。
54
55 1,添加
56 void add(index,element);
57 void add(index,collection);
58
59
60 2,删除:
61 Object remove(index);
62
63 3,修改:
64 Object set(index,element);
65
66 4,获取:
67 Obejct get(index);
68 int indexOf(object);
69 int lastIndexOf(object);
70 List subList(from,to);
71
72 list集合是可以完成对元素的增删改查
73
74 List:
75 |--Vector:内部是数组数据结构。是同步的。效率低(是线程安全的) (增删,查询都很慢)jdk1.0就有
76 |--ArrayList:内部是数组数据结构,是不同步的。效率高,替代Vector。(查询速度快)(要么给ArrayList加锁,要么用其他方式,vector一般就不用了)
77 |--LinkedList:内部是链表数据结构,是不同步的。增删元素的速度很快(适合频繁增删)空间不连续所以查询慢
78 LinkedList也是有索引的,但是你查的数据是不连续 所以可能是5 9 13这样的
79
80 LinkedList:
81 addFirst();
82 addLast();
83 jdk1.6
84 offerFirst();
85 offerLast();
86
87 getFirst();//获取但不移除,如果链表为空,抛出NoSuchElementEception
88 getLast();
89 jdk1.6
90 peekFirst();//获取但不移除,如果链表为空,返回null
91 peekLast();
92
93 removeFirst();//获取并移除,如果链表为空,抛出NoSuchElementEception
94 removeLast();
95 jdk1.6
96 pollFirst();//获取并移除,如果链表为空,返回null
97 pollLast();
98
99
100
101 ----------------------------------
102
103
104 Set:元素不可以重复,是无序。
105 Set接口中的方法和Collection一致。
106 |--HashSet:内部数据结构是哈希表,是不同步的。
107 如何保证该集合的元素唯一性呢?
108 是通过对象的hashCode和equals方法来完成对象唯一性的。
109 如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。
110 如果对象的hashCode值相同,那么再次判断对象的equals方向是否为true。
111 如果为true,视为相同元素,不存。如果为false,那么视为不同元素,就进行存储。
112
113 记住:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法,
114 一般情况下,如果定义的类会产生很多对象,比如人,学生,书,通常都需要覆盖equals,hashCode方法
115 建立对象判断是否相同的依据。
116
117 |--TreeSet:可以对Set集合中的元素进行排序。是不同步的。
118 判断元素唯一性的方式:就是根据比较方法的返回结果是否是0,是0,就是相同元素,不存。
119
120 TreeSet对元素进行排序的方式一:
121 让元素自身具备比较功能,元素就需要实现Comparable接口覆盖compareTo方法
122
123 如果不按照对象中具备的自然顺序进行排序。如果对象不具备自然顺序(对象可能不是我们自己定义的)
124 可以使用TreeSet集合第二种排序方式二:
125 让集合自身具备比较功能,定义一个类实现Comparator接口,覆盖compare方法(不是compareTo哦)
126 将该类对象作为参数传递给TreeSet集合的构造函数。
127
128 哈希表确定元素是否相同
129 * 1,判断的是两个元素的哈希值是否相同。
130 * 如果相同,在判断两个对象的内容是否相同吧
131 * 2,判断哈希值相同,其实判断的是对象的hashCode方法。
132 * 判断内容相同,用的是equals方法。
133 *
134 * 注意:如果哈希值不同,是不需要判断equals
135
136
137
138
139
140
141 --------------------------------------
142 泛型:
143 jdk1.5出现的安全机制。
144
145 好处:
146 1,将运行时期的问题ClassCastException转到了编译时期。
147 2,避免了强制转换的麻烦
148
149 <>:什么时候用?当操作的引用数据类型不确定的时候。就使用<>。将要操作的引用数据类型传入即可
150 其实<>就是一个接收具体引用数据类型的参数范围。
151
152 在程序中,只要用到了带有<>的类或者接口,就要明确传入的具体引用数据类型。
153
154 泛型技术是给编译器使用的技术,用于编译时期。确保了类型安全
155
156 运行时,会将泛型去掉,生成的class文件中是不带泛型的,这个称为泛型的擦除。
157 为什么擦除呢?因为为了兼容运行的类加载器。
158
159 泛型的擦除补偿:在运行时,通过获取元素的类型进行转换动作。不用使用者再强制转换了
160
161 泛型的通配符。?问号 (未知类型)
162
163 void show(int x,int y)
164
165 class Tool<e1,e2,e3,e4>
166
167
168 例如 Tool<String,Demo,Person,Integer> t = new Tool<String,Demo,Person,Integer>();
169
170
171 ===========================
172
173 集合的一些技巧
174
175 需要唯一吗?
176 需要: Set
177 需要指定顺序:
178 需要:TreeSet
179 不需要:HashSet
180 但是想要有个和存储一致的顺序(有序):LinkedHashSet
181
182 不需要:List
183 需要频繁增删吗?
184 需要:LinkedList
185 不需要:ArrayList
186
187 如何记住每一个容器的结构和所属体系?
188
189 List
190 |--ArrayList
191 |--LinkedList
192
193 Set
194 |--HashSet
195 |--TreeSet
196
197 后缀名就是该集合所属的体系
198 前缀名就是该集合的数据结构、
199
200 看到array:就要想要数组,就想到查询快,有角标。
201 看到link:就想到链表,就要想要增删快,就要想到add get remove+first last的方法
202 看到hash:就要想到哈希表,就要想到唯一性,就要想到元素需要覆盖hashCode和equals方法。
203 看到tree:就要想到二叉树,就要想到排序,就要想到两个接口Comparable和Comparator
204
205 而且通常这些常用的集合容器都是不同步的。
206
207
208
209
210
211
212
213
214