@@ -13,6 +13,7 @@ Queue是队列集合;Map代表的是存储key-value对的集合,可根据元
1313上图中淡绿色背景覆盖的是集合体系中常用的实现类,分别是` ArrayList ` 、` LinkedList ` 、` ArrayQueue ` 、` HashSet ` 、` TreeSet ` 、` HashMap ` 、` TreeMap ` 等实现类
1414
1515# 1 List家族
16+
1617List<E >接口继承图:
1718
1819<img align =" center " src =" https://picturestr.oss-cn-shanghai.aliyuncs.com/img/20200713221109.png " />
@@ -68,55 +69,69 @@ List类在Java.awt包里,List<E>在java.util包里,但使用时是用List\<E>
6869 for (String item : list){
6970 System . out. print(item + " " );
7071 }// output:b
71-
72+
7273 }
7374```
7475
7576** 注意** :输出的是` ["a","b","c"] ` ,带有` [] `
7677
7778### 1.1.2 List常用方法总结
79+
7880#### (1)void add(Object element)
79- 向列表的尾部添加指定的元素
8081
81- #### (2)int size()
82+ 向列表的尾部添加指定的元素
83+
84+ #### (2)int size()
85+
8286返回列表中的元素个数
8387
84- #### (3)E get(int index)
88+ #### (3)E get(int index)
89+
8590返回列表中指定位置的元素,index从0开始
8691
87- #### (4)void add(int index, Object element)
92+ #### (4)void add(int index, Object element)
93+
8894在列表的指定位置插入指定元素
8995
90- #### (5)void set(int i, Object element)
96+ #### (5)void set(int i, Object element)
97+
9198将索引i位置元素替换为元素element并返回被替换的元素
9299
93- #### (6)void clear()
100+ #### (6)void clear()
101+
94102从列表中移除所有元素
95103
96- #### (7)boolean isEmpty()
104+ #### (7)boolean isEmpty()
105+
97106判断列表是否包含元素,不包含元素则返回 true,否则返回false
98107
99- #### (8)iterator()
108+ #### (8)iterator()
109+
100110返回按适当顺序在列表的元素上进行迭代的迭代器
101111
102- #### (9)boolean contains(Object o)
112+ #### (9)boolean contains(Object o)
113+
103114如果列表包含指定的元素,则返回 true
104115
105- #### (10)E remove(int index)
116+ #### (10)E remove(int index)
117+
106118移除列表中指定位置的元素,并返回被删元素
107119
108- #### (11)boolean remove(Object o)
120+ #### (11)boolean remove(Object o)
121+
109122移除集合中第一次出现的指定元素,移除成功返回true,否则返回false
110123
111124#### (12)void forEach(ConSumer<? super T> action)
112- forEach是for的增强版 其中System.out::println这段代码其实就是Consumer<T >接口的一个实现方式
125+
126+ forEach是for的增强版 其中System.out::println这段代码其实就是Consumer<T >接口的一个实现方式
113127
114128``` java
115129list. forEach(System . out:: println);// output:b
116130 list. forEach(item- > {
117131 System . out. println(item);// item就是list中的元素,便于对括号里面的元素做处理
118132 });// output:b
119133```
134+
120135#### (13)toArray
121136
122137``` java
@@ -126,18 +141,20 @@ list.forEach(System.out::println);//output:b
126141 list. toArray(arr);// 此时arr就有了list中的值了
127142 // 方法2,使用带参数的toArray方法
128143 String [] arr2= (String [])list. toArray(new String [0 ]);// 参数含义的解释:要存储列表中元素的数组,如果它足够大的话;否则为此目的分配一个运行时类型相同的新数组。
129-
130-
144+
145+
131146```
147+
132148** 注意:** 下面方法写法错误
133149
134- > String[ ] arr=(String[ ] )list.toArray();//会出现java.lang.ClassCastException
150+ > String[ ] arr=(String[ ] )list.toArray();//会出现java.lang.ClassCastException
135151
136152## 1.2 ArrayList
137153
138154ArrayList是集合的一种实现,实现了接口` List ` ,List接口继承了` Collection ` 接口,而Collection是所有集合类的父类。ArrayList使用非常广泛,不论是数据库表查询,excel导入解析,还是网站数据爬取都需要使用到,了解ArrayList原理及使用方法显得非常重要。
139155
140156### 1.2.1 定义一个ArrayList
157+
141158``` java
142159List<String > list = new ArrayList<> ();
143160// 默认创建一个ArrayList集合
@@ -230,17 +247,16 @@ public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAcce
230247 }
231248}
232249```
233- 从源码可以看出,ArrayList非线程安全,底层是一个`Object[ ]
234- elementData`,添加到ArrayList中的数据保存在了elementData属性中,
235- 有第三个构造函数:` ArrayList() ` 、`ArrayList(int
236- initialCapacity)` 、 ` ArrayList(Collection<? extends E> c)`。
250+
251+ 从源码可以看出,ArrayList非线程安全,底层是一个` Object[] elementData ` ,添加到ArrayList中的数据保存在了elementData属性中,
252+ 有第三个构造函数:` ArrayList() ` 、` ArrayList(int initialCapacity) ` 、` ArrayList(Collection<? extends E> c) ` 。
237253
238254+ 当调用` new ArrayList<>() ` 时,将一个空数组{}赋值给了elementData,这个时候集合的长度size为默认长度0;
239255+ 当调用` new ArrayList<>(100) ` 时,根据传入的长度,new一个Object[ 100] 赋值给elementData,当然如果玩儿的话,传了一个0,那么将一个空数组{}赋值给了elementData;
240256+ 当调用` new ArrayList<>(new HashSet()) ` 时,根据源码,我们可知,可以传递任何实现了Collection接口的类,将传递的集合调用` toArray() ` 方法转为数组内赋值给elementData;
241257
242-
243258#### tips:线程安全与线程不安全理解
259+
244260线程安全就是` 多线程访问 ` 时,采用了` 加锁 ` 机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。
245261
246262线程不安全就是` 不提供数据访问保护 ` ,有可能出现多个线程先后更改数据造成所得到的数据是` 脏数据 `
@@ -259,34 +275,43 @@ initialCapacity)`、`ArrayList(Collection<? extends E> c)`。
259275而如果是在多线程情况下,比如有两个线程,线程 A 先将元素存放在位置 0。但是此时 CPU 调度线程A暂停,线程 B 得到运行的机会。线程B也向此 ArrayList 添加元素,因为此时 Size 仍然等于 0 (注意哦,我们假设的是添加一个元素是要两个步骤哦,而线程A仅仅完成了步骤1),所以线程B也将元素存放在位置0。然后线程A和线程B都继续运行,都增加 Size 的值。
260276那好,我们来看看 ArrayList 的情况,元素实际上只有一个,存放在位置 0,而 Size 却等于 2。这就是“线程不安全”了。
261277
262- ##### 不可变:
278+ ##### 不可变:
263279
264280不可变的对象** 一定** 是** 线程安全** 的,并且永远也不需要额外的同步
265281因为一个不可变的对象只要构建正确,其外部可见状态永远也不会改变,永远也不会看到它处于不一致的状态。Java
266282类库中大多数基本数值类如 ` Integer ` 、 ` String ` 和 ` BigInteger ` 都是不可变的。
267283需要注意的是,对于Integer,该类不提供add方法,加法是使用+来直接操作。而+操作是不具线程安全的。这是提供原子操作类AtomicInteger的原。
268284
269285### 1.2.2 数组、ArrayList中的区别
286+
270287数组在内存中是连续存储的,所以它的索引速度是非常的快,而且赋值与修改元素也很简单,比如:
288+
271289``` java
272290string[] s= new string [3 ];
273291// 赋值
274292 s[0 ]= " a" ; s[1 ]= " b" ; s[2 ]= " c" ;
275293// 修改
276294 s[1 ]= " b1" ;
277295```
296+
278297总所周知,数组在中间插入数据时,会移动后面的数据。而且在声明数组时,必须指明数组长度,长度过长会造成内存溢出,长度过短,会造成数据溢出错误,所以ArrayList对象可以克服这些缺点。
279298
280299## 1.3 LinkedList
281300
282-
283301## 1.4 Vector
302+
284303## 1.5 CopyOnWriteArrayList
304+
285305## 1.6 UnmodifiableList
306+
286307## 1.7 SynchronizedList
287308
288309# 2 Set家族
310+
289311## 2.1 Set
312+
290313## 2.2 HashSet
314+
291315### 2.2.1 HashSet集合是不支持排序的,但是我们可以通过TreeSet集合对其进行间接排序
316+
292317https://blog.csdn.net/jmj18756235518/article/details/81557356
0 commit comments