Java 集合Collection與List的詳解


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     } 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM