Week08《Java程序設計》第八次學習總結

Week08《Java程序設計》第八次學習總結

1. 本週學習總結

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

2.書面做業

1. ArrayList代碼分析

1.1 解釋ArrayList的contains源代碼

答:算法

  • ArrayList的contains的源代碼以下:
public boolean contains(Object o) {
    return indexOf(o) >= 0;
    }
 public int indexOf(Object o) {
    if (o == null) {
        for (int i = 0; i < size; i++)
        if (elementData[i]==null)
            return i;
    } else {
        for (int i = 0; i < size; i++)
        if (o.equals(elementData[i]))
            return i;
    }
    return -1;
    }
 public boolean equals(Object obj) {
    return (this == obj);
    }
  • 從上能夠看出,contians方法是先判斷對象是否爲null,對象爲空,就返回列表中第一個null的索引,若是對象不爲空就與列表中元素逐一對比,在此過程當中會調用equals方法來比較兩個對象的引用是否相同,最終沒有包含該對象的時候返回-1。數組

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

    答:
  • remove源代碼
public E remove(int index) {
        RangeCheck(index);

        E oldValue = (E) elementData[index];
      
        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved); 
        elementData[--size] = null; 
        return oldValue;
    }
  • 經過RangeCheck(index)檢查index是否在索引範圍內,知足條件,將要刪除的元素賦給oldValue,再將該元素刪除,最後返回oldValue。
    當index不在索引範圍時,會拋出異常 IndexOutOfBoundsException(outOfBoundsMsg(index))。
 private void rangeCheck(int index) {         if (index >= size) 
            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));     
}

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

答:函數

  • ArrayList構造函數源碼
public ArrayList() {  
       super();       
      this.elementData = EMPTY_ELEMENTDATA;//EMPTY_ELEMENTDATA是個空的Object[],將elementData初始化,elementData也是Object[]類型
    }

在構造函數中,ArrayList類中定義了elementData數組(private transient Object[] elementData)來存放對象,這個數組是Object類型,即不管放入什麼引用類型,都會包裝成Object類型存入,因此無需考慮具體類型。學習

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

答:add()有兩個方法,boolean add(E),void add(int ,E)this

public boolean add(E e) {    
    
        ensureCapacityInternal(size + 1);  
        elementData[size++] = e;
        return true;
    }
private void ensureCapacityInternal(int minCapacity) {
        if (elementData == EMPTY_ELEMENTDATA) {
            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
        }
        ensureExplicitCapacity(minCapacity);
    }

要添加一個元素,先判斷size+1(size是數組中數據的個數)這個個數數組可否放得下,用ensureCapacityInternal()這個方法判斷數組長度(數組.length())可否夠用。當數組爲空時沒有長度,就默認minCapacity變成10,即默認數組大小爲10。設計

  • 經過 ensureExplicitCapacity(minCapacity)確認實際的容量。(elementData不是空的數組時,minCapacity=size+1,表明elemenData增長後的實際數據個數,用minCapacity與elementData.length比較)。當內部數組不夠用時,ArrayList會 自動擴展數組大小。
private void ensureExplicitCapacity(int minCapacity) {
        modCount++;
      if (minCapacity - elementData.length > 0)
 
            grow(minCapacity);
    }
private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length; 
        int newCapacity = oldCapacity + (oldCapacity >> 1)
        if (newCapacity - minCapacity < 0)//空數組時,真正初始化elementData大小爲10
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)y
            newCapacity = hugeCapacity(minCapacity);
        elementData = Arrays.copyOf(elementData, newCapacity);  //肯定新容量,拷貝數組,改變容量大小
    }

擴容時,會將原來數組的大小給oldCapacity,newCapacity是1.5倍的oldCapacity。newCapacity - MAX_ARRAY_SIZE > 0判斷newCapacity是否超過最大容量限制,超過就將能給的最大值給newCapacity,此時肯定新容量大小,就拷貝原來數組,並改變容量大小。3d

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

答:rangeCheck用於判斷數組是否越界,只有本類移除、增添等方法中須要使用,就用private將其封裝起來,用戶只須要知道移除,增添等方法,不須要知道具體的實現過程。指針

2. HashSet原理

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

答:經過哈希算法進行肯定存儲位置。先調用hashCode()方法,計算出哈希值,找到對應的鏈表,調用equals方法判斷該鏈表中是否有重複的對象。code

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

答:時間複雜度爲O(1)。經過哈希算法得出位置就將元素直接添加進表中,這個過程的時間複雜度爲O(1)。

3. ArrayListIntegerStack

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

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

答:

  • 實現類中存儲數據形式不一樣,自定義接口ArrayIntegerStack中用Integer數組,而ArrayListIntegerStack中使用集合List的ArrayList類。
  • 自定義接口ArrayIntegerStack中容易發生數組越界的問題,ArrayListIntegerStack中動態數組ArrayList會自動擴容,不用擔憂會發生越界現象。
  • ArrayIntegerStack中須要多一個top指針來存取元素,ArrayListIntegerStack則不用,經過ArrayList存放元素極大便利了棧的操做。

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

答:接口IntegerStack與上次自定義接口相同, ArrayListIntegerStack實現了該接口。此時咱們無需再從新寫一個棧並重寫實現方法。實現該接口後,咱們只需編寫具體方法就能夠了,減小沒必要的代碼量,讓代碼更爲靈活。

4. Stack and Queue

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

答:

  • 自定義棧,用ArrayList存儲字符
public class CharatorStack {
    private List<Character> list;

    public CharatorStack() {
        List<Character> list=new ArrayList<>();
        this.list = list;
    }
    //入棧
    public void push(char c) { 
        list.add(c);
    }
     //出棧,如棧爲空,則返回null。
        public Character pop(int i) {
            if(list.size()==0)
               return null;
            return list.remove(i);//出棧時注意移除出棧元素
        }
        //得到棧頂元素,如棧頂爲空,則返回null。注意:不要出棧
        public Character peek() {
            if(list.size()-1==0)
               return null;
            return list.get(list.size()-1);
        }
         //如過棧爲空返回true
        public boolean empty() {
           if(list.size()==0)
                return true;
           else
               return false;
        }
}
  • 實現類
public class Main201621123003 {

    public static void main(String[] args) {
    Scanner sc=new Scanner(System.in);
    CharatorStack stack=new CharatorStack();

    while(true){
    String str=sc.next();
    if(str.equals("end"))
        break;
    char[] c=str.toCharArray();
    for (int i = 0; i < str.length(); i++) {
        stack.push(c[i]);
    }
    int flag=0;
  for (int i = 0; i < c.length; i++) {
    if(c[i]==stack.pop(c.length-i-1)){
        flag=1;
        }
    else{
        flag=0;
    }
}
  if(flag==1)
  {
      System.out.println("YES");
  }
  else{
      System.out.println("NO");
  }
    }
    }

}
  • 運行

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

答:

  • 使用Queue接口,並用LinkedList來實現。
  • 主要代碼
if (Integer.parseInt(strs[0]) <= 1000) {
            for (int i = 1; i < strs.length; i++) {
                int temp1 = Integer.parseInt(strs[i]);
            if (temp1 % 2 == 0) {
                    arrBQueue.add(temp1);
                } else {
                    arrAQueue.add(temp1);
                }
            }
        }
        int i=0;
        if(!arrAQueue.isEmpty())
            System.out.print(arrAQueue.poll());
        else {
            System.out.print(arrBQueue.poll());
        }
        
        while(!arrAQueue.isEmpty()||!arrBQueue.isEmpty()) {
            i++;
            if(i%2==0) {
                if(!arrAQueue.isEmpty())
                    System.out.print(" "+arrAQueue.poll());
            }else {
                if(!arrAQueue.isEmpty())
                    System.out.print(" "+arrAQueue.poll());
                if(!arrBQueue.isEmpty())
                    System.out.print(" "+arrBQueue.poll());
                
            }
        }

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

題集jmu-Java-05-集合之5-2 統計文字中的單詞數量並按單詞的字母順序排序後輸出 (做業中不要出現大段代碼)

5.1 實驗總結

答:該題主要使用TreeSet集合存放不重複的單詞,並利用TreeSet完成按字母順序排序。

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

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

6.1 僞代碼

答:

  • 一、創建Map<String,Integer> words=new HashMap<>();
  • 二、循環將單詞做爲鍵對象,次數做爲值對象存入words集合中;
  • 三、創建List存入Map.Entry對象。
  • 四、從新定義Collections.sort中的compare方法。
  • 五、輸出List

    6.2 實驗總結

    答:該題難點是如何實現單詞次數按照降序排序,若是次數相同,則按照鍵值的字母升序排序。先將Map集合中每個對象存入List,再從新定義compare方法。

    3.碼雲及PTA

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

3.1. 碼雲代碼提交記錄

在碼雲的項目中,依次選擇「統計-Commits歷史-設置時間段」, 而後搜索並截圖

3.2 截圖PTA題集完成狀況圖

須要有兩張圖(1. 排名圖。2.PTA提交列表圖)

3.3 統計本週完成的代碼量

須要將每週的代碼統計狀況融合到一張表中。

周次 總代碼量 新增代碼量 總文件數 新增文件數
1 0 0 0 0
2 0 0 0 0
3 0 0 0 0
4 0 0 0 0
5 739 739 16 16
6 1084 345 28 12
7 1180 96 30 2
8 1627 447 35 5
9 1986 359 44 9
相關文章
相關標籤/搜索