Java集合詳細課堂筆記(附源碼&詳細闡述)

集合概述(課堂筆記)

  • 集合就是一個容器,這個容器可以裝很多其他的數據

  • Collection(根類)

容器:

  • 數組

  • StringBuffer/StringBuilder

  • append() insert()

  • Collection

1、爲什麼會有集合?

​ 數組:長度固定!!!!

​ 存儲學生的成績,但是不知道學生有多少人

1.存儲對象可以考慮,①數組 ②集合

2.數組存儲對象的特點,Student[] stu =new Student[20]; stu[0] =new Student();…

​ > 弊端,①一旦創建,其長度不可變。②真實的數組存放的對象的個數是不可知的

在這裏插入圖片描述

在這裏插入圖片描述

2、集合體系

java集合可分爲Collection和Map兩種體系

  • Collection接口:

    • Set:元素無序、不可重複的集合 (類似高中集合特性:確定性,無序性,互異性)
    • List:元素有序,可重複的集合(類似“動態”數組 如班級成績,成績有一樣的)
  • Map接口:具有映射關係“key-value對”的集合 —類似於高中的“函數” y=f(x) (x1,y1)(x2,y2)

3、接口方法介紹

package Collection1;


import java.util.*;

public class TextCollection {
    public static void main(String[] args) {
        TextCollection textCollection = new TextCollection();
//        textCollection.textCollection1();
//        textCollection.textCollection2();
        textCollection.textCollection3();
    }
    public void textCollection1(){
        Collection coll = new ArrayList();
        // 1. size() :返回集合中元素的個數
        System.out.println(coll.size());
        // 2. add(Object obj) : 向集合中添加一個元素,默認Objcet類型
        coll.add(123);
        coll.add("AA");
        coll.add(new Date());
        coll.add("BB");
        System.out.println(coll.size());

        // 3. addAll(Collection coll) : 將形參coll中包含的所有元素添加到當前集合中
        Collection coll1 = Arrays.asList(1, 2, 3);
        coll.addAll(coll1);
        System.out.println(coll.size());

        //查看集合元素
        System.out.println(coll);

        // 4. isEmpty(); 判斷集合是否爲空
        System.out.println(coll.isEmpty());

        // 5. clear() : 清空集合元素
        coll.clear();
        System.out.println(coll.isEmpty());
    }

    public void textCollection2(){
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(new String("AA"));
        coll.add(new Date());
        coll.add("BB");
        Person p = new Person("MM", 23);
        coll.add(p);
        coll.add(new Person("mm",31));
        System.out.println(coll);

        // 6. contains(Object obj) : 判斷集合中是否包含指定的obj元素,包含返回true,不包含返回false
        //判斷的依據,根據元素所在的類的equals()方法進行判斷
        //明確,如果存入集合中的元素是自定義類的對象,要求,自定義要重寫equals()方法!
        boolean contains = coll.contains(123);
        contains = coll.contains("AA");
        System.out.println(contains);
        boolean contains1 = coll.contains(p);
        System.out.println(contains1);

        boolean mm = coll.contains(new Person("mm", 31));
        System.out.println(mm);

        // 7. containsAll(Collection coll) : 判斷當前集合中是否包含coll中所有的元素
        Collection coll1 = new ArrayList();
        coll1.add(123);
        coll1.add(new String("AA"));
        boolean b = coll.containsAll(coll1);
        System.out.println(b);

        // 8. retainAll(Collection coll) : 求當前集合與coll的共有的元素,返回給當前集合
        coll.retainAll(coll1);

        // 9. remove(Object obj) : 刪除集合中的obj元素,若刪除成功,返回true,否則,
        coll.remove("BB");
    }

    public void textCollection3(){
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(new String("AA"));
        coll.add(new Date());
        coll.add("BB");
        coll.add(new Person("MM",23));

        Collection coll1 = new ArrayList();
        coll1.add(123);
        coll1.add(new String("AA"));
        // 10. removeAll(Collection coll) : 從當前集合中刪除包含在coll中的元素。
        coll.removeAll(coll1);
        System.out.println(coll);

        // 11. equals(Object obj) : 判斷集合中的所有元素是否完全相同
        Collection coll2 = new ArrayList();
        coll2.add(123);
        coll2.add(new String("AA"));
        System.out.println(coll1.equals(coll2));

        // 12. hashCode():
        System.out.println(coll.hashCode());
        System.out.println();
        // 13. toArray() : 將集合轉化爲數組
        Object[] obj = coll.toArray();
        for (int i = 0; i < obj.length; i++) {
            System.out.println(obj[i]);
        }
        System.out.println();

        // 14. iterator()迭代器 : 返回一個Iterator接口實現類的對象,進而實現集合的遍歷!
        Iterator iterator = coll.iterator();
        //方式1
//        System.out.println(iterator.next());
        //方式2
///        for (int i = 0; i < coll.size(); i++) {
///            System.out.println(iterator.next());
///        }
        //方式3
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }

    }

}

4、Collection接口

4.1、List接口

存儲有序的,可以重複的元素

  • ArrayList(主要的實現類)

  • package TestList;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class TestList {
        public static void main(String[] args) {
            TestList testList = new TestList();
    //        testList.textList1();
            testList.textList2();
        }
        //ArrayList, List的主要實現類  (動態數組)
    
        /*
        List中相對於Collection,新增加的方法
        void add(int index) : 在指定的索引位置index添加元素ele
        boolean addAll(int index,Collection eles):在指定位置添加eles集合中的所有元素
        Object get(int index):獲取指定位置的元素
        Object remove(int index): 刪除指定索引位置的元素
        Object set(int index,Object ele):設置指定索引位置的元素爲 ele
        int indexOf(Object obj): 返回obj在集合中首次出現的位置。沒有的話,返回-1
        int lastIndexOf(Object obj): 返回obj在集合中最後一次出現的位置,沒有的話,返回-1
        List subList(int fromIndex,int toIndex): 返回從fromTndex到toIndex
    
        List常用方法,增(add(Object obj))刪(remove)
        改(set(int index,Object obj))查(get(int index))
        插(add(int index,Object ele))長度(size())
         */
        public void textList1(){
            List list = new ArrayList();
            // 1. add添加元素
            list.add(123);
            list.add(456);
            list.add(new String("AA"));
            list.add(new String("GG"));
            System.out.println(list);
            // 2. add向指定位置添加元素
            list.add(0, 555);
            System.out.println(list);
            // 3. get獲取指定位置的元素
            Object o = list.get(1);
            System.out.println(o);
            // 4. remove刪除指定索引位置的元素
            list.remove(0);
            System.out.println(list);
            // 5. set設置指定索引位置的元素
            list.set(0, 111);
            System.out.println(list);
    
    
        }
    
        public void textList2(){
            List list = new ArrayList();
            // 1. add添加元素
            list.add(123);
            list.add(456);
            list.add(new String("AA"));
            list.add(new String("GG"));
            list.add(456);
    
            System.out.println(list);
            System.out.println(list.indexOf(456));
            System.out.println(list.lastIndexOf(456));
            System.out.println(list.indexOf(123)==list.lastIndexOf(123));
            System.out.println(list.indexOf(444));
    
            List list1 = list.subList(0, 3);
            System.out.println(list1);
        }
    }
    
  • LinkedList(對於頻繁的插入、刪除操作)

  • Vector (古老的實現類、線程安全的)

4.2、Set接口

存儲無序的,不可重複的元素

  • HashSet
  • LinkedHashSet
  • TreeSet
package TextSet;

import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;

public class TextSet {
    public static void main(String[] args) {
        TextSet textSet = new TextSet();
//        textSet.testHashSet();
        textSet.testTreeSet1();
    }
    /*
     Collection接口:
         |----List接口存儲有序的,可以重複的元素
                |----ArrayList(主要的實現類);
                |----LinkedList(對於頻繁的插入、刪除操作)、
                |----Vector(古老的實現類,線程安全的,但效率要低於ArrayList)
         |----Set接口,存儲無序的,不可重複的元素.Set中常用的方法都是Collection下定義的。
                |----HashSet(主要實現類)
                |----LinkedHashSet
                |----TreeSet
     */

    public void testTreeSet1(){
        Set set =new TreeSet();
//        set.add(123);
//        set.add(456);//類型不兼容
//        set.add(new String("AA"));
//        set.add(new String("AA"));
//        set.add("JJ");
//        set.add("GG");
//        set.add("MM");
//      都是String類型


           /*
    TreeSet:
    1.向TreeSet中添加的元素必須是同一個類的。
    2.可以按照添加進集合中的元素的指定的順序遍歷。
    像String,包裝類等默認按照從小到大的順序遍歷
    */


        //當Person沒有實現Comparable接口時,當向
        // TreeSet中添加Person對象時,報ClassCastException錯
        set.add(new Person("CC",23));
        set.add(new Person("MM",21));
        set.add(new Person("GG",25));
        set.add(new Person("JJ",24));
        set.add(new Person("DD",20));
        set.add(new Person("DD",19));
        for (Object str : set){
            System.out.println(str);
        }
        //字母順序,指定的順序,從小到大
    }




    public void testHashSet(){
        /*Set:存儲的元素是無序的,不可重複的!
        1.無序性,無序性!=隨機性
        真正的無序性,指的是元素在底層存儲的位置是無序的。
        2.不可重複性,當向Set中添加進相同的元素的時候,後面的這個元素不能夠添加進去

        說明,要求添加進Set中的元素所在類,一定要重寫equals()和hashCode()方法
        進而保證Set中元素的不可重複性

        Set中的元素是如何存儲的呢? 使用了hashCode方法(哈希算法)
            當Set添加對象時,首先調用此對象所在類的hashCode()方法,計算此對象的哈希值,此
            哈希值決定了此對象在Set中的存儲位置,若此位置之前沒有對象存儲,則這個對象存儲到此位置
            若此位置已有對象存儲,再通過equals()比較這兩個對象是否相同,後一個對象就不能再添加進來。
            萬一返回false呢,都存儲,(不建議如此)
             > 要求,hashCode()方法要與equals()方法一致
        */
        Set set = new HashSet();
        set.add(123);
        set.add(465);
        set.add("AA");
        set.add("AA");
        set.add(new String("AA"));
        set.add(new String("AA"));
        set.add("BB");
        set.add(null);
        Person p1 = new Person("GG",23);
        Person p3 = new Person("GG",23);
        Person p2 = new Person("MM",21);
        System.out.println(p1.equals(p3));//沒有重寫equals,並且重寫hashCode,不相同
        System.out.println(p3.hashCode());
        System.out.println(p1.hashCode());
        set.add(p1);
        set.add(p2);
        set.add(p3);
        System.out.println(set.size());
        System.out.println(set);//無序的
    }
}

5、Map接口

存儲“鍵-值”對的數據

  • HashMap
  • LinkedHashMap
  • TreeMap
  • Hashtable(子類:Properties)

5.1、接口說明

  • Map與Collection並列存在。用於保存具有映射關係的數據:Key-Value
  • Map中的Key和Value都可以是任何引用類型的數據
  • Map中的Key用Set來存放,不允許重複,即同一個Map對象所對應的類,需重寫hashCode()和equals()方法
  • 常用String類作爲Map的“鍵”
  • Key和Value之間存在單向一對一關係,即通過指定的Key總能找到唯一的、確定的Value

在這裏插入圖片描述

Map底層結構

在這裏插入圖片描述

package TextMap;

import java.lang.reflect.AnnotatedArrayType;
import java.util.HashMap;
import java.util.Map;

public class TestMap {
    /*
    * Collection接口
    *
    *
    * Map接口
    * 實現類:
    * - HashMap(主要實現類)
    * - LinkedHashMap
    * - TreeMap
    * - Hashtable
    *       - Properties
    *
    * */

    public static void main(String[] args) {
        TestMap testMap = new TestMap();
        testMap.test1();
    }

    //方法介紹
    /*
    Object put(Object key,Object value):向Map中添加一個元素
    Object remove(Object key): 按照指定的key刪除此key-value
    void putAll(Map t) 添加Map類的對象t中所有的key-value添加進調用對象
    void clear() :清空
    Object get(Object key):獲取指定的key的value值,若無指定的key,則返回null
    boolean containsKey(Object key) : 判斷是否包含指定key
    boolean containsValue(Object value): 判斷是否包含指定value 對應類型重寫equals方法
    int size() :返回集合的長度
    boolean isEmpty() 判斷是否爲空
    boolean equals(Object obj)判斷是否相等

    HashMap
    1.Key 不能重複  用Set存放|value 是Collection存放,可重複|
    一個Key-value對,是一個Entry,所有的Entry是用Set存放的,也是不可重複的
    2.向HashMap中添加元素時會調用Key所在類的equals方法,
    判斷兩個Key是否相同,若相同則只能添加進一個,舊的被覆蓋,添加進新的值

    */


    public void test1(){
        Map map =new HashMap();
        ////put 添加 get 獲取
        map.put("AA", 123);
        map.put("AA", 1234);
        System.out.println(map.get("AA"));
        System.out.println(map.get("AC"));
        System.out.println(map.size());
        map.put("BB", 123);
        map.put("CC", 1234);
        map.put(123, "DD");
        map.put(null, null);
                //person要重寫equals
        map.put(new Person("DD",23),123);
        map.put(new Person("DD",23),12);
        ////remove 清空
        map.remove("AA");
        System.out.println(map.size());
        System.out.println(map);

        Map map1 =new HashMap();
        map1.put("AA", 12345);
        map1.put("AAC", 12345);
        map.putAll(map1);
        System.out.println(map);
        System.out.println(map1);
    }

}

6、Person 自定義類代碼

package TextSet;

import java.util.Objects;

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(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public Person() {
        super();
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return Objects.equals(name, person.name) &&
                Objects.equals(age, person.age);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }


    //當向TreeSet中添加Person類的對象時,依據此方法,設定按照哪個屬性排列。
    @Override
    public int compareTo(Object o) {
        if(o instanceof Person){
            Person p=(Person) o;
            return this.name.compareTo(p.name);
        }
        return 0;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章