第2周作業-Java基本語法與類庫
1. 本周學習總結
-
1.學會使用碼雲管理代碼;
-
2.學會使用Eclipse關聯jdk源代碼,並查看對象的源代碼;
-
3.學會String類和StringBuilder類的一些用法,以及二者區別和優缺點;
-
4.學會Array類與ArrayList類的一些用法;
-
5.學會在Main類里調用函數;
-
6.學會如何用字符串池去解釋字符串相等的問題;
2. 書面作業
1.使用Eclipse關聯jdk源代碼(截圖),並查看String對象的源代碼?簡單分析String對象的設計思路。
answer:
之前一直沒有查看成功,顯示class not found,原因是之前在rt.jar和resources.jar兩個包選擇錯誤,經過排查,解決了這個問題。
2.為什么要盡量頻繁的對字符串的修改操作應該是用StringBuilder而不是String?
answer:
String類每次修改字符串都需要新建一個字符串,再對舊字符串進行刪除,很影響效率;
StringBuilder是在進行字符串的末尾進行操作; 因此在小數據量時候二者沒有太大的影響,但是在大數據量的時候,后者會比前者快很多。
3.比較兩個字符串的值是否相等?為什么不能用==直接進行比較?
answer:
因為“==”只能比較兩個變量的值,在比較字符串的時候使用“==”,實際上是在比較兩個字符串是否引用同一個地址,如果兩個字符串是同一對象的話,則可以用“==”。否則,只能使用別的方法,如下圖:
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2); // true,因為s1和s2是同一個字符串常量abc的引用,是同一個對象地址,所以相同
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2); // false,因為s1和s2是兩個不同的對象,雖然字符串值都是abc,但是用==比較不相同。
解決辦法:
使用equals();
4.嘗試使用字符串池的概念解釋如下程序段輸出結果,並回答這段代碼創建了幾個字符串對象:
String str1 =“hi”, str2=“hi”;
String str3 = new String(str1)
System.out.println(str1==str2);
answer:
輸出結果為true。(正如上題所言)
當遇到String str1 =“hi”;這樣的語句時,Java會先在字符串池中尋找是否已經存在"hi"這個字符串,如果沒有,則建立字符串"hi"對象,然后變量str1指向這個地址;
然后遇到語句String str2 = "hi",這時字符串池中已經有 "hi"了,所以直接讓變量str2也指向這個地址,省去了重新分配的麻煩。
而String str3 = new String(str1)則不會去訪問字符串池,而是先為變量 str3 開辟空間,然后將值寫入空間。
因此,這段代碼共創建了兩個字符串對象。
5.Integer i = 100;//100是基本類型,i是引用類型,為什么可以將100賦值給i
answer:
這個叫做對象的自動封箱與拆箱,實際調用 Integer i=new Integer(100);在調用的時候會自動拆箱,拆箱之后就自動轉換成了簡單數據類型,數值一樣。
6.嘗試分析下面代碼輸出結果
Integer i1 = 127;Integer i2 = 127;
i1 == i2;//true of false?
Integer i1 = 128;Integer i2 = 128;
i1 == i2;//true of false
answer:
true,JVM會自動維護八種基本類型的常量池,int常量池中初始化-128~127的范圍,所以當為Integer i1=12=127時,在自動裝箱過程中是取自常量池中的數值,所以返回true。
false,當Integer i=128時,128不在常量池范圍內,所以在自動裝箱過程中需new 128,所以此時i1與i2地址不一樣,所以返回false。
7.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 嘗試用命令行進行編譯並運行,截圖
answer:
編寫Main.java,調用com.ibm.StringUtil的foo1方法並運行,結果如圖。
7.2 將生成的StringUtil.class放到d盤的lib目錄下,將Main.class在d:\test目錄下,嘗試命令行下運行,截圖。
answer:
將StringUtil.class放到d盤的lib\com\ibm目錄,Main.class在d:\test\edu\jmu目錄下,執行發生錯誤。
7.3 Eclipse中源代碼放在哪個目錄、class文件放在哪個目錄。在Eclipse項目中按一下ctrl+f11就可以直接運行Main,嘗試分析背后實現的原理。
answer:
源代碼應當放在src目錄,class放在bin目錄。
8.自己在這門課的目標與計划
8.1請描述一下你的技術基礎(會什么語言,都寫了多少行代碼)
answer:
- c語言和c++,基礎不是很扎實,由於大一有課設,大二鄭老師比較嚴,所以幾千行的代碼應該是有的。
- java,剛入門,現在所寫的代碼也只有PTA上實驗1的代碼和實驗2的部分代碼
8.2一周准備花多少時間在這門課上?一周准備寫多少行代碼?采用怎樣的學習方式?遇到困難打算怎樣解決?
answer:
- 學習的時間幾乎百分之八十都放在了java上每周差不多10~16個小時左右;
- 一周的目標就是完成所有老師布置的書面作業和PTA上的所與編程題;
- 查資料,聽課,編程,百度等等……
- 問李嘉廉
8.3關於這門課的smart目標參考鏈接
answer:
能熟練掌握java並完成一個項目。