【Java】Collection集合 -練習題目

Collection集合習題

練習一:集合框架概念

一、請簡述集合框架。

集合框架按照其存儲結構可以分爲兩大類:Collection(一組對象)單列集合java.util.Collection和Map(一組映射關係、一組鍵值對)雙列集合java.util.Map

Collection:接口
(1)它是根接口
(2)它沒有直接的實現類,有更具體的子接口:List和Set…
(3)有一些的元素是可以重複的,有些集合的元素是不能重複,有些集合的元素是有序的,有些集合的元素是無序的

Collection是代表一種對象的集合,它是Collection系列的根接口。

它們雖然:有些可能是有序的,有些可能是無序的,有些可能可以重複的,有些不能重複的,但是它們有共同的操作規範,因此這些操作的規範就抽象爲了Collection接口。

Collection:單列集合類的根接口,用於存儲一系列符合某種規則的元素,它有兩個重要的子接口,分別是java.util.List和java.util.Set。其中,List的特點是元素有序、元素可重複。Set的特點是元素無序,而且不可重複。List接口的主要實現類有java.util.ArrayList和java.util.LinkedList,Set接口的主要實現類有java.util.HashSet和java.util.TreeSet。

Map概述

用來存儲鍵值對,映射關係的集合。所有的Map的key都不能重複。

鍵值對、映射關係的類型:Entry類型

Entry接口是Map接口的內部接口。所有的Map的鍵值對的類型都實現了這個接口。
HashMap中的映射關係,是有一個內部類來實現Entry的接口,JDK1.7是一個叫做Entry的內部類實現Entry接口。
JDK1.8是一個叫做Node的內部類實現Entry接口。
TreeMap中的映射關係,是有一個內部類Entry來實現Entry的接口

Map概述

用來存儲鍵值對 映射關係的集合。

問:爲何Collection不從Cloneable和Serializable接口繼承?

參考答案:

克隆(cloning)或者是序列化(serialization)的語義和含義是跟具體的實現相關的。因此,應該由集合類的具體實現來決定如何被克隆或者是序列化。

集合類的具體實現來決定如何被克隆或者是序列化。

問:Collections類是什麼?

參考答案:

Java.util.Collections是一個工具類僅包含靜態方法,它們操作或返回集合。它包含操作集合的多態算法,返回一個由指定集合支持的新集合和其它一些內容。這個類包含集合框架算法的方法,比如折半搜索、排序、混編和逆序等。

問:與Java集合框架相關的有哪些最好的實踐?

參考答案:

(1)根據需要選擇正確的集合類型。比如,如果指定了大小,我們會選用Array而非ArrayList。如果我們想根據插入順序遍歷一個Map,我們需要使用TreeMap。如果我們不想重複,我們應該使用Set。

指定了大小 選擇Array數組

不知道大小 動態數據ArrayList

插入順序遍歷一個Map,使用TreeMap

不想重複 使用Set

(2)一些集合類允許指定初始容量,所以如果我們能夠估計到存儲元素的數量,我們可以使用它,就避免了重新哈希或大小調整。

指定初始化容量

(3)基於接口編程,而非基於實現編程,它允許我們後來輕易地改變實現。

面向接口編程 易於擴展 容易改變

(4)總是使用類型安全的泛型,避免在運行時出現ClassCastException。

類轉換異常

使用類型安全的泛型

(5)使用JDK提供的不可變類作爲Map的key,可以避免自己實現hashCode()和equals()。

(6)儘可能使用Collections工具類,或者獲取只讀、同步或空的集合,而非編寫自己的實現。它將會提供代碼重用性,它有着更好的穩定性和可維護性。

有,就用。 代碼重用性 更好的穩定性和可維護性。

問:Java集合框架是什麼?說出一些集合框架的優點?

數據結構,容器:

用來裝對象…,等各種管理對象的容器。

容器有相同的操作標準:

(1)增

(2)刪

(3)改

(4)查

因爲集合的類型很多,那麼我們把它們稱爲集合框架。

參考答案:

每種編程語言中都有集合。集合框架的部分優點如下:
(1)使用核心集合類降低開發成本,而非實現我們自己的集合類。

使用核心集合類

(2)隨着使用經過嚴格測試的集合框架類,代碼質量會得到提高。

使用高質量的集合框架類 代碼質量提高

(3)通過使用JDK附帶的集合類,可以降低代碼維護成本。

使用JDK的集合類 降低代碼維護成本

(4)複用性和可操作性。

複用性 可操作性

問:集合框架中的泛型有什麼優點?

參考答案:

Java1.5引入了泛型,所有的集合接口和實現都大量地使用它。

泛型允許我們爲集合提供一個可以容納的對象類型,因此,如果你添加其它類型的任何元素,它會在編譯時報錯。這避免了在運行時出現ClassCastException,因爲你將會在編譯時得到報錯信息。泛型也使得代碼整潔,我們不需要使用顯式轉換和instanceOf操作符。它也給運行時帶來好處,因爲不會產生類型檢查的字節碼指令。

Java1.5引入了泛型 所有的集合接口和實現都大量使用它

泛型

練習二:Collection集合統計元素出現次數

一、給定以下代碼,請定義方法listTest()統計集合中指定元素出現的次數,如"a": 2,“b”: 2,“c” :1, “xxx”:0。

統計集合中指定元素出現的次數

 Collection<String> list = new ArrayList<>();

​           list.add("a");

​           list.add("a");

​           list.add("b");

​           list.add("b");

​           list.add("c");

​           System.out.println("a:"+listTest(list, "a")); 

​           System.out.println("b:"+listTest(list, "b")); 

​           System.out.println("c:"+listTest(list, "c"));

​           System.out.println("xxx:"+listTest(list, "xxx")); 

統計集合中指定元素出現的次數

遍歷集合每一個元素是否等於指定元素 count++

code

public class CollectionTest01 {
    public static void main(String[] args) {
        Collection<String> list = new ArrayList<>();
        list.add("a");
        list.add("a");
        list.add("b");
        list.add("b");
        list.add("c");
        System.out.println("a:" + listTest(list, "a"));
        System.out.println("b:" + listTest(list, "b"));
        System.out.println("c:" + listTest(list, "c"));
        System.out.println("xxx:" + listTest(list, "xxx"));
        //a:2
        //b:2
        //c:1
        //xxx:0
    }

    //定義方法統計集合中指定元素出現的次數
    public static int listTest(Collection<String> list, String s) {
        //定義計數器,初始化爲0
        int count = 0;
        //增強for遍歷集合
        for (String string : list) {
            //判斷傳入方法的字符與遍歷集合的是否一致
            if (s.equals(string)) {
                //如果一致,加1
                count++;
            }
        }
        return count;
    }
}

練習三:Collection集合數組轉集合

一、定義一個方法,要求此方法把int數組轉成存有相同元素的集合(集合裏面的元素是Integer),並返回。()

定義個集合 遍歷數組元素add到集合中 返回打印

public class CollectionTest02 {
    public static void main(String[] args) {
        //定義int數組
        int[] arr = {1, 2, 3, 4, 5};
        ArrayList<Integer> list = listTest(arr);
        System.out.println(list);//[1, 2, 3, 4, 5]
    }

    public static ArrayList<Integer> listTest(int[] arr) {
        //定義集合
        ArrayList<Integer> list = new ArrayList<Integer>();
        //遍歷數組,把元素依次添加到集合當中
        for (int a : arr) {
            list.add(a);
        }
        return list;
    }
}

練習四:Collection集合轉數組

定義一個集合,並把集合(集合裏面的元素是Integer)轉成存有相同元素的數組,並將結果輸出在控制檯。(可以使用Object[]數組類型接收轉換的數組)

toArray()

public Object[] toArray() {
        return Arrays.copyOf(elementData, size);
    }


public class CollectionTest03 {
    public static void main(String[] args) {
        //定義集合,添加數據
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(100);
        list.add(200);
        list.add(300);
        //Object[] toArray()轉換成一個Object數組
        Object[] obj =  list.toArray();
        // 遍歷數組
        for (int i = 0; i < obj.length; i++) {
            System.out.println(obj[i]);
        }
        //Result
        //100
        //200
        //300
    }
}

練習五:Collection集合contains()方法使用

定義一個方法listTest(ArrayList al, String s),要求使用contains()方法判斷al集合裏面是否包含s。

public class CollectionTest04 {
    public static void main(String[] args) {
        //定義集合,添加數據
        ArrayList<String> list = new ArrayList<String>();
        list.add("hello");
        list.add("world");
        list.add("java");
        System.out.println(listTest(list, "java"));
    }

    public static boolean listTest(ArrayList<String> al, String s) {
        //判斷s是否在集合中存在,存在返回true,不存在返回false
        if (al.contains(s)) {
            return true;
        }
        return false;
    }
}

練習六:Collection集合isEmpty()方法的使用

一、定義一個方法listTest(ArrayList al), 要求使用isEmpty()判斷al裏面是否有元素。

public class CollectionTest05 {
    public static void main(String[] args) {
        //定義集合,添加數據
        ArrayList<String> list = new ArrayList<String>();
        list.add("1");
        list.remove(0);
        System.out.println(listTest(list));//true
    }

    public static boolean listTest(ArrayList<String> al) {
        //判斷al集合是否爲空,爲空返回true,不爲空返回false
        if (al.isEmpty()) {
            return true;
        }
        return false;
    }
}

練習七:簡述迭代器的實現原理

一、請簡述迭代器的實現原理

當遍歷集合時,首先通過調用集合的iterator()方法獲得迭代器對象,然後使用hashNext()方法判斷集合中是否存在下一個元素,如果存在,則調用next()方法將元素取出,否則說明已到達了集合末尾,停止遍歷元素。

Iterator迭代器對象在遍歷集合時,內部採用指針的方式來跟蹤集合中的元素,在調用Iterator的next()方法之前,迭代器的索引位於第一個元素之前,不指向任何元素,當第一次調用迭代器的next方法後,迭代器的索引會向後移動一位,指向第一個元素並將該元素返回,當再次調用next方法時,迭代器的索引會指向第二個元素並將該元素返回,依此類推,直到hasNext方法返回false,表示到達了集合的末尾,終止對元素的遍歷。

問:Iterator是什麼?

參考答案:

Iterator接口提供遍歷任何Collection的接口。我們可以從一個Collection中使用迭代器方法來獲取迭代器實例。迭代器取代了Java集合框架中的Enumeration。迭代器允許調用者在迭代過程中移除元素。

問:迭代器的優點

參考答案:

如果用的是for循環,就用集合自帶的remove(),而這樣就改變了集合的Size()循環的時候會出錯。但如果把集合放入迭代器,既iterator迭代可以遍歷並選擇集合中的每個對象而不改變集合的結構,而把集合放入迭代器,用迭代器的remove()就不會出現問題

練習八:Collection集合返回首次出現索引

一、定義一個方法listTest(ArrayList al, Integer s),要求返回s在al裏面第一次出現的索引,如果s沒出現過返回-1。

public class CollectionTest06 {
    public static void main(String[] args) {
        //定義集合,添加數據
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        System.out.println(listTest(list, 5));//4
    }

    public static int listTest(ArrayList<Integer> al, Integer s) {
        //遍歷集合,獲取元素,判斷元素是否與s相等,相等返回索引
        for (int i = 0; i < al.size(); i++) {
            if (al.get(i).equals(s)) {
                return i;
            }
        }
        return -1;
    }
}

2、參考資料

記錄

記錄 - 搞定Java核心技術
高薪之路–Java面試題精選集

【Java】Java->JavaWeb->Spring全家桶->社區、教育、電商項目等等

從Hello到goodbye

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