# 集合存儲結(jié)構(gòu)
**集合和數(shù)組的區(qū)別**
**1. 數(shù)組能容納基本數(shù)據(jù)類型和引用數(shù)據(jù)類型健无;集合只接收引用數(shù)據(jù)類型碗脊。
2. 數(shù)組的長度是固定的障本》懵玻【集合長度可變的咆槽∈詹粒】
3. 數(shù)組可進(jìn)行的操作很有限:
4.? 集合是對象哆键,有方法和屬性可供調(diào)用苞轿,功能豐富了嗜傅;面向?qū)ο蟮奶匦越鹁洌庋b,繼承吕嘀,多態(tài)违寞。**
## 1.Collection接口
Collection接口中的方法
add(Objectionn o)添加一個(gè)元素
size()? 元素的個(gè)數(shù)
addAll(Collection<? extends E> c)? 添加一個(gè)集合對象的元素
contains(Object o)? 是否包含該"o"元素
isEmpty()? ? 是否為空
iterator()? ? 迭代
remove(Object o)? 刪除對象
toArray()? 返回?cái)?shù)組
## 2. List接口
List集合中的元素都是有序可重復(fù)的集合
List接口中的方法
void add(int index, Object ele)? ? ? ? ? ? //指定下標(biāo)添加元素
boolean addAll(int index, Collection eles) //指定下標(biāo)添加集合
Object get(int index)? ? ? ? ? ? ? ? ? ? ? //獲取下標(biāo)的元素
int indexOf(Object obj)? ? ? ? ? ? ? ? ? ? //從左到右獲取元素的下標(biāo)
int lastIndexOf(Object obj)? ? ? ? ? ? ? ? //從右到左獲取元素的下標(biāo)(永遠(yuǎn)從0開始的)
Object remove(int index)? ? ? ? ? ? ? ? ? //通過下標(biāo)刪除
Object set(int index, Object ele)? ? ? ? ? //修改下標(biāo)的元素
List subList(int fromIndex, int toIndex)? //返回一個(gè)子集合(不包含toIndex下標(biāo))
**2.1、ArrayList**
有序偶房,不唯一趁曼;有序是索引順序;
*(1)遍歷時(shí)按添加順序棕洋;
*(2)內(nèi)存原理:內(nèi)存中分配的是連續(xù)的空間挡闰;有索引,
*? ? ? ? ? ArrayList是一個(gè)Object類型的數(shù)組掰盘;數(shù)組長度不夠了摄悯,會(huì)生成更長的新數(shù)組;
*(3)性能:按索引查詢愧捕,效率高奢驯;
*? ? ? ? ? 按內(nèi)容查詢,效率低次绘;
*? ? ? ? ? 添加刪除元素效率低叨橱;可能引起大量元素的位移典蜕;
/*
*ArrayList的遍歷方法:
*1.for-each;
*2.普通for循環(huán);操作索引;
*3.迭代器:
*? 1)生成迭代器:Iterator it=list.iterator();//it初始位置在索引為0的元素之前罗洗;
*? 2)it.hasNext():以it當(dāng)前位置為參照愉舔,還有下一個(gè)元素嗎?
*? 3) it.next():先把it當(dāng)前位置的下一個(gè)元素取出來伙菜;把it的位置往后移動(dòng)一個(gè)元素轩缤;
*? 4)it.remove():把it當(dāng)前位置的元素刪除。
*? 5)在用迭代器遍歷集合期間贩绕,不要用集合對象名對集合進(jìn)行操作(如list.add(6)),會(huì)出現(xiàn)并發(fā)修改異常:java.util.ConcurrentModificationException火的。
```
public class Test2 {
? ? ? public static void main(String[] args) {
? ? ? ? ? ? ? List list = new ArrayList();
? ? ? ? ? ? ? list.add(1);
? ? ? ? ? ? ? list.add(2);
? ? ? ? ? ? ? list.add(3);
? ? ? ? ? ? ? list.add(4);
? ? ? ? ? ? ? list.add(5);
? ? ? ? ? ? ? // 集合的遍歷;for-each;
//? ? ? ? ? ? ? ? for (Object obj : list) {
//? ? ? ? ? ? ? ? ? ? ? ? System.out.println(obj.toString());
//? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? //普通的for循環(huán)淑倾;
//? ? ? ? ? ? ? ? for(int i=0;i<list.size();i++){
//? ? ? ? ? ? ? ? ? ? ? ? Object obj=list.get(i);
//? ? ? ? ? ? ? ? ? ? ? ? System.out.println(obj);
//? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? Iterator it=list.iterator();
? ? ? ? ? ? ? while(it.hasNext()){
? ? ? ? ? ? ? ? ? ? ? Object obj=it.next();//把it原有位置的下一個(gè)元素取出來馏鹤;把it的位置往后移動(dòng)一個(gè)元素;
? ? ? ? ? ? ? ? ? ? ? System.out.println(obj);
? ? ? ? ? ? ? ? ? ? ? //list.add(6);會(huì)出現(xiàn)并發(fā)修改異常:java.util.ConcurrentModificationException娇哆。
? ? ? ? ? ? ? ? ? ? ? it.remove();//it指向的是哪個(gè)元素湃累,就刪除哪個(gè)元素;
? ? ? ? ? ? ? }
? ? ? ? ? ? ? System.out.println(list.size());
? ? ? }
}
```
**2.2 LinkList**
.鏈表:LinkedList碍讨,物理空間上不連續(xù)治力,但邏輯上是連續(xù)的。
添加刪除元素效率高勃黍;不會(huì)引起大量元素的位移宵统;
*LinkedList的特點(diǎn):有序,不唯一覆获;有序是索引順序马澈;
*(1)遍歷時(shí)按添加順序;
*(2)內(nèi)存原理:鏈表
*(3)性能:按索引查詢弄息,效率低痊班;必須從第一個(gè)元素查起;
*? ? ? ? 按內(nèi)容查詢疑枯,效率低;
*? ? ? ? 添加刪除元素效率高蛔六;不會(huì)引起大量元素的位移荆永;
1.for-each;
2.普通for循環(huán);操作索引;
3.迭代器:
```
public class Test {
? ? ? public static void main(String[] args) {
? ? ? ? ? ? ? // 創(chuàng)建一個(gè)容器對象国章;
? ? ? ? ? ? ? List list = new LinkedList();// 運(yùn)用多態(tài)具钥;
? ? ? ? ? ? ? List subList = new LinkedList();
? ? ? ? ? ? ? subList.add(1);
? ? ? ? ? ? ? subList.add(2);
? ? ? ? ? ? ? // 添加;
? ? ? ? ? ? ? Person p1 = new Person();
? ? ? ? ? ? ? Person p2 = new Person();
? ? ? ? ? ? ? // add(Object obj):Object做形參液兽,可以接收不同的子類實(shí)參骂删;運(yùn)用多態(tài)掌动;
? ? ? ? ? ? ? list.add(p1);
? ? ? ? ? ? ? list.add(p2);
? ? ? ? ? ? ? list.add("Hello");
? ? ? ? ? ? ? // 123--->Object obj=new Integer(123);添加數(shù)字相當(dāng)于自動(dòng)裝箱;
? ? ? ? ? ? ? list.add(123);
? ? ? ? ? ? ? list.add(2, "java");
? ? ? ? ? ? ? list.addAll(subList);
? ? ? ? ? ? ? list.addAll(2, subList);
? ? ? ? ? ? ? // 刪除宁玫;
? ? ? ? ? ? ? // list.remove(2);//2是索引位置粗恢;
? ? ? ? ? ? ? // list.remove("java");//如果有多個(gè)"java",就刪除第一個(gè)欧瘪;
? ? ? ? ? ? ? // list.remove(new Integer(2));
? ? ? ? ? ? ? // list.removeAll(subList);//刪除的是所有和subList里相同的元素眷射,刪除的是與subList的交集;
? ? ? ? ? ? ? // 改佛掖;
? ? ? ? ? ? ? list.set(1, "today is perfect");
? ? ? ? ? ? ? // list.clear();
? ? ? ? ? ? ? //list.retainAll(subList);// 取與subList交集妖碉;
? ? ? ? ? ? ? // 查;
? ? ? ? ? ? ? System.out.println(list.size());// 實(shí)際元素的個(gè)數(shù)芥被,不是集合的總?cè)萘浚?/p>
? ? ? ? ? ? ? // System.out.println(list.get(0));//得到索引為0的位置的元素欧宜;
? ? ? ? ? ? ? System.out.println(list.contains(p1));
? ? ? ? ? ? ? System.out.println(list.isEmpty());
? ? ? ? ? ? ? // 集合的遍歷;
? ? ? ? ? ? ? for (Object obj : list) {
? ? ? ? ? ? ? ? ? ? ? System.out.println(obj.toString());
? ? ? ? ? ? ? }
? ? ? ? ? ? ? // 普通的for循環(huán)拴魄;
? ? ? ? ? ? ? for (int i = 0; i < list.size(); i++) {
? ? ? ? ? ? ? ? ? ? ? Object obj = list.get(i);
? ? ? ? ? ? ? ? ? ? ? System.out.println(obj);
? ? ? ? ? ? ? }
? ? ? ? ? ? ? Iterator it = list.iterator();
? ? ? ? ? ? ? while (it.hasNext()) {
? ? ? ? ? ? ? ? ? ? ? Object obj = it.next();// 把it原有位置的下一個(gè)元素取出來冗茸;把it的位置往后移動(dòng)一個(gè)元素;
? ? ? ? ? ? ? ? ? ? ? System.out.println(obj);
? ? ? ? ? ? ? ? ? ? ? // list.add(6);會(huì)出現(xiàn)并發(fā)修改異常:java.util.ConcurrentModificationException羹铅。
? ? ? ? ? ? ? ? ? ? ? it.remove();// it指向的是哪個(gè)元素蚀狰,就刪除哪個(gè)元素;
? ? ? ? ? ? ? }
? ? ? ? ? ? ? System.out.println(list.size());
? ? ? }
}
```
## 3.Set接口
? Set接口? ? 元素?zé)o序(hashCode())职员、不可重復(fù)的集合
? ? HashSet? ? LinkedHashSet? ? TreeSet
1)HashSet? 無序(hashCode())麻蹋、不可重復(fù)的集合? hashCode()? equals()
? *HashSet的特點(diǎn):無序,唯一焊切;
*(1)遍歷是不可預(yù)知順序扮授;
*(2)內(nèi)存原理:哈希表,用hashcode和equals()方法专肪;
*(3)性能:查詢效率高刹勃;
*? ? ? ? 添加刪除效率高;
*(4)自定義類嚎尤,建議重寫hashcode()和equals()方法荔仁,成對重寫。
*? ? 告訴程序你的比較策略芽死。
*? ? 不重寫乏梁,就用Object的方法了。
1. HashSet怎么保證元素的唯一性呢关贵?
*先用hashcode計(jì)算出地址遇骑,如果沒有元素,就存進(jìn)去揖曾;如果已有元素落萎,就用equals(),如果true亥啦,不添加了;
*如果false练链,就添加翔脱。
*
*hashcode相同,元素不一定相同兑宇;再用equals()碍侦,true才是相同的。
*hashcode不同隶糕,元素一定不同瓷产。
2.遍歷:
*? 1)for-each:
*? 2)迭代器:Iterator it=set.iterator();
*?
*3.添加:
*? set.add(Object obj);
*? set.addAll();
*?
*? 刪除:
*? set.remove(Object obj);
*? set.removeAll();
*?
*? 查:
*? set.isEmpty();
*? set.size();
*? set.clear();
*? set.contains();
*? set.containsAll();
*? set.retainAll();
*?
*? 轉(zhuǎn)換:
*? //把集合類型轉(zhuǎn)成Object類型的數(shù)組;
? ? ? Object[] objArr=set.toArray();
*?
* */
```
public class TestHashSet {
? ? ? public static void main(String[] args) {
? ? ? ? ? ? ? //創(chuàng)建一個(gè)HashSet對象枚驻;
? ? ? ? ? ? ? Set set=new HashSet();
? ? ? ? ? ? ? //添加濒旦;
? ? ? ? ? ? ? System.out.println(set.add(23));//true;
? ? ? ? ? ? ? set.add(36);
? ? ? ? ? ? ? set.add(48);
? ? ? ? ? ? ? set.add(77);
? ? ? ? ? ? ? set.add(86);
? ? ? ? ? ? ? set.add(67);
? ? ? ? ? ? ? set.add(76);
? ? ? ? ? ? ? System.out.println(set.add(23));//false;
? ? ? ? ? ? ? set.add(56);
? ? ? ? ? ? ? set.add(78);
? ? ? ? ? ? ? set.add(47);
? ? ? ? ? ? ? //刪除;
? ? ? ? ? ? ? set.remove(47);
? ? ? ? ? ? ? //改再登;
? ? ? ? ? ? ? //查尔邓;
? ? ? ? ? ? ? System.out.println(set.size());
? ? ? ? ? ? ? System.out.println(set.isEmpty());
? ? ? ? ? ? ? //set.clear();
? ? ? ? ? ? ? //遍歷;
? ? ? ? ? ? ? Iterator it=set.iterator();
? ? ? ? ? ? ? while(it.hasNext()){
? ? ? ? ? ? ? ? ? ? ? Object obj=it.next();
? ? ? ? ? ? ? ? ? ? ? System.out.println(obj);
? ? ? ? ? ? ? }
? ? ? ? ? ? ? System.out.println("==========================");
? ? ? ? ? ? ? //用for-each遍歷锉矢;
? ? ? ? ? ? ? for(Object obj:set){
? ? ? ? ? ? ? ? ? ? ? System.out.println(obj.toString());
? ? ? ? ? ? ? }
? ? ? ? ? ? ? //把集合類型轉(zhuǎn)成Object類型的數(shù)組梯嗽;
? ? ? ? ? ? ? Object[] objArr=set.toArray();
? ? ? ? ? ? ? System.out.println(Arrays.toString(objArr));
? ? ? }
}
```
? ? 2)LinkedHashSet:遍歷輸出的內(nèi)容和添加的順序一致
? ? 3)TreeSet
? ? ? * 1.添加元素必須是同一類型,否則遍歷出錯(cuò)
? ? ? * 2.遍歷輸出順序按默認(rèn)順序(從小到大)如:String,Integer等
? ? ? * 3.自然排序,必須要實(shí)現(xiàn)Comparable,compareTo方法沽损,實(shí)現(xiàn)排序
? ? ? * 4.定制排序,需要實(shí)現(xiàn)接口Comparator接口
*TreeSet:有序灯节,唯一;有序绵估,不是添加順序炎疆,是大小順序;
*(1)遍歷時(shí)是大小順序国裳;
*(2)內(nèi)存原理:二叉樹形入;
*(3)查詢(按內(nèi)容查詢),效率中等缝左;在ArrayList和HashSet之間亿遂;
*? ? 添加刪除,效率中等渺杉。
*(4)如果是自定義類蛇数,要實(shí)現(xiàn)Comparable接口;
*? ? 告訴程序你的比較策略少办;
*? ? 否則會(huì)報(bào):java.lang.ClassCastException:Student--->Comparable;
*? ?
*? ? Set treeSet=new TreeSet();
*
*(5) 也可以實(shí)現(xiàn)Comparator接口苞慢;
```
*? ? ? StuScoreComp sComp=new StuScoreComp();
? ? ? ? ? ? ? Set treeSet = new TreeSet(sComp);
public class TestTreeSet {
? ? ? public static void main(String[] args) {
? ? ? ? ? ? ? //創(chuàng)建TreeSet對象诵原;
? ? ? ? ? ? ? Set treeSet=new TreeSet();
? ? ? ? ? ? ? //添加英妓;
? ? ? ? ? ? ? treeSet.add(50);
? ? ? ? ? ? ? treeSet.add(35);
? ? ? ? ? ? ? treeSet.add(78);
? ? ? ? ? ? ? treeSet.add(27);
? ? ? ? ? ? ? treeSet.add(45);
? ? ? ? ? ? ? treeSet.add(56);
? ? ? ? ? ? ? treeSet.add(40);
? ? ? ? ? ? ? treeSet.add(45);
? ? ? ? ? ? ? treeSet.add(48);
? ? ? ? ? ? ? treeSet.add(90);
? ? ? ? ? ? ? //遍歷挽放;
? ? ? ? ? ? ? Iterator it=treeSet.iterator();
? ? ? ? ? ? ? while(it.hasNext()){
? ? ? ? ? ? ? ? ? ? ? Object obj=it.next();
? ? ? ? ? ? ? ? ? ? ? System.out.println(obj);
? ? ? ? ? ? ? }
? ? ? }
}
```
## 4.Map接口
*Map特有的三個(gè)方法:
*map.keySet();獲取key的集合;
*map.values();獲取value的集合蔓纠;
*map.entrySet();獲取key和value的集合辑畦;
? Map接口? ? ? key-value對”的集合
? ? ? HashMap(效率高)? ? ? ? ? LinkedHashMap? ? TreeMap? HashTable(古老的類,基于線程安全,效率低)
? ? Properties? load(InputStream inStream) 從輸入字節(jié)流讀取屬性列表(鍵和元素對)腿倚。
*HashMap:
*1.是鍵值對纯出,每個(gè)元素包含兩部分:key,value;
*2.key和value是一一對應(yīng)的;
*3.key是無序敷燎,唯一的暂筝;如果添加了重復(fù)的key,不報(bào)錯(cuò),后面的會(huì)覆蓋前面的硬贯;
*4.value是無序焕襟,不唯一的;
*5.key和value都可以是null饭豹。
*6.如果key是自定義類:要重寫hashCode()和equals()方法鸵赖;
*? 告訴程序你的比較策略;
內(nèi)存原理:key部分與HashSet原理相同拄衰,無序它褪,唯一;
? ? ? ? ? ? ? ? 事實(shí)上,HashSet底層調(diào)用的是HashMap.
? ? ? ? ? ? ? /*
*HashMap底層是一個(gè)Entry類型的數(shù)組翘悉;
*Entry<Integer,String>:
*Entry:key,value和指向下一個(gè)Entry元素的引用茫打。
*
*
```
*/
public class TestHashMap1 {
? ? ? public static void main(String[] args) {
? ? ? ? ? ? ? Map<Integer,String> map=new HashMap<Integer,String>();
? ? ? ? ? ? ? map.put(1, "羅馬假日");
? ? ? ? ? ? ? map.put(3, "三國演義");
? ? ? ? ? ? ? map.put(2, "煉金術(shù)士");
? ? ? ? ? ? ? //遍歷:
? ? ? ? ? ? ? Set entrySet=map.entrySet();
? ? ? ? ? ? ? Iterator<Entry<Integer,String>> it=entrySet.iterator();
? ? ? ? ? ? ? while(it.hasNext()){
//? ? ? ? ? ? ? ? ? ? ? ? it.next().getKey();
//? ? ? ? ? ? ? ? ? ? ? ? it.next().getValue();
? ? ? ? ? ? ? ? ? ? ? Entry entry=it.next();
? ? ? ? ? ? ? ? ? ? ? System.out.println(entry);
? ? ? ? ? ? ? }
? ? ? }
}
```
/*
*TreeMap: 有序(大小順序),唯一镐确;按key排序包吝;
*如果key是自定義類:要實(shí)現(xiàn)Comparable或Comparator接口;
*告訴程序你的比較策略源葫;
*
*/
```
import java.util.TreeMap;
public class TestTreeMap {
? ? ? public static void main(String[] args) {
? ? ? ? ? ? ? Map<Integer,String> map=new TreeMap<Integer,String>();
? ? ? ? ? ? ? map.put(16, "煉金術(shù)士");
? ? ? ? ? ? ? map.put(2, "煉金術(shù)士");
? ? ? ? ? ? ? map.put(1, "羅馬假日");
? ? ? ? ? ? ? map.put(3, "三國演義");
? ? ? ? ? ? ? map.put(2, "圍城");
? ? ? ? ? ? ? //遍歷:
? ? ? ? ? ? ? Set entrySet=map.entrySet();
? ? ? ? ? ? ? Iterator<Entry<Integer,String>> it=entrySet.iterator();
? ? ? ? ? ? ? while(it.hasNext()){
? ? ? ? ? ? ? ? ? ? ? Entry entry=it.next();
? ? ? ? ? ? ? ? ? ? ? System.out.println(entry);
? ? ? ? ? ? ? }
? ? ? }
}
```
## 5.迭代器
迭代器:
*? 1)生成迭代器:Iterator it=list.iterator();//it初始位置在索引為0的元素之前儒恋;
*? 2)it.hasNext():以it當(dāng)前位置為參照,還有下一個(gè)元素嗎嘀趟?
*? 3) it.next():先把it當(dāng)前位置的下一個(gè)元素取出來雄驹;把it的位置往后移動(dòng)一個(gè)元素;
*? 4)it.remove():把it當(dāng)前位置的元素刪除荣堰。
*? 5)在用迭代器遍歷集合期間床未,不要用集合對象名對集合進(jìn)行操作(如list.add(6)),會(huì)出現(xiàn)并發(fā)修改異常:java.util.ConcurrentModificationException。
list.iterator():
(1) iterator()不是Collection自己的方法振坚,是繼承自接口Iterable;
(2) Iterator iterator();返回值是Iterator類型的薇搁;
(3)? Iterator: 是一個(gè)接口類型,它里面的三個(gè)方法:hasNext();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? next();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? remove();
(4)遍歷[集合]時(shí)底層調(diào)用Iterator完成操作渡八。
## 6.Collectiongons工具類
/*
*1.Collections:
*? 1)和Arrays一樣啃洋,是專門用來操作集合的工具類传货;
*? 2)大部分方法 都是靜態(tài)的,可以通過類名直接調(diào)用宏娄;
*? 3)構(gòu)造方法私有化问裕,不能創(chuàng)建Collections的對象;
*?
*2.Collections的常用方法:
*? 1)Collections.addAll(list,60,50);
*? //如果是自定義對象孵坚,要給出比較策略粮宛,實(shí)現(xiàn)Comparable接口;
*? 2)Collections.sort(list);
*? //用于排好序的集合上卖宠;查到就返回索引值巍杈,沒查到就返回-(應(yīng)該在的位置+1);
*? 3)int index=Collections.binarySearch(list, 67);
*? 4)Collections.copy(list, list2);
*? 5)int max=Collections.max(list);
? ? ? 6)int min=Collections.min(list);
? ? ? 7)Collections.fill(list, 888);
? ? ? 8)Collections.reverse(list);
*? 9)List list3 = Collections.synchronizedList(list);
*
*3.Collection和Collections的區(qū)別:
*? 1)Collection是Java提供的集合接口扛伍,存儲一組不唯一秉氧,無序的對象。它有兩個(gè)子接口List和Set蜒秤。
? 2)Java中還有一個(gè)Collections類汁咏,專門用來操作集合類 ,它提供一系列靜態(tài)方法實(shí)現(xiàn)對各種集合的搜索作媚、排序攘滩、線程安全化等操作。
*/
```
public class TestCollections {
? ? ? public static void main(String[] args) {
? ? ? ? ? ArrayList list=new ArrayList();
? ? ? ? ? //添加Integer類型的元素纸泡;
? ? ? ? ? list.add(3);
? ? ? ? ? list.add(4);
? ? ? ? ? list.add(1);
? ? ? ? ? list.add(2);
? ? ? ? ? list.add(5);
? ? ? ? ? Collections.addAll(list,60,50);
? ? ? ? ? //Collections.sort(list);
? ? ? ? ? //int index=Collections.binarySearch(list, 50);
? ? ? ? ? ArrayList list2=new ArrayList();
? ? ? ? ? Collections.addAll(list2,11,12,13,14);
? ? ? ? ? Collections.copy(list, list2);
? ? ? ? ? //Collections.fill(list, 888);
? ? ? ? ? //Collections.reverse(list);
? ? ? ? ? int max=Collections.max(list);
? ? ? ? ? int min=Collections.min(list);
? ? ? ? ? System.out.println(max+" "+min);
? ? ? ? ? //System.out.println(index);
? ? ? ? ? //遍歷:
? ? ? ? ? Iterator it = list.iterator();
? ? ? ? ? ? ? while (it.hasNext()) {
? ? ? ? ? ? ? ? ? ? ? System.out.println(it.next());
? ? ? ? ? ? ? }
? ? ? ? ? ? ? //ArrayList是線程非同步漂问,程序員可以自己寫代碼把ArrayList轉(zhuǎn)成同步的操作;
? ? ? ? ? ? ? List list3 = Collections.synchronizedList(list);
? ? ? }
}
```