1.什么是集合
存儲對象的容器,面向對象語(yǔ)言對事物的體現都是以對象的形式,所以為了方便對多個(gè)對象的操作,存儲對象,集合是存儲對象最常用的一種方式。
集合的出現就是為了持有對象。集合中可以存儲任意類(lèi)型的對象,而且長(cháng)度可變。在程序中有可能無(wú)法預先知道需要多少個(gè)對象,那么用數組來(lái)裝對象的話(huà),長(cháng)度不好定義,而集合解決了這樣的問(wèn)題。
2.集合和數組的區別
數組和集合類(lèi)都是容器
數組長(cháng)度是固定的,集合長(cháng)度是可變的。數組中可以存儲基本數據類(lèi)型,集合只能存儲對象數組中存儲數據類(lèi)型是單一的,集合中可以存儲任意類(lèi)型的對象。
集合類(lèi)的特點(diǎn)
用于存儲對象,長(cháng)度是可變的,可以存儲不同類(lèi)型的對象。
數組的缺點(diǎn)
存儲類(lèi)型單一的數據容器,操作復雜(數組一旦聲明好不可變)
3.集合的分類(lèi)
集合做什么
1:將對象添加到集合
2:從集合中刪除對象
3: 從集合中查找一個(gè)對象
4:從集合中修改一個(gè)對象就是增刪改查
注意:集合和數組中存放的都是對象的引用而非對象本身
Java工程師對不同的容器進(jìn)行了定義,雖然容器不同,但是還是有一些共性可以抽取最后抽取了一個(gè)頂層接口,那么就形成了一個(gè)集合框架。如何學(xué)習呢?當然是從頂層學(xué)起,頂層里邊具有最共性,最基本的行為。具體的使用,就要選擇具體的容器了。為什么?因為不斷向上抽取的東西有可能是不能創(chuàng )建對象的.抽象的可能性很大,并且子類(lèi)對象的方法更多一些.所以是看頂層,創(chuàng )建底層。那么集合的頂層是什么呢 叫做Collection
集合框架體系
[java] view plain copy print?---|Collection: 單列集合 ---|List: 有存儲順序, 可重復 ---|ArrayList: 數組實(shí)現, 查找快, 增刪慢 由于是數組實(shí)現, 在增和刪的時(shí)候會(huì )牽扯到數組 增容, 以及拷貝元素. 所以慢。數組是可以直接 按索引查找, 所以查找時(shí)較快 ---|LinkedList: 鏈表實(shí)現, 增刪快, 查找慢 由于鏈表實(shí)現, 增加時(shí)只要讓前一個(gè)元素記住自 己就可以, 刪除時(shí)讓前一個(gè)元素記住后一個(gè)元 素, 后一個(gè)元素記住前一個(gè)元素. 這樣的增刪效 率較高但查詢(xún)時(shí)需要一個(gè)一個(gè)的遍歷, 所以效率 較低 ---|Vector: 和ArrayList原理相同, 但線(xiàn)程安全, 效率略低 和ArrayList實(shí)現方式相同, 但考慮了線(xiàn)程安全問(wèn) 題, 所以效率略低 ---|Set: 無(wú)存儲順序, 不可重復 ---|HashSet ---|TreeSet ---|LinkedHashSet ---| Map: 鍵值對 ---|HashMap ---|TreeMap ---|HashTable ---|LinkedHashMap
為什么出現這么多集合容器,因為每一個(gè)容器對數據的存儲方式不同,這種存儲方式稱(chēng)之為數據結構(data structure)
注意 --集合和數組中存放的都是對象的引用。
4.什么時(shí)候該使用什么樣的集合
5.集合類(lèi)Collection
Collection接口有兩個(gè)子接口:List(鏈表|線(xiàn)性表)和Set(集)
1.特點(diǎn):
Collection中描述的是集合共有的功能(CRUD)
List可存放重復元素,元素存取是有序的
Set不可以存放重復元素,元素存取是無(wú)序的
java.util.Collection ---| Collection 描述所有接口的共性 ----| List接口 可以有重復元素的集合 ----| Set 接口 不可以有重復元素的集合
2:學(xué)習集合對象
學(xué)習Collection中的共性方法,多個(gè)容器在不斷向上抽取就出現了該體系。發(fā)現Collection接口中具有所有容器都具備的共性方法。查閱API時(shí),就可以直接看該接口中的方法。并創(chuàng )建其子類(lèi)對象對集合進(jìn)行基本應用。當要使用集合對象中特有的方法,在查看子類(lèi)具體內容。
查看api 文檔Collection在在java.util中(注意是大寫(xiě)Collection)
注意在現階段遇到的 E T 之類(lèi)的類(lèi)型,需要暫時(shí)理解為object 因為涉及到了泛型.
3:創(chuàng )建集合對象,使用Collection中的List的具體實(shí)現類(lèi)ArrayList
Collection coll=new Arraylist();
6.Collection接口的共性方法
增加: 1:add() 將指定對象存儲到容器中 add 方法的參數類(lèi)型是Object 便于接收任意對象 2:addAll() 將指定集合中的元素添加到調用該方法和集合中 刪除: 3:remove() 將指定的對象從集合中刪除 4:removeAll() 將指定集合中的元素刪除 修改 5:clear() 清空集合中的所有元素 判斷 6:isEmpty() 判斷集合是否為空 7:contains() 判斷集合何中是否包含指定對象 8:containsAll() 判斷集合中是否包含指定集合 使用equals()判斷兩個(gè)對象是否相等 獲取: 9:int size() 返回集合容器的大小 轉成數組 10: toArray() 集合轉換數組
增加:
1 public static void main(String[] args) { 2 Collection list = new ArrayList(); 3 // 增加:add() 將指定對象存儲到容器中 4 list.add("計算機網(wǎng)絡(luò )"); 5 list.add("現代操作系統"); 6 list.add("java編程思想"); 7 System.out.println(list); 8 // [計算機網(wǎng)絡(luò ), 現代操作系統, java編程思想] 9 10 // 增加2 將list容器元素添加到list2容器中 11 Collection list2 = new ArrayList(); 12 list2.add("java核心技術(shù)"); 13 list2.addAll(list); 14 list2.add("java語(yǔ)言程序設計"); 15 System.out.println(list2); 16 // [java核心技術(shù), 計算機網(wǎng)絡(luò ), 現代操作系統, java編程思想, java語(yǔ)言程序設計] 17 }
刪除:
1 // 刪除1 remove 2 boolean remove = list2.remove("java核心技術(shù)"); 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語(yǔ)言程序設計]
修改:
1 public static void main(String[] args) { 2 Collection list = new ArrayList(); 3 // 增加:add() 將指定對象存儲到容器中 4 list.add("計算機網(wǎng)絡(luò )"); 5 list.add("現代操作系統"); 6 list.add("java編程思想"); 7 list.add("java核心技術(shù)"); 8 list.add("java語(yǔ)言程序設計"); 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("計算機網(wǎng)絡(luò )"); 5 list.add("現代操作系統"); 6 list.add("java編程思想"); 7 list.add("java核心技術(shù)"); 8 list.add("java語(yǔ)言程序設計"); 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 }
獲?。?/p>
1 public static void main(String[] args) { 2 Collection list = new ArrayList(); 3 // 增加:add() 將指定對象存儲到容器中 4 list.add("計算機網(wǎng)絡(luò )"); 5 list.add("現代操作系統"); 6 list.add("java編程思想"); 7 list.add("java核心技術(shù)"); 8 list.add("java語(yǔ)言程序設計"); 9 System.out.println(list); 10 // 獲取 集合容器的大小 11 int size = list.size(); 12 System.out.println(size); 13 }
下面寫(xiě)個(gè)例子~集合中添加自定義對象:
1 public static void main(String[] args) { 2 3 // 創(chuàng )建集合對象 4 Collection coll = new ArrayList(); 5 6 // 創(chuàng )建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的個(gè)數 23 24 // 將容器變?yōu)閿到M,遍歷除所有Person 25 26 }
分析:
1:Person類(lèi)
1:姓名和年齡
2:重寫(xiě)hashCode和equals方法
1:如果不重寫(xiě),調用Object類(lèi)的equals方法,判斷內存地址,為false
1:如果是Person類(lèi)對象,并且姓名和年齡相同就返回true
2:如果不重寫(xiě),調用父類(lèi)hashCode方法
1:如果equals方法相同,那么hashCode也要相同,需要重寫(xiě)hashCode方法
3:重寫(xiě)toString方法
1:不重寫(xiě),直接調用Object類(lèi)的toString方法,打印該對象的內存地址
Person類(lèi):
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 接口 元素可以重復,允許在指定位置插入元素,并通過(guò)索引來(lái)訪(fǎng)問(wèn)元素
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("計算機網(wǎng)絡(luò )"); 5 list.add("現代操作系統"); 6 list.add("java編程思想"); 7 list.add("java核心技術(shù)"); 8 list.add("java語(yǔ)言程序設計"); 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("計算機網(wǎng)絡(luò )"); 5 list.add("現代操作系統"); 6 list.add("java編程思想"); 7 list.add("java核心技術(shù)"); 8 list.add("java語(yǔ)言程序設計"); 9 System.out.println(list); 10 // 修改2角標位置的書(shū),返回的原來(lái)2角標位置的書(shū) 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("計算機網(wǎng)絡(luò )"); 4 list.add("現代操作系統"); 5 list.add("java編程思想"); 6 list.add("java核心技術(shù)"); 7 list.add("java語(yǔ)言程序設計"); 8 System.out.println(list); 9 // 查找: E get(int index) 注意角標越界 10 Object set = list.get(list.size() - 1); 11 System.out.println(set); // java語(yǔ)言程序設計 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("計算機網(wǎng)絡(luò )"); 5 list.add("現代操作系統"); 6 list.add("java編程思想"); 7 list.add("java核心技術(shù)"); 8 list.add("java語(yǔ)言程序設計"); 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語(yǔ)言程序設計 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 // 沒(méi)有找到,返回-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 }
聯(lián)系客服