天天看點

集合

什麼是集合

由若幹元素構成的集合

學生構成了一個班級 若幹個班級構成了年級

父母親人構成了家庭 等等

數組和集合的差別

  1. 數組

    長度初始化後不可改變
  2. 數組

    隻能按索引順序存取
  3. 集合大小可以

    任意改變

  4. 保證無重複元素的集合
  5. ...

Collection(除了Map之外的集合的老祖宗 是一個接口 在java.util包中)

java.util

包中提供了以下三種類型的集合

  1. List

    集合 一種有序清單的集合
  2. Set

    集合 一種保證沒有重複元素的集合
  3. Map

    集合 一種通過鍵值(key-value)查找的映射表集合

List示例

package com.collection;


import org.junit.Test;

import java.util.*;

public class Demo01 {
    public static void main(String[] args) {
        List list1 = new ArrayList<>();

        // 集合是否為空
        System.out.println(list1.isEmpty());

        // 添加集合元素
        list1.add("wwbao");
        list1.add("yyll");
        list1.add(20);
        list1.add(false);
        list1.add(new Person("yyll", 22));
        list1.add(new String("1314"));

        System.out.println("==============size==========");
        int size = list1.size();
        System.out.println("==>Get size:" + size);

        System.out.println("============contains============");
        // contains 目前集合是否包含某個對象
        System.out.println(list1.contains(20));  // true

        /*
         * 當對比自定義類時 實際上contains 比較的是對象的equals方法
         * 如果沒有重寫equals方法 則調用的是Object類的equals方法
         * equals方法比較的是 值!!!
         * */
        System.out.println(list1.contains(new Person("yyll", 22))); // true
        System.out.println(list1.contains(new String("1314"))); // true
        System.out.println("============contailsAll==========");

        List list = Arrays.asList("wwbao", "yyll");
        // 判斷list中所有元素是否存在于coll中
        System.out.println(list1.containsAll(list));

        System.out.println("=============周遊===========");
        Iterator it = list.iterator();
        // hasNext判斷是否有下一個元素 有傳回true 沒有傳回false
        while (it.hasNext()) {
            // next方法擷取元素
            Object result = it.next();
            System.out.println("==>Get result:" + result);
        }

        System.out.println("=============indexOf===========");
        /*
         * 清單中指定元素的第一次出現的索引
         *
         * 清單不包含元素,則傳回-1
         * */
        int index = list1.indexOf(111);
        System.out.println("傳回indexOf的位置是:" + index);

        System.out.println("=============remove===========");
        System.out.println("删除前的list:" + list1);
        Object remove = list1.remove(3);
        System.out.println(remove);
        System.out.println("删除後的list:" + list1);

        System.out.println("=============toArray() ===========");
        Object[] arrays = list1.toArray();
        System.out.println(Arrays.toString(arrays));
    }
}
           

Person

package com.collection;

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

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

    @Override
    public boolean equals(Object o) {
        System.out.println("person的equals方法");
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Person person = (Person) o;

        if (age != person.age) return false;
        return name != null ? name.equals(person.name) : person.name == null;
    }
           

輸出

集合

集合交集

@Test
    /**
     * 集合交集
     */
    public void test1() {
        Collection coll = new ArrayList();
        coll.add("wwbao");
        coll.add("yyll");
        coll.add(20);
        coll.add(false);
        coll.add(new String("1314"));

        Collection coll1 = new ArrayList();
        coll1.add("wwbao");
        coll1.add("yyll");
        coll1.add(20);
        coll1.add(false);
        coll1.add(new String("1314"));

//        coll.retainAll(coll1);
//        System.out.println(coll);
        /*
        * equals
        * 如果結果為true
        * 目前集合和形參必須資料完全一模一樣
        * ArrayList是一個有序集合!!!!!!!!!
        * 順序如果錯了 資料相同 equals 判斷也是false
        * */
        System.out.println(coll.equals(coll1));
    }
           

輸出

集合

集合差集

@Test
    /**
     * 集合差集
     */
    public void test() {
        Collection coll = new ArrayList();
        coll.add("wwbao");
        coll.add("yyll");
        coll.add(20);
        coll.add(false);
        coll.add(new String("1314"));

        Collection coll1 = Arrays.asList(false, 20);
        coll.removeAll(coll1);
        System.out.println(coll);
    }
           

輸出

集合

集合 數組互轉

@Test
    /**
     * 集合轉成數組
     * 數組到集合
     */
    public void test2() {
        Collection coll = new ArrayList();
        coll.add("wwbao");
        coll.add("yyll");
        coll.add(20);
        coll.add(false);
        coll.add(new String("1314"));
        Object[] arrays = coll.toArray();
        System.out.println("集合到數組:" + Arrays.toString(arrays));

        List list = Arrays.asList("wwbao", "yyll", 20);
        System.out.println("數組到集合:" + list);

        List list1 = Arrays.asList(new int[]{123, 456});
        System.out.println("new int:" + list1);
        System.out.println("new int size:" + list1.size());
        /*
         * new int:[[I@4ee285c6]
         * new int size:1
         *
         * int類型數組中有兩個元素 但是轉成集合後
         * size 為 1
         * */

        List list2 = Arrays.asList(new Integer[]{123, 456});
        System.out.println("new Integer:" + list2);
        System.out.println("new Integer size:" + list2.size());
        /*
        * new Integer:[123, 456]
        * new Integer size:2
        * */
        
        
        /*
        * 以後使用Arrays.asList方法 
        * 如果使用基本類型為入參 則asList方法會将當成一個對象
        * 不會得到預期的結果
        * 要麼使用基本類型對應的包裝類
        * 要麼直接指派  Arrays.asList(123,456) ...
        * */
    }
           

輸出

集合

疊代器

@Test
    public void test1() {
        Collection coll = new ArrayList();
        coll.add("wwbao");
        coll.add("yyll");
        coll.add(20);
        coll.add(false);
        coll.add(new String("1314"));

        Iterator it = coll.iterator();

        while (it.hasNext()) {
            // it.remove(); // java.lang.IllegalStateException
            Object value = it.next();
            if (value.equals(20)) {
                it.remove();
            }
            // it.remove(); // java.lang.IllegalStateException
        }
        System.out.println(coll);
        /*
        * 輸出結果
        * [wwbao, yyll, false, 1314]
        * 1.在next方法沒有調用之前 不能調用remove方法 否則
        * 報異常 java.lang.IllegalStateException
        *
        * 2.在next方法調用之後 隻能調用一次remove方法
        * 還是會報異常 java.lang.IllegalStateException
        * */
    }
           

小結

  1. 集合類定義在

    java.util

    包中 有List Map Set三種集合類 使用

    Iterator

    進行周遊
  2. Arrays.asList

    不要用基本類型傳參
  3. contains

    方法實際使用的是對象的equals方法
  4. 如果List集合中包含了

    自定義

    類 則該類必須重寫equals方法 以保證資料的一緻性

即使再小的帆也能遠航