201521123077 《Java程序設計》第2周學習總結

1. 本週學習總結

  • 動態數組
  • 標識控制符的意義
  • ArrayList ,BigDecimal,BigInteger 等類的使用
  • 組合,繼承,多態等概念的瞭解

2. 書面做業

Q1.使用Eclipse關聯jdk源代碼,並查看String對象的源代碼?分析String使用什麼來存儲字符串的?分析其構造函數public String(char value[])的實現原理?分析public String replace(char oldChar, char newChar)的實現原理,回答String的不可變性在該函數中如何體現?(重點)

部分String源代碼
replace
儲存數組
構造器(char[])
使用private final char value[];使用字符數組來保存數據
使用Arrays.copyOf(value, value.length);函數參數爲(地址,目標大小),能夠把指定數組變化成指定大小java

public String replace(char oldChar, char newChar) {
if (oldChar != newChar) {
    int len = value.length;
    int i = -1;
    char[] val = value;  /*創建一個新字符用來保存String原來的各位元素*/
   
    while (++i < len) { /*遍歷數組找到第一次出現oldchar的位置:i*/
        if (val[i] == oldChar) {
            break;
        }
    }
    if (i < len) {
        char buf[] = new char[len];/*新建一個用於保存替換後結果的字符數組buf*/
        for (int j = 0; j < i; j++) {
            buf[j] = val[j];/*將i位置前的字符全都複製進新數組buf*/
        }
        while (i < len) {
            char c = val[i];/*循環將i位置後的字符複製進buf*/
            buf[i] = (c == oldChar) ? newChar : c;/*若是遇到oldchar就向buf中添加newchar*/
            i++;
        }
        return new String(buf, true);
    }
}
return this;
}
遍歷String類對象內部實現的字符數組,而後用一個新的字符數組保存替換後的結果,並調用String的構造方法而return 一個新串  
其實並非在原來的String上替換字符,是返回了一個替換了字符的新String,原來的String並無變 ,只是被咱們拋棄了  (見註釋)

Q2.爲何要儘可能頻繁的對字符串的修改操做應該是用StringBuilder而不是String?

String具備不變性而StringBuilder可變,若是用String的話每次拼接都會產生新String程序開銷很大

Q3.比較兩個字符串的值是否相等?爲何不能用==直接進行比較?

==比較的是是否爲同一個引用    
.equals()方法能夠用來比較值

Q4.嘗試使用字符串池的概念解釋以下程序段輸出結果,並回答這段代碼建立了幾個字符串對象:

String str1 =「hi「, str2=「hi「;  
String str3 = new String(str1)  
System.out.println(str1==str2);

truec++

對於String類,以相同的字符串創建的String引用是同一個,由於String對象是惟一的算法

Q5.Integer i = 100;//100是基本類型,i是引用類型,爲何能夠將100賦值給i

由於100是int類型,而int類型正式由Integer類包裝而來

Q6.嘗試分析下面代碼輸出結果

Integer i1 = 127;Integer i2 = 127;
i1 == i2;//true of false?
Integer i1 = 128;Integer i2 = 128;
i1 == i2;//true of false

分析
Integer類具備靜態緩存,存儲 256 個特殊Integer對象,即128 到 127 之間的每一個值。
此時該語句就至關於
int i1=127;int i2=127;if(i1==i2)
而在這個範圍以外的值,Integer在該語句就表現爲一個正常的類了,故==比較的是引用,因此返回False小程序

Q7.package與javac、 java、 -classpath、 -d

在 ```com.ibm```包中編寫 StringUtil類,內有一方法  
    public static void foo1(){
     System.out.println(StringUtil.class+" method:foo1");
    }
在```edu.jmu```包中編寫Main類,其中掉了com.ibm.StringUtil的foo1方法

7.1 嘗試用命令行進行編譯並運行,截圖
目錄爲:D:\TestJavaTemp
命令行進行編譯api

javac -d . StringUtil.java           //先編譯StringUtil類
javac -d . Main.java                 //再編譯Main類
java -cp . edu.jmu.Main              //在文件目錄下運行Main類

7.2 將生成的StringUtil.class放到d:\lib下正確的目錄結構下,將Main.class放到d:\test下正確的目錄結構,嘗試在命令行下運行,並截圖。
目錄結構下運行數組

javac -d D:\lib StringUtil.java        //將生成的StringUtil.class放到d盤的lib目錄下
javac -cp D:\lib -d D:\test.Main.java  //將Main.class在d:\test目錄下
java -cp .;D:\test edu.jmu.Main        //在d:\test目錄下運行Main類

7.3 Eclipse中源代碼放在哪一個目錄、class文件放在哪一個目錄?在Eclipse項目中按一下Ctrl+F11就能夠直接運行Main,當按下Ctrl+F11時,到底在哪一個目錄下執行了什麼樣的java命令?緩存

在創建Project的時候選擇的目錄下的src目錄會有源代碼,bin目錄下是class文件
運行的是.class文件

Q8.本身在這門課的目標與計劃

技術基礎
大一學過C語言的基礎,大二上和寒假粗略地學了c++描述的數據結構。大一剛開始學習c語言的時候因爲興趣寫了一些c語言+win32api的控制檯小遊戲,每一個長度大概爲300到800,加上不少奇怪的腦洞都用c寫過,c代碼量應該有數千吧。 大一暑假學了一點java當時也利用swing也作了個小遊戲
JAVA:
如今一週大概有34天的晚上都在作PTA,一週大概會寫PTA上一章的代碼量和本身課後學習的一點測試代碼。學習方式主要爲自學,遇到困難先分析原理,並藉助谷歌引擎,stackoverflow網站等學習
關於這門課的目標 :
熟練掌握基本語法,學習完以後能對OOP有更深入的理解,可以運用學到的知識製做出較爲完備的小程序,並進而學習javaee數據結構

3. PTA實驗總結及碼雲上代碼提交記錄

3.1本週Commit歷史截圖

第二週PTA截圖

3.2 實驗總結

問題: 3-身份證排序這題本身寫了自定義類Id的快速排序算法致使程序代碼很長
思考: 應該使用更爲簡潔的implements Comparable類就可使用自帶的sort函數了eclipse

問題: 4-動態數組和8-ArrayList入門屢次沒法經過
思考:應該是格式錯誤
解決方法:補充了多出空格後經過函數

問題:在 06-枚舉 這題時printGradeInfoGrade.class一直返回class name=class main@Grade
解決方法:把枚舉類型放在類外

相關文章
相關標籤/搜索