主頁 > 後端開發 > Java的集合框架---API檔案深入研究2.0

Java的集合框架---API檔案深入研究2.0

2021-12-20 07:27:36 後端開發

目錄

Java的集合框架

1、添加功能

boolean add(Object obj)

boolean addAll(Collection c)

2、洗掉功能

boolean remove(Object o)

boolean removeAll(Collection c)

void clear()

3、獲取功能

Iterator iterator()

boolean hasNext()

Object next()

4、判斷功能

boolean contains(Object o)

boolean containsAll(Collection c)

boolean isEmpty()

5、獲取長度功能

int size()

6、求交集功能

boolean retainAll(Collection c)

7、將集合轉換成陣列

Object[] toArray()


Java的集合框架

接下來我們來對Java的Collection參照API檔案進行詳細的分析:

1、添加功能

boolean add(Object obj)

查看API檔案我們知道:

boolean add(E e)

確保此集合包含指定的元素(可選操作), 如果此集合由于呼叫而更改,則回傳true , (如果此集合不允許重復,并且已包含指定的元素,則回傳false, )

支持此操作的集合可能會限制可能添加到此集合的元素, 特別是一些集合拒絕添加null種元素,和其他人將強加可添加元素的型別限制, 收集類應在其檔案中明確說明可能添加哪些元素的限制,

如果一個集合拒絕添加一個特定的元素,除了它已經包含該元素之外,它必須拋出例外(而不是回傳false ), 這保留了一個集合在此呼叫回傳后始終包含指定元素的不變數,

引數

e - 要確保在此集合中的存在的元素

結果

true如果此集合由于呼叫而更改

例外

UnsupportedOperationException - 如果此 集合不支持add操作

ClassCastException - 如果指定元素的類阻止將其添加到此集合

NullPointerException - 如果指定的元素為空,并且該集合不允許空元素

IllegalArgumentException - 如果元素的某些屬性阻止其添加到此集合

IllegalStateException - 如果由于插入限制,此時無法添加該元素

即確保此集合包含自定的元素(可選操作),反之拋出例外,

參考代碼:

import java.util.ArrayList;
import java.util.Collection;

public class CollectionTestDemo1 {
    public static void main(String[] args) {

        //通過子類的形式創建物件,這叫介面多型
        Collection c = new ArrayList();

        //boolean add(Object obj) 確保此集合包含指定的元素(可選操作),
        System.out.println(c.add("hello"));
        System.out.println(c.add("hadoop"));
        c.add(20);
        c.add(31.41);
        
        System.out.println("集合c:" + c);
    }
}

輸出結果:

true
true
集合c:[hello, hadoop, 20, 31.41]


boolean addAll(Collection c)

查看API檔案我們知道:

public interface Collection<E>
extends Iterable<E>

集合層次結構中的根界面 , 集合表示一組被稱為其元素的物件, 一些集合允許重復元素,而其他集合不允許, 有些被命令和其他無序, JDK不提供此介面的任何直接實作:它提供了更具體的子介面的實作,如Set和List , 該界面通常用于傳遞集合,并在需要最大的通用性的情況下對其進行操作,

多重集 (可能包含重復元素的無序集合)應直接實作此介面,

所有通用的Collection實作類(通常通過其子介面間接實作88446144404803)應提供兩個“標準”建構式:一個void(無引數)建構式,它創建一個空集合,以及一個建構式, Collection ,它創建一個與其引數相同的元素的新集合, 實際上,后一個建構式允許用戶復制任何集合,生成所需實作型別的等效集合, 沒有辦法強制執行此約定(因為介面不能包含建構式),而是所有Java平臺庫中的通用Collection實作,

包含在該界面中的“破壞性”的方法,即,修改其經營的收集方法,被指定拋出UnsupportedOperationException如果此collection不支持該操作, 如果是這樣的話,可能會,但不要求這些方法,拋出一個UnsupportedOperationException如果呼叫會對收集沒有影響, 例如,如果要添加的集合為空,則可以在不可修改的集合上呼叫addAll(Collection)方法,但不是必須拋出該例外,

Some collection implementations have restrictions on the elements that they may contain.例如,一些實作禁止空元素,有些對它們的元素的型別有限制, 嘗試添加不合格元素會引發未經檢查的例外,通常為NullPointerException或ClassCastException , 嘗試查詢不合格元素的存在可能會引發例外,或者可能只是回傳false; 一些實作將展現出前者的行為,一些實作將展現出后者, 更一般來說,嘗試對不符合條件的元素進行操作,其完成不會導致將不合格元素插入到集合中可能會導致例外,或者可能會成功執行該選項, 此例外在此介面的規范中標記為“可選”,

每個集合決定自己的同步策略, 在沒有實作的更強保證的情況下,未定義的行為可能是由于對由另一個執行緒進行突變的集合的任何方法的呼叫而導致的; 這包括直接呼叫,將集合傳遞給可能執行呼叫的方法,并使用現有的迭代器來檢查集合,

在集合框架介面的許多方法在來定義equals方法, 例如,對于在本說明書contains(Object o)方法表示:“回傳true當且僅當這個集合包含至少一個元素e使得(o==null ? e==null : o.equals(e))”, 該規范應該被解釋為意味著具有非空引數呼叫o Collection.contains會導致o.equals(e)被呼叫任何元素e, 實作可以自由地實作優化,從而避免equals呼叫,例如,首先比較兩個元素的哈希碼, ( Object.hashCode()規范保證具有不等的哈希碼的兩個物件不能相等,)更一般地,各種Collections Framework介面的實作可以隨意使用底層Object方法的指定行為,無論執行者認為合適,

執行遞回遍歷集合的一些集合操作可能會失敗,而自參考實體的例外會導致集合直接或間接包含其自身, 這包括clone()equals()hashCode()toString()方法, 實作可以可選地處理自參考場景,然而大多數當前實作不這樣做,

此介面是成員Java Collections Framework ,

實作要求:

默認方法實作(繼承或其他)不應用任何同步協議, 如果Collection實作具有特定的同步協議,那么它必須覆寫默認實作以應用該協議,

即就是將指定集合中的所有元素添加到此集合(可選操作)

參考代碼:

import java.util.ArrayList;
import java.util.Collection;
public class CollectionTestDemo2 {
    public static void main(String[] args) {
        //創建一個集合物件
        Collection c1 = new ArrayList();

        //向集合中添加元素
        c1.add("hello");
        c1.add("world");
        c1.add("java");
        c1.add("hadoop");

        //定義另一個集合
        Collection c2 = new ArrayList();
        c2.add("hello");
        c2.add("world");
        c2.add("hive");
        c2.add("spark");

        System.out.println("c1:" + c1);
        System.out.println("c2:" + c2);

        System.out.println("======================");

        //boolean addAll(Collection c)
        System.out.println("將c1添加到c2中:");
        System.out.println(c2.addAll(c1));
        System.out.println("c1:" + c1);
        System.out.println("c2:" + c2);
    }

輸出結果:

c1:[hello, world, java, hadoop]
c2:[hello, world, hive, spark]
======================
將c1添加到c2中:
true
c1:[hello, world, java, hadoop]
c2:[hello, world, hive, spark, hello, world, java, hadoop]


2、洗掉功能

boolean remove(Object o)

查看API檔案我們知道:

boolean remove(Object o)

從該集合中洗掉指定元素的單個實體(如果存在)(可選操作), 更正式地,洗掉元素e ,使得(o==null ? e==null : o.equals(e)) ,如果該集合包含一個或多個這樣的元素, 如果此集合包含指定的元素(或等效地,如果此集合由于呼叫而更改),則回傳true ,

引數

o - 要從此集合中洗掉的元素(如果存在)

結果

true如果一個元素因此呼叫而被洗掉

例外

ClassCastException - 如果指定元素的型別與此集合不兼容( optional )

NullPointerException - 如果指定的元素為空,并且此集合不允許空元素( optional )

UnsupportedOperationException - 如果此 集合不支持remove操作

參考代碼:

import java.util.ArrayList;
import java.util.Collection;
/*
boolean remove(Object o)
從該集合中洗掉指定元素的單個實體(如果存在)(可選操作),
只移除一個符合條件的
 */
public class CollectionTestRemove {
    public static void main(String[] args) {

        //創建一個集合物件
        Collection c1 = new ArrayList();

        //向集合中添加元素
        c1.add("hello");
        c1.add("world");
        c1.add("java");
        c1.add("hadoop");

        //定義另一個集合
        Collection c2 = new ArrayList();
        c2.add("hello");
        c2.add("world");
        c2.add("hive");
        c2.add("spark");

        System.out.println("c1:" + c1);
        System.out.println("c2:" + c2);

        System.out.println("======================");
        //洗掉c1中的hello
        System.out.println(c1.remove("hello"));

    }
}

輸出結果:

c1:[hello, world, java, hadoop]
c2:[hello, world, hive, spark]
======================
true
[world, java, hadoop]

即從該集合中洗掉指定元素的單個實體(如果存在)(可選操作),


boolean removeAll(Collection<?> c)

查看API檔案我們知道:

boolean containsAll(Collection<?> c)

如果此集合包含指定 集合中的所有元素,則回傳true,

引數

c - 要在此集合中檢查遏制的集合

結果

true如果此集合包含指定集合中的所有元素

例外

ClassCastException - 如果指定集合中的一個或多個元素的型別與此集合不兼容( optional )

NullPointerException - 如果指定的集合包含一個或多個空元素,并且此集合不允許空元素( optional ),或者指定的集合為空,

參考代碼:

import java.util.ArrayList;
import java.util.Collection;
/*
boolean removeAll(Collection c) 洗掉指定集合中包含的所有此集合的元素(可選操作)
此呼叫回傳后,此集合將不包含與指定集合相同的元素,
 */
public class CollectionTestRemoveAllDemo {
    public static void main(String[] args) {
        //創建一個集合物件
        Collection c1 = new ArrayList();

        //向集合中添加元素
        c1.add("hello");
        c1.add("world");
        c1.add("java");
        c1.add("hadoop");

        //定義另一個集合
        Collection c2 = new ArrayList();
        c2.add("hello");
        c2.add("world");
        c2.add("hive");
        c2.add("spark");

        System.out.println("c1:" + c1);
        System.out.println("c2:" + c2);

        System.out.println("======================");

        //boolean removeAll(Collection c) 洗掉指定集合中包含的所有此集合的元素(可選操作),
        // 此呼叫回傳后,此集合將不包含與指定集合相同的元素,
        System.out.println(c1.removeAll(c2));
        System.out.println("c1:" + c1);
        System.out.println("c2:" + c2);
    }
}

輸出結果:

c1:[hello, world, java, hadoop]
c2:[hello, world, hive, spark]
======================
true
c1:[java, hadoop]
c2:[hello, world, hive, spark]

從輸出結果來看boolean removeAll(Collection c)就是洗掉指定集合中包含的所有此集合的元素(可選操作),


void clear()

查看API檔案我們知道:

void clear()

從此集合中洗掉所有元素(可選操作), 此方法回傳后,集合將為空,

例外

UnsupportedOperationException - 如果此 集合不支持clear操作

參考代碼:

import java.util.ArrayList;
import java.util.Collection;

public class CollectionTestClearDemo {
    public static void main(String[] args) {
        //創建一個集合物件
        Collection c1 = new ArrayList();

        //向集合中添加元素
        c1.add("hello");
        c1.add("world");
        c1.add("java");
        c1.add("hadoop");

        //定義另一個集合
        Collection c2 = new ArrayList();
        c2.add("hello");
        c2.add("world");
        c2.add("hive");
        c2.add("spark");

        System.out.println("c1:" + c1);
        System.out.println("c2:" + c2);

        System.out.println("======================");

        //void clear() 從此集合中洗掉所有元素(可選操作)
        c1.clear();
        System.out.println("c1:" + c1);
        System.out.println("c2:" + c2);

    }
}

輸出結果:

c1:[hello, world, java, hadoop]
c2:[hello, world, hive, spark]
======================
c1:[]
c2:[hello, world, hive, spark]

從輸出結果來看void claear()就是從此集合中洗掉所有元素(可選操作),


3、獲取功能

Iterator<E> iterator()

查看API檔案我們知道:

Iterator<E> iterator()

回傳此集合中的元素的迭代器, 沒有關于元素回傳順序的保證(除非這個集合是提供保證的某個類的實體),

Specified by:

iterator在介面 Iterable<E>

結果

一個 Iterator在這個集合中的元素

迭代器,集合的專用遍歷方式

boolean hasNext()

查看API檔案我們知道:

boolean hasNext()

如果迭代具有更多的元素,則回傳true , (換句話說,如果next()回傳一個元素而不是拋出一個例外,則回傳true

結果

true如果迭代有更多的元素

如果迭代具有跟多更多元素,則回傳true

Object next()

查看API檔案我們知道:

E next()

回傳迭代中的下一個元素,

結果

迭代中的下一個元素

例外

NoSuchElementException - 如果迭代沒有更多的元素

回傳此集合中的元素的迭代器,回傳迭代的下一個元素

在學習集合之前我們會采用遍歷陣列的方法來獲取元素,參考代碼如下:

import java.util.ArrayList;
import java.util.Collection;

public class IteratorTest1 {
    public static void main(String[] args) {
        //創建集合物件
        Collection c1 = new ArrayList();

        //添加元素
        c1.add("hello");
        c1.add("world");
        c1.add("java");
        c1.add("20");

        //將集合轉換成陣列
        Object[] array = c1.toArray();

        //遍歷陣列獲取陣列中每一個元素
        for (int i = 0;i < array.length;i++){
//            System.out.println(array[i]);
            /*
            因為獲取到的元素型別是Object型別,
            所以沒有length()方法
            要想呼叫字串中的方法,就需要進行向下轉型
             */
            String s = (String)array[i];
            System.out.println(s+",長度為:" + s.length());
        }
    }

輸出結果:

hello,長度為:5
world,長度為:5
java,長度為:4
20,長度為:2

需求:向集合中添加3個學生物件,并遍歷學生資訊,

參考代碼2:

import java.util.ArrayList;
import java.util.Collection;

/*
        需求:向集合中添加3個學生物件,并遍歷學生資訊
 */
public class IteratorTest2 {
    public static void main(String[] args) {
        //創建集合物件
        Collection c1 = new ArrayList();

        //創建3個學生物件
        Student s1 = new Student("劉德華", 21);
        Student s2 = new Student("張學友", 22);
        Student s3 = new Student("郭富城", 23);

        //將學生物件添加到集合中
        c1.add(s1);
        c1.add(s2);
        c1.add(s3);

        //將學生物件集合轉換成陣列
        Object[] array = c1.toArray();

        //遍歷陣列
        for (int i =0;i<array.length;i++){
            //向下轉型
            Student s = (Student)array[i];
            System.out.println("姓名:" + s.getName() + "---" + "年齡:" + s.getAge());
        }
    }
}

輸出結果:

姓名:劉德華---年齡:21
姓名:張學友---年齡:22
姓名:郭富城---年齡:23

這時我們學習了集合中的迭代器,下面將教大家如何使用迭代器:

import java.util.Iterator;

參考代碼3:

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class CollectionDemo5 {
    public static void main(String[] args) {
        //創建集合物件
        Collection c1 = new ArrayList();

        //向集合中添加元素
        c1.add("hello");
        c1.add("world");
        c1.add("java");
        c1.add("hadoop");

        //獲取c1的迭代器物件
        Iterator iterator = c1.iterator();
        //java.util.ArrayList$Itr@4554617c
//        System.out.println(iterator);

        //Object next() 回傳迭代中的下一個元素,
//        Object obj = iterator.next();
//        System.out.println(obj);
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
        //NoSuchElementException
//        System.out.println(iterator.next());
        //我們通過觀察發現,最后一個System.out.println(iterator.next());
        //是多余的,因為此刻已經將迭代器中的元素遍歷完了,不應該寫
        //我們實際應該在獲取之前判斷一下下一個位置上是否有元素,如果有就next()獲取
        //如果沒有就不獲取
        //boolean hasNext() 如果迭代具有更多元素,則回傳 true ,
//        if(iterator.hasNext()){
//            System.out.println(iterator.next());
//        }
//
//        if(iterator.hasNext()){
//            System.out.println(iterator.next());
//        }
//
//        if(iterator.hasNext()){
//            System.out.println(iterator.next());
//        }
//
//        if(iterator.hasNext()){
//            System.out.println(iterator.next());
//        }
//
//        if(iterator.hasNext()){
//            System.out.println(iterator.next());
//        }
//
//        if(iterator.hasNext()){
//            System.out.println(iterator.next());
//        }
//
//        if(iterator.hasNext()){
//            System.out.println(iterator.next());
//        }


        //通過加入了判斷我們發現,雖然代碼不報錯,也可以將結果元素正確的列印
        //但是呢,我們并不知道迭代器什么時候遍歷到最后一個元素
        //怎么改進呢?用回圈改進
        //由于我們不知道什么時候結束回圈,使用while回圈

        while (iterator.hasNext()) {
            Object next = iterator.next();

            //向下轉型
            String s = (String) next;
            System.out.println(s + ",長度為:" + s.length());
        }


    }
}

輸出結果:

hello,長度為:5
world,長度為:5
java,長度為:4
hadoop,長度為:6

從代碼中可以看出,我們使用了迭代器,并進一步使用while回圈進行了優化,

參考代碼4:

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;


public class CollectionDemo6 {
    public static void main(String[] args) {
        //創建學生集合物件
        Collection c1 = new ArrayList();

        //創建學生物件
        Student s1 = new Student("劉德華", 21);
        Student s2 = new Student("張學友", 22);
        Student s3 = new Student("郭富城", 23);

        //將學生物件添加到集合中
        c1.add(s1);
        c1.add(s2);
        c1.add(s3);

        //獲取迭代器物件
        Iterator iterator = c1.iterator();

        //遍歷迭代器物件,獲取迭代器中的每個元素
        while (iterator.hasNext()) {
            Object next = iterator.next();

//            //向下轉型
//            Student s = (Student) next;
//            System.out.println(s.getName() + "--" + s.getAge());
            System.out.println("姓名" + ((Student) next).getName() + "---" + "年齡:" +  ((Student) next).getAge());
        }

        //NoSuchElementException
//        Object next = iterator.next();
//        System.out.println(((Student) next).getName() + "--" + ((Student) next).getAge());




//        System.out.println("======用普通for回圈遍歷(不推薦)========");
//
//        Iterator iterator = c1.iterator();
//        for(;iterator.hasNext();){
//            Object next = iterator.next();
//
            //向下轉型
//            Student s = (Student) next;
//            System.out.println(s.getName() + "--" + s.getAge());
//        }


    }
}

輸出結果:

姓名劉德華---年齡:21
姓名張學友---年齡:22
姓名郭富城---年齡:23

從輸出結果可以看出使用迭代器一樣能輸出,更方便!

注意:

1、能否將while回圈改成普通for回圈呢?能,但是不推薦,推薦使用whil回圈
2、為什么將Iterator一個介面呢?而不是一個類呢?
    將來你需要根據不同的資料創建不同的集合進行存盤,每個集合都有自身獨有特點,很有可能每一個
    集合遍歷的順序特點不一樣,所以取值的方式也很有可能不一樣,所以不應該直接實作,而是通過一個介面
    將來特有的集合要去使用迭代器時候,就實作一下這個介面,添加自己特有的遍歷元素邏輯代碼,

參考代碼4里注釋已給出為什么使用while回圈,


4、判斷功能

boolean contains(Object o)

查看API檔案我們知道:

boolean contains(Object o)

如果此集合包含指定的元素,則回傳true , 更正式地,回傳true如果且僅當該集合至少包含一個元素e使得(o==null ? e==null : o.equals(e)) ,

引數

o - 要在此集合中存在的元素要進行測驗

結果

true如果此集合包含指定的元素

例外

ClassCastException - 如果指定元素的型別與此集合不兼容( optional )

NullPointerException - 如果指定的元素為空,并且此集合不允許空元素( optional )

參考代碼:

import java.util.ArrayList;
import java.util.Collection;

public class CollectionContainsTestDemo {
    public static void main(String[] args) {
        //創建一個集合物件
        Collection c1 = new ArrayList();

        //向集合中添加元素
        c1.add("hello");
        c1.add("world");
        c1.add("java");
        c1.add("hadoop");
        c1.add("hive");
//        c1.add("spark");

        //定義另一個個集合
        Collection c2 = new ArrayList();
        c2.add("hello");
        c2.add("world");
        c2.add("hive");
        c2.add("spark");

        System.out.println("c1: "+c1);
        System.out.println("c2: "+c2);
        System.out.println("===============================");

        //判斷c1是否包含指定字符hadoop
        System.out.println("判斷c1是否包含指定字符hadoop:\n" + c1.contains("hadoop"));
        //判斷c1是否包含指定字符fink
        System.out.println("判斷c1是否包含指定字符fink:\n" + c1.contains("fink"));

    }
}

輸出結果:

c1: [hello, world, java, hadoop, hive]
c2: [hello, world, hive, spark]
c3: [hello, world, hive, spark]
===============================
判斷c1是否包含指定字符hadoop:
true
判斷c1是否包含指定字符fink:
false

從輸出結果可以看出,就是判斷指定元素是否包含在集合中即如果此集合包含指定的元素,則回傳 true ,反之false,


boolean containsAll(Collection<?> c)

查看API檔案我們知道:

boolean containsAll(Collection<?> c)

如果此集合包含指定 集合中的所有元素,則回傳true,

引數

c - 要在此集合中檢查遏制的集合

結果

true如果此集合包含指定集合中的所有元素

例外

ClassCastException - 如果指定集合中的一個或多個元素的型別與此集合不兼容( optional )

NullPointerException - 如果指定的集合包含一個或多個空元素,并且此集合不允許空元素( optional ),或者指定的集合為空,

參考代碼:

import java.util.ArrayList;
import java.util.Collection;

public class CollectionContainsAllTestDemo {
    public static void main(String[] args) {
        //創建一個集合物件
        Collection c1 = new ArrayList();

        //向集合中添加元素
        c1.add("hello");
        c1.add("world");
        c1.add("java");
        c1.add("hadoop");
        c1.add("hive");
//        c1.add("spark");

        //定義另一個個集合
        Collection c2 = new ArrayList();
        c2.add("hello");
        c2.add("world");
        c2.add("hive");
        c2.add("spark");

//        定義第三個集合
        Collection c3 = new ArrayList();
        c3.add("hello");
        c3.add("world");
        c3.add("hive");
        c3.add("spark");

        System.out.println("c1: "+c1);
        System.out.println("c2: "+c2);
        System.out.println("c3: "+c3);
        System.out.println("===============================");

//        boolean contains(Object o)
        //判斷c1是否包含c2(c1和c2元素不相同)
        System.out.println("判斷c1是否包含c2(c1和c2元素不相同):\n" + c1.containsAll(c2));
        //判斷c2是否包含c3(c2和c3的元素相同)
        System.out.println("判斷c2是否包含c3(c2和c3的元素相同):\n" + c2.containsAll(c3));

    }
}

輸出結果:

c1: [hello, world, java, hadoop, hive]
c2: [hello, world, hive, spark]
c3: [hello, world, hive, spark]
===============================
判斷c1是否包含c2(c1和c2元素不相同):
false
判斷c2是否包含c3(c2和c3的元素相同):
true

如果在c1集合上添加一個spark,則輸出結果為:

c1: [hello, world, java, hadoop, hive, spark]
c2: [hello, world, hive, spark]
c3: [hello, world, hive, spark]
===============================
判斷c1是否包含c2(c1和c2元素不相同):
true
判斷c2是否包含c3(c2和c3的元素相同):
true

從輸出結果可以看出如果此集合包含指定 集合中的所有元素,則回傳true,反之false,


boolean isEmpty()

查看API檔案我們知道:

boolean isEmpty()

如果此集合不包含元素,則回傳 true ,

結果

true如果此集合不包含元素

參考代碼:

import java.util.ArrayList;
import java.util.Collection;

public class CollectionIsEmptyTest {
    public static void main(String[] args) {
        //創建一個集合物件
        Collection c1 = new ArrayList();

        //向集合中添加元素
        c1.add("hello");
        c1.add("world");
        c1.add("java");
        c1.add("hadoop");

        //定義另一個集合
        Collection c2 = new ArrayList();

        System.out.println("c1:" + c1);
        System.out.println("c2:" + c2);

        System.out.println("======================");

        //boolean isEmpty()
        //如果此集合不包含元素,則回傳 true ,
        
        //c1集合中含有元素
        System.out.println(c1.isEmpty());
        //c2集合中沒有元素
        System.out.println(c2.isEmpty());
    }
}

運行結果:

c1:[hello, world, java, hadoop]
c2:[]
======================
false
true

如果此集合不包含元素,則回傳 true ,反之false


5、獲取長度功能

int size()

查看API檔案我們知道:

int size()

回傳此集合中的元素數, 如果此收藏包含超過Integer.MAX_VALUE個元素,則回傳Integer.MAX_VALUE ,

結果

此集合中的元素數

參考代碼:

import java.util.ArrayList;
import java.util.Collection;

public class CollectionSizeTest {
    public static void main(String[] args) {
        //創建一個集合物件
        Collection c1 = new ArrayList();

        //向集合中添加元素
        c1.add("hello");
        c1.add("world");
        c1.add("java");
        c1.add("hadoop");

        //定義另一個集合
        Collection c2 = new ArrayList();

        System.out.println("c1:" + c1);
        System.out.println("c2:" + c2);

        System.out.println("======================");

        //獲取長度功能int size()
        // 回傳此集合中的元素數,
        System.out.println("集合c1的元素個數為:" + c1.size());
        System.out.println("集合c2的元素個數為:" + c2.size());

    }
}

輸出結果:

c1:[hello, world, java, hadoop]
c2:[]
======================
集合c1的元素個數為:4
集合c2的元素個數為:0

通過運行結果可以看出int size()是回傳此集合中的元素數,


6、求交集功能

boolean retainAll(Collection<?> c)

查看API檔案我們知道:

boolean retainAll(Collection<?> c)

僅保留此集合中包含在指定集合中的元素(可選操作), 換句話說,從該集合中洗掉所有不包含在指定集合中的元素,

引數

c - 包含要保留在此集合中的元素的集合

結果

true如果此收集因呼叫而更改

例外

UnsupportedOperationException - 如果此 集合不支持retainAll操作

ClassCastException - 如果此集合中的一個或多個元素的型別與指定的集合不兼容( optional )

NullPointerException - 如果此集合包含一個或多個空元素,并且指定的集合不允許空元素( optional ),或者如果指定的集合為空

參考代碼:

import java.util.ArrayList;
import java.util.Collection;

public class CollectionRetainAllTestDemo {
    public static void main(String[] args) {

        //創建一個集合物件
        Collection c1 = new ArrayList();

        //向集合中添加元素
        c1.add("hello");
        c1.add("world");
        c1.add("java");
        c1.add("hadoop");

        //定義另一個集合
        Collection c2 = new ArrayList();
        c2.add("hello");
        c2.add("world");
        c2.add("hive");
        c2.add("spark");

        System.out.println("c1:" + c1);
        System.out.println("c2:" + c2);

        System.out.println("======================");
        
        /*
          boolean retainAll(Collection c)
          僅保留此集合中包含在指定集合中的元素(可選操作),
          換句話說,從該集合中洗掉所有不包含在指定集合中的元素,

          假設有兩個集合c1,c2
          c1對c2做交集,最終的結果保存在c1中,c2不變
          并且c1中洗掉與c2不是共同的其他元素
         */

        System.out.println(c1.retainAll(c2));
        System.out.println("c1:" + c1);
        System.out.println("c2:" + c2);
    }
}

輸出結果:

c1:[hello, world, java, hadoop]
c2:[hello, world, hive, spark]
======================
true
c1:[hello, world]
c2:[hello, world, hive, spark]

從輸出結果可以看出c1對c2做交集,最終的結果保存在c1中,c2不變,并且c1中洗掉與c2不是共同的其他元素僅保留此集合中包含在指定集合中的元素(可選操作),換句話說:從該集合中洗掉所有不包含在指定集合中的元素,


7、將集合轉換成陣列

Object[] toArray()

查看API檔案我們知道:

Object[] toArray()

回傳一個包含此集合中所有元素的陣列, 如果此集合對其迭代器回傳的元素的順序做出任何保證,則此方法必須以相同的順序回傳元素,

回傳的陣列將是“安全的”,因為該集合不保留對它的參考, (換句話說,這個方法必須分配一個新的陣列,即使這個集合是由陣列支持的), 因此,呼叫者可以自由地修改回傳的陣列,

此方法充當基于陣列和基于集合的API之間的橋梁,

參考代碼:

import java.util.ArrayList;
import java.util.Collection;

public class IteratorTest1 {
    public static void main(String[] args) {
        //創建集合物件
        Collection c1 = new ArrayList();

        //添加元素
        c1.add("hello");
        c1.add("world");
        c1.add("java");
        c1.add("20");

        //將集合轉換成陣列
        Object[] array = c1.toArray();

        //遍歷陣列獲取陣列中每一個元素
        for (int i = 0;i < array.length;i++){
//            System.out.println(array[i]);
            /*
            因為獲取到的元素型別是Object型別,
            所以沒有length()方法
            要想呼叫字串中的方法,就需要進行向下轉型
             */
            String s = (String)array[i];
            System.out.println(s+",長度為:" + s.length());
        }
    }
}

輸出結果:

hello,長度為:5
world,長度為:5
java,長度為:4
20,長度為:2

通過運行結果可以看出 Object[] array = c1.toArray(); 回傳一個包含此集合中所有元素的陣列,


到底啦!寫了2萬1千字的博客!靚仔很辛苦,給個關注吧!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/386556.html

標籤:java

上一篇:java web(ssm)簡答題 考前總結——不詳細,但好背

下一篇:C++與Java共同點

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more