1. 程式人生 > 實用技巧 >java集合總結

java集合總結

一:Java集合產生的原因

一方面,面向對 象語言對事物的體現 都是以物件的形式,為了方便對多 個物件的操作,就要對物件進行儲存。 另-方面,使用Array儲存對 象方面具有一些弊端,大小不能動態改變,而Java 集合就像一 種容器,可以動態地把多 個物件的引用放入容器中。所以,Java集合類可以用於儲存數量不等的多個物件,還可用於儲存具有對映關係的關聯陣列

二:集合架構體系圖

●Java集合可分為Collection和Map兩種體系

➢Collection介面:

  ➢Set:元素無序、不可重複的集合--類似高中的"集合”
  ➢List:元素有序,可重複的集合--”動態”陣列
➢Map介面:具有對映關係“key-value對” 的集合--類似於高中的“函式”y=f(x) (x1,y1) (x2,y2)

三:Collection介面

●Collection介面是List、Set 和Queue介面的父介面,該接口裡定義的方法既可用於操作Set集合,也可用於操作List和Queue集合。

3.1:List介面

Java中陣列用來儲存資料的侷限性,List集合類中元素有序、且可重複,集合中的每個元素都有其對應的順序索引。List容器中的元素都對應一個整數型的序號記載其在容器中的位置,

可以根據序號存取容器中的元素。JDK API中List介面的實現類常用的有: ArrayList、 LinkedList和Vector。

  1 package Set;
  2 import
org.junit.Test; 3 4 import java.util.*; 5 6 /* 7 * 1.儲存物件可以考慮:①陣列 ②集合 8 * 2.陣列儲存物件的特點:Student[] stu = new Student[20]; stu[0] = new Student();.... 9 * >弊端:①一旦建立,其長度不可變。②真實的陣列存放的物件的個數是不可知。 10 * 3.集合 11 * Collection介面 12 * |------List介面:儲存有序的,可以重複的元素 13 * |------ArrayList(主要的實現類)、LinkedList(對於頻繁的插入、刪除操作)、Vector(古老的實現類、執行緒安全的)
14 * |------Set介面:儲存無序的,不可重複的元素 15 * |------HashSet、LinkedHashSet、TreeSet 16 * Map介面:儲存“鍵-值”對的資料 17 * |-----HashMap、LinkedHashMap、TreeMap、Hashtable(子類:Properties) 18 */ 19 public class CollectionTest { 20 @Test 21 public void testCollection1() { 22 //size()方法判斷集合的大小,add(Object obj)用來向集合新增元素,addAll(Collection coll),將一個集合中的所有元素新增到另一個集合裡面 23 // isEmpty()用來判斷集合是否為空,clear()用來清空集合裡的元素,contains用來判斷集合是否包含指定的obj元素,對於自定義類物件要重寫equals作為判斷的依據 24 //containsAll(Collection coll):判斷當前集合中是否包含coll中所有的元素,retainAll(Collection coll):求當前集合與coll的共有的元素,返回給當前集合 25 //equals判斷兩個集合中元素是否相同,toArray()變成陣列,Arrays.toList()陣列變成集合,集合可以通過.iterator()來進行遍歷元素,包含next和hasnext方法,也可以增強for迴圈 26 Collection coll = new ArrayList(); 27 coll.add(1); 28 coll.add("hello"); 29 coll.add(new Person("nihao",12));//新增元素 30 System.out.println(coll.size());//判斷大小, 31 coll.add(1); 32 System.out.println(coll.size());//重複的元素可以新增 33 ArrayList arrayList = new ArrayList(); 34 arrayList.add(10); 35 coll.addAll(arrayList);//新增一個集合 36 System.out.println(coll.isEmpty());//判斷是否為空 37 boolean b = (boolean) arrayList.remove(Integer.valueOf(10));//刪除元素10,注意數字是表示按照下標進行刪除,包裝類則是安裝元素進行刪除 38 System.out.println(b); 39 System.out.println(arrayList.isEmpty());//現在為空 40 //coll.clear();//清空元素, 41 //System.out.println(coll); 42 System.out.println(coll.contains(Integer.valueOf(1)));//包含一個元素 43 arrayList.add(1); 44 System.out.println(coll.containsAll(arrayList));//包含一個集合 45 System.out.println(coll.retainAll(arrayList));//求交集 46 System.out.println(coll.equals(arrayList));//判斷兩個集合是否相同 47 System.out.println(arrayList.hashCode());//集合的hashcode值 48 arrayList.add(2); 49 System.out.println(arrayList.hashCode());//hashcode是對所有元素計算的到的。 50 Object []obj = coll.toArray();//集合變成陣列 51 for (int i = 0; i < obj.length; i++) { 52 System.out.println(obj[i]); 53 } 54 int[] a = {1,2,3}; 55 List<int[]> ints = Arrays.asList(a);//陣列變成集合 56 Iterator iterator = ints.iterator(); 57 while (iterator.hasNext()){ 58 System.out.println(iterator.next()); 59 } 60 for (Object ob:coll){ 61 System.out.println(ob); 62 } 63 } 64 //ArrayList:List的主要實現類 65 /* 66 * List中相對於Collection,新增加的方法 67 * void add(int index, Object ele):在指定的索引位置index新增元素ele 68 boolean addAll(int index, Collection eles) 69 Object get(int index):獲取指定索引的元素 70 Object remove(int index):刪除指定索引位置的元素 71 Object set(int index, Object ele):設定指定索引位置的元素為ele 72 int indexOf(Object obj):返回obj在集合中首次出現的位置。沒有的話,返回-1 73 int lastIndexOf(Object obj):返回obj在集合中最後一次出現的位置.沒有的話,返回-1 74 List subList(int fromIndex, int toIndex):返回從fromIndex到toIndex結束的左閉右開一個子list 75 76 List常用的方法:增(add(Object obj)) 刪(remove) 改(set(int index,Object obj)) 77 查(get(int index)) 插(add(int index, Object ele)) 長度(size()) 78 */ 79 @Test 80 public void testArrayList(){ 81 ArrayList ints = new ArrayList(); 82 ints.add(1); 83 ints.add("a"); 84 Collection arrayList = new ArrayList(); 85 arrayList.add("a"); 86 arrayList.add(1); 87 System.out.println(arrayList.equals(ints));//判斷相等不僅看元素,還要看順序, 88 System.out.println(arrayList.hashCode());//一般hashcode除了要看內容,還要看順序,因此若hashcode不相等,equals一般也不想等,互等價 89 System.out.println(ints.hashCode()); 90 ints.addAll(0,arrayList); 91 System.out.println(ints); 92 System.out.println(ints.get(0)); 93 System.out.println(ints.remove(0));//刪除指定位置的元素 94 System.out.println(ints.indexOf("a"));//首次出現的位置, 95 System.out.println(ints.lastIndexOf("a"));//最後一次出現的位置 96 System.out.println(ints.subList(0,2));//返回左閉右開的區間的內容 97 System.out.println(ints.set(0,"b"));//指定位置修改 98 System.out.println(ints); 99 100 } 101 102 }

3.2 set介面

 1 package Set;
 2 
 3 import org.junit.Test;
 4 
 5 import java.util.*;
 6 
 7 public class Set {
 8     @Test
 9     public void test(){//測試hashset
10         HashSet hashSet = new HashSet();
11         hashSet.add(123);
12         hashSet.add(222);
13         hashSet.add("BB");
14         System.out.println(hashSet);//儲存無順序,輸出也無順序。
15         work work1 = new work("ll",10);
16         work work2 = new work("ll",10);
17         hashSet.add(work1);
18         hashSet.add(work2);
19         System.out.println(work1.hashCode());
20         System.out.println(work2.hashCode());
21         System.out.println(hashSet);//對類物件,只有重寫hashCode方法和equals方法後,生成的物件的hash值才可以相同,才能保證set集合的無重複性
22     }
23     /*
24      * LinkedHashSet:使用連結串列維護了一個新增進集合中的順序。導致當我們遍歷LinkedHashSet集合
25      * 元素時,是按照新增進去的順序遍歷的!
26      *
27      * LinkedHashSet插入效能略低於 HashSet,但在迭代訪問 Set 裡的全部元素時有很好的效能。
28      */
29     @Test
30     public void test2(){//測試LinkedHashSet()
31         LinkedHashSet linkedHashSet = new LinkedHashSet();
32         linkedHashSet.add(1);
33         linkedHashSet.add(2);
34         linkedHashSet.add(null);
35         Iterator iterator1 = linkedHashSet.iterator();
36         while (iterator1.hasNext())//因為測試LinkedHashSet在hashset的基礎上添加了連結串列,因此所有新增的元素連線起來,遍歷有序,這是主要的不同
37         {
38             System.out.println(iterator1.next());
39         }
40 
41     }
42     @Test//自然排序
43     public void test3(){//在people類裡面重寫
44         TreeSet set = new TreeSet();
45         set.add(new work("liulei",16));
46         set.add(new work("ww",12));
47         set.add(new work("cc",13));
48         for (Object str1:set){
49             System.out.println(str1);
50         }
51 
52     }
53     @Test
54     public void test4(){//因為只有相同類的兩個例項才會比較大小,所以向 TreeSet 中新增的應該是同一個類的物件
55 
56         Comparator com = new Comparator() {//定製排序
57             @Override
58             public int compare(Object o1, Object o2) {
59                 if(o1 instanceof work && o2 instanceof work){
60                     work c1 = (work) o1;
61                     work c2 = (work) o2;
62                     int i = c1.getAge().compareTo(c2.getAge());//小於負值大於正值
63                     if(i==0){//相等,繼續比較
64                         return c1.getName().compareTo(c2.getName());
65                     }
66                     return i;
67                 }
68                 return 0;
69             }
70         };
71         TreeSet set = new TreeSet();
72         set.add(new work("liulei",16));
73         set.add(new work("ww",12));
74         set.add(new work("cc",13));
75         for (Object str1:set){
76             System.out.println(str1);
77         }
78 
79     }
80 
81 }

對於自然排序,people裡面實驗Comparable,重寫compareTo方法

package Set;

public class Person implements Comparable{
    private String name;
    private Integer age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public Person() {
        super();
    }
    public Person(String name, Integer age) {
        super();
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
    //static int init = 1000;
    @Override
    public int hashCode() {//return age.hashCode() + name.hashCode();û�����Ľ�׳�Ժá�
        final int prime = 31;
        int result = 1;
        result = prime * result + ((age == null) ? 0 : age.hashCode());
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
        //return init++;//����������
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        if (age == null) {
            if (other.age != null)
                return false;
        } else if (!age.equals(other.age))
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }
    //����TreeSet�����Person��Ķ���ʱ�����ݴ˷�����ȷ�������ĸ��������С�

    @Override
    public int compareTo(Object o) {
        if(o instanceof Person){
            Person p = (Person)o;
            //return this.name.compareTo(p.name);
            //return -this.age.compareTo(p.age);
            int i = this.age.compareTo(p.age);
            if(i == 0){
                return this.name.compareTo(p.name);
            }else{
                return i;
            }
        }
        return 0;
    }
    
}
View Code

自然排序

 1 @Override
 2     public int compareTo(Object o) {
 3         if(o instanceof Person){
 4             Person p = (Person)o;
 5             //return this.name.compareTo(p.name);
 6             //return -this.age.compareTo(p.age);
 7             int i = this.age.compareTo(p.age);
 8             if(i == 0){
 9                 return this.name.compareTo(p.name);
10             }else{
11                 return i;
12             }
13         }
14         return 0;
15     }

定製排序

 Comparator com = new Comparator() {//定製排序
            @Override
            public int compare(Object o1, Object o2) {
                if(o1 instanceof work && o2 instanceof work){
                    work c1 = (work) o1;
                    work c2 = (work) o2;
                    int i = c1.getAge().compareTo(c2.getAge());//小於負值大於正值
                    if(i==0){//相等,繼續比較
                        return c1.getName().compareTo(c2.getName());
                    }
                    return i;
                }
                return 0;
            }
        };

四:Map介面

3.1 hashmap

3.2 Linkedhashmap

3.3 Treemap

3.4 Hashtable

3.5 properties

1  @Test
2     public void Test5() throws IOException {
3         Properties pros = new Properties();
4         pros.load(new FileInputStream(new File("D:/config.txt")));
5         String user = pros.getProperty("user");
6         System.out.println(user);
7     }

五:Collections工具類

 1 package com.atguigu.java;
 2 
 3 import java.util.ArrayList;
 4 import java.util.Arrays;
 5 import java.util.Collections;
 6 import java.util.List;
 7 
 8 import org.junit.Test;
 9 
10 /*
11  * 操作Collection以及Map的工具類:Collections
12  * 
13  * 面試題:區分Collection與Collections
14  * 
15  */
16 public class TestCollections {
17     /*
18      *  Object max(Collection):根據元素的自然順序,返回給定集合中的最大元素
19         Object max(Collection,Comparator):根據 Comparator 指定的順序,返回給定集合中的最大元素
20         Object min(Collection)
21         Object min(Collection,Comparator)
22         int frequency(Collection,Object):返回指定集合中指定元素的出現次數
23         void copy(List dest,List src):將src中的內容複製到dest中
24         boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替換 List 物件的所有舊值
25 
26      */
27     @Test
28     public void testCollections2(){
29         List list = new ArrayList();
30         list.add(123);
31         list.add(456);
32         list.add(12);
33         list.add(78);
34         list.add(456);
35         Object obj = Collections.max(list);
36         System.out.println(obj);
37         int count = Collections.frequency(list, 4567);
38         System.out.println(count);
39         //實現List的複製
40         //List list1 = new ArrayList();//錯誤的實現方式
41         List list1 = Arrays.asList(new Object[list.size()]);
42         Collections.copy(list1, list);
43         System.out.println(list1);
44         //通過如下的方法保證list的執行緒安全性。
45         List list2 = Collections.synchronizedList(list);
46         System.out.println(list2);
47     }
48     /*
49      *  reverse(List):反轉 List 中元素的順序
50         shuffle(List):對 List 集合元素進行隨機排序
51         sort(List):根據元素的自然順序對指定 List 集合元素按升序排序
52         sort(List,Comparator):根據指定的 Comparator 產生的順序對 List 集合元素進行排序
53         swap(List,int, int):將指定 list 集合中的 i 處元素和 j 處元素進行交換
54         
55      */
56     @Test
57     public void testCollections1(){
58         List list = new ArrayList();
59         list.add(123);
60         list.add(456);
61         list.add(12);
62         list.add(78);
63         System.out.println(list);
64         Collections.reverse(list);
65         System.out.println(list);
66         Collections.shuffle(list);
67         System.out.println(list);
68         Collections.sort(list);
69         System.out.println(list);
70         Collections.swap(list, 0, 2);
71         System.out.println(list);
72     }
73 }