1.什么是集合
存儲對象的容器,面向對象語言對事物的體現都是以對象的形式,所以為了方便對多個對象的操作,存儲對象,集合是存儲對象最常用的一種方式。
集合的出現就是為了持有對象。集合中可以存儲任意類型的對象,而且長度可變。在程序中有可能無法預先知道需要多少個對象,那么用數組來裝對象的話,長度不好定義,而集合解決了這樣的問題。
2.集合和數組的區別
數組和集合類都是容器
數組長度是固定的,集合長度是可變的。數組中可以存儲基本數據類型,集合只能存儲對象數組中存儲數據類型是單一的,集合中可以存儲任意類型的對象。
集合類的特點
用於存儲對象,長度是可變的,可以存儲不同類型的對象。
數組的缺點
存儲類型單一的數據容器,操作復雜(數組一旦聲明好不可變)
3.集合的分類
集合做什么
1:將對象添加到集合
2:從集合中刪除對象
3: 從集合中查找一個對象
4:從集合中修改一個對象就是增刪改查
注意:集合和數組中存放的都是對象的引用而非對象本身
Java工程師對不同的容器進行了定義,雖然容器不同,但是還是有一些共性可以抽取最后抽取了一個頂層接口,那么就形成了一個集合框架。如何學習呢?當然是從頂層學起,頂層里邊具有最共性,最基本的行為。具體的使用,就要選擇具體的容器了。為什么?因為不斷向上抽取的東西有可能是不能創建對象的.抽象的可能性很大,並且子類對象的方法更多一些.所以是看頂層,創建底層。那么集合的頂層是什么呢 叫做Collection
集合框架體系

[java] view plain copy print? ---|Collection: 單列集合 ---|List: 有存儲順序, 可重復 ---|ArrayList: 數組實現, 查找快, 增刪慢 由於是數組實現, 在增和刪的時候會牽扯到數組 增容, 以及拷貝元素. 所以慢。數組是可以直接 按索引查找, 所以查找時較快 ---|LinkedList: 鏈表實現, 增刪快, 查找慢 由於鏈表實現, 增加時只要讓前一個元素記住自 己就可以, 刪除時讓前一個元素記住后一個元 素, 后一個元素記住前一個元素. 這樣的增刪效 率較高但查詢時需要一個一個的遍歷, 所以效率 較低 ---|Vector: 和ArrayList原理相同, 但線程安全, 效率略低 和ArrayList實現方式相同, 但考慮了線程安全問 題, 所以效率略低 ---|Set: 無存儲順序, 不可重復 ---|HashSet ---|TreeSet ---|LinkedHashSet ---| Map: 鍵值對 ---|HashMap ---|TreeMap ---|HashTable ---|LinkedHashMap
為什么出現這么多集合容器,因為每一個容器對數據的存儲方式不同,這種存儲方式稱之為數據結構(data structure)
注意 --集合和數組中存放的都是對象的引用。
4.什么時候該使用什么樣的集合

5.集合類Collection
Collection接口有兩個子接口:List(鏈表|線性表)和Set(集)
1.特點:
Collection中描述的是集合共有的功能(CRUD)
List可存放重復元素,元素存取是有序的
Set不可以存放重復元素,元素存取是無序的
java.util.Collection ---| Collection 描述所有接口的共性 ----| List接口 可以有重復元素的集合 ----| Set 接口 不可以有重復元素的集合
2:學習集合對象
學習Collection中的共性方法,多個容器在不斷向上抽取就出現了該體系。發現Collection接口中具有所有容器都具備的共性方法。查閱API時,就可以直接看該接口中的方法。並創建其子類對象對集合進行基本應用。當要使用集合對象中特有的方法,在查看子類具體內容。
查看api 文檔Collection在在java.util中(注意是大寫Collection)
注意在現階段遇到的 E T 之類的類型,需要暫時理解為object 因為涉及到了泛型.
3:創建集合對象,使用Collection中的List的具體實現類ArrayList
Collection coll=new Arraylist();
6.Collection接口的共性方法
增加: 1:add() 將指定對象存儲到容器中 add 方法的參數類型是Object 便於接收任意對象 2:addAll() 將指定集合中的元素添加到調用該方法和集合中 刪除: 3:remove() 將指定的對象從集合中刪除 4:removeAll() 將指定集合中的元素刪除 修改 5:clear() 清空集合中的所有元素 判斷 6:isEmpty() 判斷集合是否為空 7:contains() 判斷集合何中是否包含指定對象 8:containsAll() 判斷集合中是否包含指定集合 使用equals()判斷兩個對象是否相等 獲取: 9:int size() 返回集合容器的大小 轉成數組 10: toArray() 集合轉換數組
增加:
1 public static void main(String[] args) { 2 Collection list = new ArrayList(); 3 // 增加:add() 將指定對象存儲到容器中 4 list.add("計算機網絡"); 5 list.add("現代操作系統"); 6 list.add("java編程思想"); 7 System.out.println(list); 8 // [計算機網絡, 現代操作系統, java編程思想] 9 10 // 增加2 將list容器元素添加到list2容器中 11 Collection list2 = new ArrayList(); 12 list2.add("java核心技術"); 13 list2.addAll(list); 14 list2.add("java語言程序設計"); 15 System.out.println(list2); 16 // [java核心技術, 計算機網絡, 現代操作系統, java編程思想, java語言程序設計] 17 }
刪除:
1 // 刪除1 remove 2 boolean remove = list2.remove("java核心技術"); 3 System.out.println(remove); // true 4 System.out.println(list2); // 5 //刪除2 removeAll() 將list中的元素刪除 6 boolean removeAll = list2.removeAll(list); 7 System.out.println(removeAll);//true 8 System.out.println(list2);//[java語言程序設計]
修改:
1 public static void main(String[] args) { 2 Collection list = new ArrayList(); 3 // 增加:add() 將指定對象存儲到容器中 4 list.add("計算機網絡"); 5 list.add("現代操作系統"); 6 list.add("java編程思想"); 7 list.add("java核心技術"); 8 list.add("java語言程序設計"); 9 System.out.println(list); 10 // 修改 clear() 清空集合中的所有元素 11 list.clear(); 12 System.out.println(list); //[] 13 }
判斷:
1 public static void main(String[] args) { 2 Collection list = new ArrayList(); 3 // 增加:add() 將指定對象存儲到容器中 4 list.add("計算機網絡"); 5 list.add("現代操作系統"); 6 list.add("java編程思想"); 7 list.add("java核心技術"); 8 list.add("java語言程序設計"); 9 System.out.println(list); 10 11 boolean empty = list.isEmpty(); 12 System.out.println(empty);// false 13 boolean contains = list.contains("java編程思想"); 14 System.out.println(contains);// true 15 Collection list2 = new ArrayList(); 16 list2.add("水許傳"); 17 boolean containsAll = list.containsAll(list2); 18 System.out.println(containsAll);// false 19 20 }
獲取:
1 public static void main(String[] args) { 2 Collection list = new ArrayList(); 3 // 增加:add() 將指定對象存儲到容器中 4 list.add("計算機網絡"); 5 list.add("現代操作系統"); 6 list.add("java編程思想"); 7 list.add("java核心技術"); 8 list.add("java語言程序設計"); 9 System.out.println(list); 10 // 獲取 集合容器的大小 11 int size = list.size(); 12 System.out.println(size); 13 }
下面寫個例子~集合中添加自定義對象:
1 public static void main(String[] args) { 2 3 // 創建集合對象 4 Collection coll = new ArrayList(); 5 6 // 創建Person對象 7 Person p1 = new Person("jack", 25); 8 Person p2 = new Person("rose", 22); 9 Person p3 = new Person("lucy", 20); 10 Person p4 = new Person("jack", 25); 11 12 // 集合中添加一些Perosn 13 14 // 刪除指定Person 15 16 // 刪除所有Person 17 18 // 判斷容器中是否還有Person 19 20 // 判斷容器中是否包含指定Person 21 22 // 獲取容器中Person的個數 23 24 // 將容器變為數組,遍歷除所有Person 25 26 }
分析:
1:Person類
1:姓名和年齡
2:重寫hashCode和equals方法
1:如果不重寫,調用Object類的equals方法,判斷內存地址,為false
1:如果是Person類對象,並且姓名和年齡相同就返回true
2:如果不重寫,調用父類hashCode方法
1:如果equals方法相同,那么hashCode也要相同,需要重寫hashCode方法
3:重寫toString方法
1:不重寫,直接調用Object類的toString方法,打印該對象的內存地址
Person類:
1 class Person { 2 private String name; 3 private int age; 4 5 public Person() { 6 7 } 8 9 public Person(String name, int age) { 10 11 this.name = name; 12 this.age = age; 13 } 14 15 @Override 16 public int hashCode() { 17 return this.name.hashCode() + age; 18 } 19 20 @Override 21 public boolean equals(Object obj) { 22 if (!(obj instanceof Person)) { 23 return false; 24 } 25 Person p = (Person) obj; 26 return this.name.equals(p.name) && this.age == p.age; 27 } 28 29 @Override 30 public String toString() { 31 return "Person :name=" + name + ", age=" + age; 32 } 33 34 }
1 public static void main(String[] args) { 2 Person p1 = new Person("張三", 19); 3 Person p2 = new Person("李四", 20); 4 Person p3 = new Person("王五", 18); 5 Collection list = new ArrayList(); 6 list.add(p1); 7 list.add(p2); 8 list.add(p3); 9 // isEmpty() 判斷集合是否為空 10 boolean empty = list.isEmpty(); 11 System.out.println(empty); 12 // 返回集合容器的大小 13 int size = list.size(); 14 System.out.println(size); 15 // contains()判斷集合何中是否包含指定對象 16 boolean contains = list.contains(p1); 17 System.out.println(contains); 18 19 // remove(); 將指定的對象從集合中刪除 20 list.remove(p1); 21 22 // clear() 清空集合中的所有元素 23 list.clear(); 24 System.out.println(list); 25 26 }
7.List集合:
---| Iterable 接口 Iterator iterator() ----| Collection 接口 ------| List 接口 元素可以重復,允許在指定位置插入元素,並通過索引來訪問元素
List集合特有方法:
1:增加 void add(int index, E element) 指定位置添加元素 boolean addAll(int index, Collection c) 指定位置添加集合 2:刪除 E remove(int index) 刪除指定位置元素 3:修改 E set(int index, E element) 返回的是需要替換的集合中的元素 4:查找: E get(int index) 注意: IndexOutOfBoundsException int indexOf(Object o) // 找不到返回-1 lastIndexOf(Object o) 5:求子集合 List<E> subList(int fromIndex, int toIndex) // 不包含toIndex
增加:
1 public static void main(String[] args) { 2 List list = new ArrayList(); 3 // 增加:add() 將指定對象存儲到容器中 4 list.add("計算機網絡"); 5 list.add("現代操作系統"); 6 list.add("java編程思想"); 7 list.add("java核心技術"); 8 list.add("java語言程序設計"); 9 System.out.println(list); 10 // 刪除0角標元素 11 Object remove = list.remove(0); 12 System.out.println(remove); 13 }
修改:
1 public static void main(String[] args) { 2 List list = new ArrayList(); 3 // 增加:add() 將指定對象存儲到容器中 4 list.add("計算機網絡"); 5 list.add("現代操作系統"); 6 list.add("java編程思想"); 7 list.add("java核心技術"); 8 list.add("java語言程序設計"); 9 System.out.println(list); 10 // 修改2角標位置的書,返回的原來2角標位置的書 11 Object set = list.set(2, "邊城"); 12 System.out.println(set); //java編程思想 13 System.out.println(list); 14 15 }
查找:
1 List list = new ArrayList(); 2 // 增加:add() 將指定對象存儲到容器中 3 list.add("計算機網絡"); 4 list.add("現代操作系統"); 5 list.add("java編程思想"); 6 list.add("java核心技術"); 7 list.add("java語言程序設計"); 8 System.out.println(list); 9 // 查找: E get(int index) 注意角標越界 10 Object set = list.get(list.size() - 1); 11 System.out.println(set); // java語言程序設計 12 System.out.println(list); 13 list.get(list.size()); //IndexOutOfBoundsException 14 }
1 public static void main(String[] args) { 2 List list = new ArrayList(); 3 // 增加:add() 將指定對象存儲到容器中 4 list.add("計算機網絡"); 5 list.add("現代操作系統"); 6 list.add("java編程思想"); 7 list.add("java核心技術"); 8 list.add("java語言程序設計"); 9 list.add("java編程思想"); 10 System.out.println(list); 11 // 查找: E get(int index) 注意角標越界 12 Object set = list.get(list.size() - 1); 13 System.out.println(set); // java語言程序設計 14 System.out.println(list); 15 // list.get(list.size()); //IndexOutOfBoundsException 16 17 // indexOf(Object o) 返回第一次出現的指定元素的角標 18 int indexOf = list.indexOf("java編程思想"); 19 System.out.println(indexOf); // 2 20 // 沒有找到,返回-1 21 int indexOf2 = list.indexOf("三國志"); 22 System.out.println(indexOf2); // -1 23 24 // lastIndexOf 返回最后出現的指定元素的角標 25 int lastIndexOf = list.lastIndexOf("java編程思想"); 26 System.out.println(lastIndexOf); // 5 27 }
