集合

1. 數組與集合

用來存儲一種數據類型的集合容器。
特點:
1. 只能存儲一種數據類型的數據
2. 一旦初始化,數組的長度是固定的
3. 數組中元素之間的內存地址連續
4. Object類型的數組可以存放任意類型的數據


集合相比與數組:
集合可以存放任意類型的數據對象,數組只能存放同一種類型的數據。
集合的長度是可以改變的,數組是固定長度的。


2. Collection接口

以下是Java API中關於Collection接口的說明:
Collection 層次結構 中的根接口。Collection 表示一組對象,這些對象也稱爲 collection 的元素。一些 collection 允許有重複的元素,而另一些則不允許。一些 collection 是有序的,而另一些則是無序的。JDK 不提供此接口的任何直接實現:它提供更具體的子接口(如 Set 和 List)實現。歸納如下:

---| Collection 單例集合根接口
------| List  特點:有序、可以重複
------| Set   特點:無序、不可重複

Collection根接口的常見方法包括:增加元素、刪除元素、查詢、迭代等操作

package com.xpeng_V.collection;

import java.util.*;

/**
---| Collection 單例集合根接口
------| List  特點:有序、可以重複
------| Set   特點:無序、不可重複
*/
public class MyCollection{

    public static void main(String[] args) {

        //使用Collection的實現類ArrayList
        Collection list = new ArrayList();
        Collection list2 = new ArrayList();

        /* 增加
         * add(E e) 向集合中添加元素
         * add(Collection<?> c) 向集合中添加一個集合
         */
        System.out.println("=====================添加元素=====================");
        list.add("xpeng_V");
        list2.add("A");
        list2.add("A");
        list2.add(10);
        list.add(list2);
        System.out.println(list);


        /* 刪除
         * remove() 刪除集合中的指定元素(遇到的第一個)
         * removeAll(Collection<?> c)  刪除交集元素
         * retainAll(collection<?> c)  保留交集元素,刪除其他元素
         * clear()  清空集合中的元素
         * 
         */
        System.out.println("=====================刪除元素=====================");
        list2.remove("A");
        list2.clear();
        System.out.println(list2);

        /* 查詢
         * size() 查看集合的大小
         */
        System.out.println("=======================查詢======================");
        System.out.println("list="+list+"的大小是:"+list.size());

        /* 判斷
         * isEmpty() 是否爲空集合
         * contains()  判斷是否存在指定元素
         * containsAll(Collection<?> c)  
         */
        System.out.println("=======================判斷======================");
        System.out.println("list是否爲空:"+list.isEmpty());
        System.out.println("是否存在xpeng_V:"+list.contains("xpeng_V"));                

        /* 迭代遍歷
         * toArray()  返回集合中的所有元素的爲Object類型的數組
         * iterator()  使用iterator迭代器遍歷集合
         */
        System.out.println("=====================迭代遍歷=====================");
        list.clear();
        list.add(new Person(1, "甲"));
        list.add(new Person(2, "乙"));
        list.add(new Person(3, "丙"));

        Object[] arr =  list.toArray();
        System.out.println("返回的數組是:"+Arrays.toString(arr));

        //輸出編號是2的人的信息
        for (int i = 0; i < arr.length; i++) {
            Person p = (Person) arr[i];  //返回數組類型是Object,需要強轉
            if(p.id == 2){
                System.out.println(p);
            }
        }

        Iterator it = list.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }
}

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

    @Override
    public String toString() {
        return "{"+id+"--"+name+"}";
    }
}

2.1 List接口

已經說明了Collection接口中常見的方法,以下代碼包含List接口中特有的方法。
List接口中的特殊方法,都具有索引值。

package com.xpeng_V.collection;

import java.util.*;

/**
---| Collection 單例集合根接口
------| List  特點:有序、可以重複
------| Set   特點:無序、不可重複
*/
public class MyList {

    public static void main(String[] args) {
        List list = new ArrayList();
        List list2 = new ArrayList();

        System.out.println("有序、可重複、可以爲空");
        list.add("A");
        list.add("A");
        list.add("B");
        list.add(null);
        System.out.println(list);
        list.clear();

        /* 添加元素
         * add(index i,E e)  將元素添加到集合的指定位置
         * addAll(index i,Collection<?> c) 將集合c添加到原集合的指定位置 
         */
        System.out.println("====================添加元素====================");
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(1, "e");
        list2.add("4");
        list2.add("5");
        list.add(0, list2);
        list.add(1);
        System.out.println(list);

        /* 獲取方法
         * get(index i) 獲取指定索引值的元素
         * indexOf(E e) 獲取指定元素第一次出現在集合中的索引值
         * lastIndexOf(E e) 獲取指定元素最後一次出現在集合中的索引值
         * subList(fromIndex i1,toIndex i2) 截取兩索引值之間的元素返回一個List(包頭不包尾)
         */
        System.out.println("=====================獲取=====================");
        System.out.println("使用循環遍歷List集合");
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i));
        }
        System.out.println();

        System.out.println("元素'1'第一次出現的索引值:"+list.indexOf(1));
        System.out.println("元素'1'最後一次出現的索引值:"+list.lastIndexOf(1));

        List list3 = list.subList(2, 4);
        System.out.println("返回的list:"+list3);

        /* 修改
         * set(index i,E e) 使用指定元素替換索引爲i的元素
         */
        System.out.println("=====================修改=====================");
        list.set(0, "替換");
        System.out.println(list);

        /* 迭代
         * listIterator()
         */
        System.out.println("====================迭代遍歷====================");
        ListIterator it = list.listIterator();

        /* ListIterator是Iterator的子接口,它具有Iterator的所有方法。
         * add(E e)       把當前元素插入到當前指針所在的位置
         * set(E e)       替換迭代器最後一次返回的元素
         * hasPrevious()  逆序遍歷 
         * previous()     返回前一個元素
         */

        //逆序排列
        while(it.hasNext()){
            it.next();  //現將指針移動到列表最下端
        }
        while(it.hasPrevious()){
            System.out.println(it.previous());//逆序遍歷
        }

        it.next();
        it.add("A");
        System.out.println(list);

        it.next();
        it.next();
        it.set("B");
        System.out.println(list);



    }
}

2.1.1 ArrayList

ArrayList底層維護了一個Object數組,使用無參構造函數實例化時,Object數組默認的容量是10,當容量不夠時,自動增加0.5倍!
參考ArrayList源碼:

---| Collection 單例集合根接口
------| List  特點:有序、可以重複
--------| ArrayList
--------| LinkedList
--------| Vector
------| Set   特點:無序、不可重複
public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
    private static final long serialVersionUID = 8683452581122892189L;
    private transient Object[] elementData;
    private int size;

    public ArrayList(int initialCapacity) {
    super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
    this.elementData = new Object[initialCapacity];
    }

    //無參數構造方法,默認的容量是10
    public ArrayList() {
    this(10);
    }
    ......
    ......

ArrayList特點:底層維護了一個Object數組,查詢快,增刪慢
ArrayList實例化時,會創建一個Object數組,內存地址是連續的,所以查詢的速度快。
對ArrayList進行增加操作而ArrayList容量不足時,ArrayList首先會增加0.5倍的容量形成一個新的ArrayList,然後將以前的數據拷貝到新的ArrayList中,最後插入新增的數據。因爲拷貝佔用大量的時間,所以ArrayList增加的速度較慢;
對ArrayList進行刪除操作時,會將刪除元素之後的元素拷貝到前面的位置,所以刪除的速度較慢;

2.1.2 LinkedList

LinkedList使用鏈表的數據結構實現,查詢慢,增刪快

2.2 Set接口

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章