201621123033 《Java程序設計》第8周學習總結

第八次做業

1. 本週學習總結

以你喜歡的方式(思惟導圖或其餘)概括總結集合相關內容。
java

2. 書面做業

1. ArrayList代碼分析

1.1 解釋ArrayList的contains源代碼

首先調用了indexOf方法。而indexOf方法則是判斷傳入的參數是否爲空,若爲空,則遍歷整個列表,直到遇到某個爲空的元素,返回其下標;若不爲空,則遍歷整個列表,直到遇到某個值與參數相等的元素,返回其下標。若遍歷完後還未找到與參數值相等的元素,則返回-1。contains方法經過判斷調用indexOf方法返回的值是否大於等於0來判斷列表中是否存在該元素。算法

1.2 解釋E remove(int index)源代碼


首先調用rangeCheck()方法判斷數組是否越界,而後再把被移除的元素後面的元素往前移動一位,最後修改數組大小。數組

1.3 結合1.1與1.2,回答ArrayList存儲數據時須要考慮元素的具體類型嗎?

不須要,經過以上兩題的源代碼能夠發現傳入參數都爲Object類型,object是java類中的基類,全部類都繼承object,因此設置形參爲object時,其餘全部類型均可以傳入。函數

1.4 分析add源代碼,回答當內部數組容量不夠時,怎麼辦?


實際上Arraylist是有初始容量的,且初始容量爲10,因此首先調用ensureCapacityInternal()方法判斷是否須要對數組進行擴容,若須要則調用ensureExplicitCapacity()實現擴容。學習

首先判斷指定位置是否越界,不越界的話再相似add(E e)進行擴容判斷、添加元素。3d

1.5 分析private void rangeCheck(int index)源代碼,爲何該方法應該聲明爲private而不聲明爲public?

由於該方法只是用來判斷數組是否越界,用戶只須要知道結果不須要知道方法的實現過程。指針

2. HashSet原理

2.1 將元素加入HashSet(散列集)中,其存儲位置如何肯定?須要調用那些方法?

首先調用hashCode()計算出待存儲對象的散列碼(HashCode),做爲存儲的位置的依據,若發生衝突,則調用equals()方法與已有元素進行比較,若比較結果爲假,就將該元素經過解決衝突的方法放入對應的位置中,若比較結果爲真,就用新值替換舊值。code

2.2 將元素加入HashSet中的時間複雜度是多少?是O(n)嗎?(n爲HashSet中已有元素個數)

時間複雜度爲O(1),由於HashSet是經過哈希算法來實現的,該過程不須要遍歷,是直接計算位置來添加元素。對象

2.3 選作:嘗試分析HashSet源代碼後,從新解釋2.1

3. ArrayListIntegerStack

題集jmu-Java-05-集合之ArrayListIntegerStackblog

3.1 比較本身寫的ArrayListIntegerStack與本身在題集jmu-Java-04-面向對象2-進階-多態、接口與內部類中的題目自定義接口ArrayIntegerStack,有什麼不一樣?(不要出現大段代碼)

本次的ArrayListIntegerStack是用動態數組寫的,而上次的ArrayIntegerStack是用數組實現的。
存儲形式的不一樣致使了後面操做方法的不一樣。
動態數組獲取棧頂元素,能夠經過size()方法來獲取棧頂位置,而數組則須要自定義棧頂指針,經過指針的移動來獲取棧頂位置。

3.2 結合該題簡單描述接口的好處,需以3.1爲例詳細說明,不可泛泛而談。

咱們以前已經編寫過接口及實現該接口的ArrayIntegerStack,如今咱們要新定義一個類ArrayListIntegerStack,只須要實現這個接口,而後自動添加接口裏的方法,再把這些方法填充實現便可。方便靈活,不用再一個一個編寫方法,同時能夠根據不一樣的工做環境來使用不一樣的方式來實現接口裏的方法。

4. Stack and Queue

4.1 編寫函數判斷一個給定字符串是不是迴文,必定要使用棧(請利用Java集合中已有的類),但不能使用java的Stack類(具體緣由本身搜索)與數組。請粘貼你的代碼,類名爲Main你的學號

import java.util.LinkedList;
import java.util.Scanner;

public class Main201621123033{
    public static void main(String[] args){
        LinkedList<Character> stack=new LinkedList<Character>();
        Scanner sr=new Scanner(System.in);
        String str=sr.next();
        char[] ch=str.toCharArray();
        boolean flag = true;
        for(int i=0;i<str.length();i++){
            stack.add(ch[i]);
        }
        for(int i=0;i<str.length();i++){
            if(stack.pollLast().equals(ch[i])){
                flag=true;
            }
            else{
                flag=false;
                break;
            }               
        }
        if(flag==true)
            System.out.println("這是迴文");
        else
            System.out.println("這不是迴文");
    }

}

4.2 題集jmu-Java-05-集合之銀行業務隊列簡單模擬(只粘貼關鍵代碼)。請務必使用Queue接口,並說明你使用了Queue接口的哪個實現類?

Queue<Integer> q1=new LinkedList();
        Queue<Integer> q2=new LinkedList();

使用了Queue接口的LinkedList實現類。

5. 統計文字中的單詞數量並按單詞的字母順序排序後輸出

題集jmu-Java-05-集合之5-2 統計文字中的單詞數量並按單詞的字母順序排序後輸出

5.1 實驗總結

該題使用了TreeSet來存儲數據,TreeSet具備排序功能且不會添加劇復的數據。
首先使用next()方法來獲取單詞並調用add()方法將其添加到Set中,而後打印出單詞數量。接下來定義一個計數用的變量count,遍歷Set中的元素,並打印出來,每打印一次count就+1,直到count大於等於10則跳出循環。

6. 選作:統計文字中的單詞數量並按出現次數排序

題集jmu-Java-05-集合之5-3 統計文字中的單詞數量並按出現次數排序(不要出現大段代碼)

6.1 僞代碼

建立HashMap對象map
開始循環
IF 讀入單詞爲"!!!!!"
退出循環
ELSE IF map中沒有對應key
添加單詞到map中並設置value爲1
ELSE
將key對應的value值加1
建立ArrayList對象list
實現Collections接口對map對象進行排序
輸出map的長度
輸出排序後list中前十個數據

6.2 實驗總結

一開始是先建立了一個String[]類型的對象來存儲這些輸入的單詞,而後想一個個遍歷再放進map中,結果發現放入map的過程當中會出現空指針錯誤,最後參照7-2的方式,輸入一個單詞就放進map中。後面排序使用ArrayList實現Colletions接口來實現。

3.碼雲及PTA

題目集:jmu-Java-05-集合

3.1. 碼雲代碼提交記錄

3.2 截圖PTA題集完成狀況圖

3.3 統計本週完成的代碼量

周次 總代碼量 新增代碼量 總文件數 新增文件數
3 547 547 12 12
5 971 424 20 8
6 1577 606 29 9
7 2187 1216 41 21
8 2793 606 49 8
9 3040 247 56 7
相關文章
相關標籤/搜索