Java Class 7
Java Class 7
常用類別
本堂教學重點
1. String 類別 2. StringBuffer/StringBuilder
1-1. String 建構 2-1. 常用方法
1-2. String 比較
1-3. String 常用方法
3. 包裹類別
3-1. 包裹類別物件建構
1-4. String 不可變更
3-2. 常用方法
1-5. String 切割
1-6. String 簡易格式化
4. ArrayList
4-1. ArrayList
4-2.自動裝箱、拆箱
2
String v.s. char
4
2 分鐘
下列程式片段執行結果為何?
char c1='A', c2='A';
String s1=new String("Hello");
String s2=new String("Hello");
[Link](c1==c2);
[Link](s1==s2);
a) true true
b) true false
c) 編譯錯誤
d) 發生執行錯誤
5
比較運算 ==
◆ "=="
比較在 stack 中的變數內容是否相等
⚫ 基本資料型別 : 變數內容即為其值
⚫ 參考資料型別 : 物件是不是同一個
char c1 = ‘A’;
char c2 = ‘A’;
Java
c1 == c2 ? true !
0x1234 0x1234
s2
Java
0x1234 0x1234
s2
s1 0xabcd Java
0xabcd
7
字串池 String Literal Pool
◆ JVM 中存放字串的共用區域
以非標準物件建構語法方式宣告的字串物件儲存到字串池中
建立物件前檢查是否已有相同的物件
⚫ 如果有的話直接傳回參考值,不會新增字串物件
String s3 = “Java”;
String s4 = “Java”;
下列程式片段執行結果為何?
a) str所參考的字串物件的內容為java programm
b) str所參考的字串物件的內容為javaprogram
c) str所參考的字串物件的內容為javaprogramm
d) str所參考的字串物件的內容為java programming
12
2 分鐘
下列程式片段執行結果為何?
String str = "Hello";
[Link]("World");
[Link](str);
a) HelloWorld
b) Hello
c) World
d) 編譯錯誤
e) 發生執行錯誤
13
字串內容不可變更!?
◆ 字串內容是不可變更的 (immutable)
當字串已在記憶體中被建立出來,該記憶體中的字串內容就不允許被變更。
String s = “Java”;
s = [Link](“SCJP”); 0x1234
[Link](s); ➔ JavaSCJP JavaSCJP
0xabcd
s 0x1234
0xabcd
Java
日期 說明 時間 說明 日期/時間 說明
%td 日,共2位,不足部分補0 %tH 時(24時制),共2位,不足部分補0 %tF 相當於「%tY-%tm-%td」
%tm 月,共2位,不足部分補0 %tI 時(12時制),共2位,不足部分補0 %tT 相當於「%tH:%tM:%tS」
%ty 年,共2位,不足部分補0 %tM 分,共2位,不足部分補0
%tY 年,共4位,不足部分補0 %tS 秒,共2位,不足部分補0
printf( ) & format( ) 範例
01 public class ExPrintf{
02 public static void main(String[] args) {
03 String name = args[0];
04 int id = [Link](args[1]);
05 double salary = [Link](args[2]);
06 [Link](“姓名: %S%n員工編號:
String s = [Link]("姓名: %S%n員工編號: %05d%n薪水:%,9.2f元%n",
%05d%n薪水: %,9.2f元%n",
07 name, id, salary);
name, id, salary);
08 [Link](s);
09 }
10 }
printf( ) & format( ) 範例
01 public class ExTime{
02 public static void main(String[] args) {
03 [Link] date = new [Link]();
04 [Link]("今天日期: %tF%n現在時間: %<tT%n", date);
05 }
06 }
5 分鐘
練習 : String
操作重點
1. 撰寫一個 [Link] 類別,檢查使用者輸入的字串是否為迴文
• 某字串由前面讀取與從後面讀取結果相同稱為迴文 (Palindrome)
• 忽略大小差異:將字串先轉為小寫
• 檢視字串第一個與最後一個字元,第二個與倒數第二字元,…是否相同
• 字串有奇數個字元時,最中間的字元不比對
• 使用 printf( ) 顯示結果
21
本堂教學重點
1. String 類別 2. StringBuffer/StringBuilder
1-1. String 建構 2-1. 常用方法
1-2. String 比較
1-3. String 常用方法
3. 包裹類別
3-1. 包裹類別物件建構
1-4. String 不可變更
3-2. 常用方法
1-5. String 切割
1-6. String 簡易格式化
4. ArrayList
4-1. ArrayList
4-2.自動裝箱、拆箱
22
StringBuffer / StringBuilder 類別
◆可變動內容 (Mutable) 的字串型態
StringBuffer
capacity( )
⚫ thread safe
StringBuilder H e l l o W o r l d
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
⚫ not thread safe
length( )
⚫ Java 5.0 新增
提供進階處理字串的方法
緩衝區不足時,會自動加大緩衝區
StringBuffer / StringBuilder 類別
◆常用處理字串的方法
利用 append( ) 來改變字串內容
StringBuffer sb = new StringBuffer("Hi"); sb
Hi Java !
0xabcd
[Link](" Java!");
[Link]([Link]( ));
利用 insert( ) 方法來選擇指定加入的位置
StringBuffer sb = new StringBuffer(“This is a dog");
[Link](10, "big ");
[Link]([Link]( ));
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
T h i s i s a b
d oi g d o g
StringBuffer / StringBuilder 常用方法
方法名稱 傳回值 說明
append(String str) StringBuilder 將指定的字串加到此 StringBuilder 之後
append(StringBuilder sb) StringBuilder 將指定的 StringBuilder 加到此 StringBuilder 之後
length( ) int 傳回此 StringBuilder 的字元個數
capacity( ) int 傳回此 StringBuilder 的容量
ensureCapacity(int minimumCapacity) void 確保 StringBuilder 容量至少等於指定的最小值
charAt(int index) char 傳回此 StringBuilder 中,指定位置的字元值
indexOf(String str) int 傳回此 StringBuilder 中,首次出現指定子字串的位置
lastIndexOf(String str) int 傳回此 StringBuilder 中,最後出現指定子字串的位置
insert(int offset, String str) StringBuilder 在 StringBuilder 指定位置之後插入指定字串
delete(int start, int end) StringBuilder 將 StringBuilder 中,start 到 end 位置中的字元移除
replace(int start, int end, String str) StringBuilder 將 StringBuilder 中,start 到 end 位置中的內容以指定字串取代
reverse( ) StringBuilder 將 StringBuilder 字元順序顛倒
toString( ) String 將 StringBuilder 變為一個內容不可變更的新字串傳回
substring(int start, int end) String 將 StringBuilder 中指定位置變為一內容不可變更的新字串傳回
2 分鐘
下列程式片段執行結果為何?
StringBuilder sb1=new StringBuilder("Hello");
StringBuilder sb2=new StringBuilder("Hello");
[Link]([Link](sb2));
a) true
b) false
c) 編譯錯誤
d) 發生執行錯誤
26
StringBuffer 範例
01 public class TestStringBuffer {
02 public static void main(String[] args) {
03 StringBuffer sb1 = new StringBuffer("Hi");
04 [Link](" Java!");
05 [Link]([Link]( ));
06
07 StringBuilder sb2 = new StringBuilder("This is a dog");
08 [Link](10, "big ");
09 [Link]([Link]( ));
10
11 StringBuffer sb3 = new StringBuffer("Hi Java!");
12 [Link]([Link](sb3));
13 }
14 }
StringBuilder 範例
01 public class Sum1to10 {
02 public static void main(String[] args) {
03 String op = "1";
04 int sum1 = 1;
05 for (int i=2; i<=10; i++){
06 op += "+"+i;
07 sum1 += i;
08 }
09 [Link](op + " = " + sum1);
10
11 var sb = new StringBuilder("1");
12 var sum2 = 1;
13 for (int j=2; j<=10; j++){
14 [Link]("+"+j);
15 sum2 += j;
16 }
17 [Link]([Link](" = ").append(sum1));
18 }
19 }
5 分鐘
練習 : StringBuffer / StringBuilder
操作重點
1. 撰寫 [Link] 類別
• 包含兩個 StringBuilder 屬性 name 及 phoneNumber
• 建構子:傳入name與phoneNumber
• modifyData(String lastname) 方法
✓ 以 append( ) 方法將名字 name 後面加上空白及姓氏
✓ 用 insert( ) 方法將電話號碼 phoneNumber 中適當位置加入 "-"
• displayPersonInfo( ) 方法屬性資訊如右
2. 撰寫 [Link] 類別
• 建立姓名 (Fernando) ,電話 (0223826015) 的 Person物件
• 呼叫 modifyData( ) 修改姓氏屬性資訊 (Gonzalezz)
• 呼叫 displayPersonInfo( ) 顯示屬性資訊
29
本堂教學重點
1. String 類別 2. StringBuffer/StringBuilder
1-1. String 建構 2-1. 常用方法
1-2. String 比較
1-3. String 常用方法
3. 包裹類別
3-1. 包裹類別物件建構
1-4. String 不可變更
3-2. 常用方法
1-5. String 切割
1-6. String 簡易格式化
4. ArrayList
4-1. ArrayList
4-2.自動裝箱、拆箱
30
包裹類別 Wrapper Class
◆ 基本資料型別 (primitive type) 有一個對應包裹類別 (Wrapper Class)
將基本型態資料包裹成物件,以物件方式操作
⚫ 物件包含更多資訊及操作 基本資料型別 包裹類別
父類別
Primitive type Wrapper Class
⚫ 集合架構只接受物件型態 boolean Boolean
Object
char Character
裝箱 boxing
byte Byte
⚫ 基本型別轉成包裹物件 short Short
int Integer
拆箱 unboxing Number
long Long
⚫ 包裹物件中取出基本型別資料 float Float
double Double
包裹類別物件建構
◆ 包裹類別物件建構
Java 9 之後標示為過時(depreated)
使用類別方法 [Link](…)
32
2 分鐘
下列程式片段執行結果為何?
Integer i1=[Link](20);
Integer i2=[Link](20);
[Link](i1==i2);
a) true
b) false
c) 編譯錯誤
d) 發生執行錯誤
33
Integer 物件建構及常用方法
◆ 建構 Integer 物件
Integer i1 = new Integer(20);
Integer i2 = new Integer("20");
i4 0x5678
Integer i3 = [Link](20); 20 0x5678
i3 0x5678
Integer i4 = [Link]("20"); 0x1234
i2 20
0xabcd
0xabcd
Integer Cache 整數快取
i1 20 0x1234
包裹類別物件是不可變更的 (immutable)
⚫ 物件建立後,其包裝的數值就不可改變
Integer 內容值比較
01 public class TestInteger {
02 public static void main(String[] args) {
03 Integer i1 = new Integer(20);
04 Integer i2 = new Integer("20");
05 Integer i3 = [Link](20);
06 Integer i4 = [Link]("20");
07 [Link](i1 == i2); ➔ false
08 [Link](i3 == i4); ➔ true // Integer Cache
09 [Link]([Link](i2));
10 [Link]([Link](i4)); ➔ true // 比較實際內容
11 }
12 }
01 public class TestInteger {
02 public static void main(String[] args) {
03 Integer i1 = new Integer(200);
04 Integer i2 = new Integer("200");
05 Integer i3 = [Link](200);
06 Integer i4 = [Link]("200");
07 [Link](i1 == i2); ➔ false
08 [Link](i3 == i4); ➔ false // 超過Integer Cache範圍
09 [Link]([Link](i2)); ➔ true // 比較實際內容
10 [Link]([Link](i4));
11 }
12 }
Integer 類別物件常用方法
◆ 常用方法
方法名稱 傳回值 說明
equals(Object obj) boolean 比較此 Integer 物件與傳入物件內容是否相等
intValue( ) int 以 int 型別傳回 Integer 物件的值
byteValue( ) byte 以 byte 型別傳回 Integer 物件的值
longValue( ) long 以 long 型別傳回 Integer 物件的值
◆ 工具方法
Ex:將表示基本型別的字串轉為基本型別
方法名稱 傳回值 說明
parseInt(String s) int 將表示 int 的字串轉換成 int 型別
getInteger(String nm) Integer 取得指定名稱對應的整數型態系統屬性值
哪個命令可將“123456”;轉換為int ?
38
本堂教學重點
1. String 類別 2. StringBuffer/StringBuilder
1-1. String 建構 2-1. 常用方法
1-2. String 比較
1-3. String 常用方法 3. 包裹類別
1-4. String 不可變更 3-1. 包裹類別物件建構
1-5. String 切割 3-2. 常用方法
1-6. String 簡易格式化
4. ArrayList
4-1. ArrayList
4-2.自動裝箱、拆箱
39
[Link]類別
◆ [Link] 類別
Java提供之類別函式庫
陣列 array [Link] 集合
容量大小 需預先給定 可動態增加集合元素,不需事先指定
無法於執行時期動態增加元素
資料型別 陣列內只能置入同型別資料 集合内可置入不同型別的資料
內容 可置入基本資料型別或物件 只能置入物件
基本型別需用包裝器類別
元素處理 基本讀取 提供進階的方法處理集合內元素
ArrayList常用方法
方法名稱 傳回值 說明
add(Object o) boolean 從 ArrayList 的末端(end of this list)加入指定物件 element。
add(int index, Object element) void 沒有傳回值。將指定物件 element 加到 ArrayList 所指定的索引(index)位置,
並傳回此集合物件。
set(int index, Object element) Object 將 ArrayList 中指定索引位置的元素以指定物件 element 取代
addAll(Collection c) boolean 從 ArrayList 的末端(end of this list)加入集合 c
size() int 傳回此集合所有元素個數。
isEmpty() boolean 判斷此集合是否為空。若此集合是空的,將傳回true;反之則會傳回false。
contains(Object o) boolean 用以判斷指定物件o是否屬於該集合物件的成員之一,屬於傳回true,不屬於則傳回
false。
indexOf(Object o) int 回傳指定物件 o 在 ArrayList 上的索引位置。傳回值若為 -1 表示 ArrayList 集
合物件元素中並沒有包含指定物件 o。
get(int index) Object 取得 ArrayList 中指定索引位置的元素
equals(Object o) boolean 比較ArrayList物件與指定的物件o內容是否相同,指定物件o需亦為ArrayList集合,
且各元素內容均相同時傳回true。
clear() void 清除集合中的所有元素
remove(int index) Object 移除 List 中指定索引位置的元素,並傳回被移除的元素。
toString() String 將ArrayList集合中各元素以字串表示
ArrayList 範例
01 public class ArrayListExample {
02 public static void main(String[] args) {
03 [Link] myList;
宣告及建立 ArrayList 集合
04 myList = new [Link]();
05
06 [Link]("One"); 利用 add() 將元素資料加到 ArrayList 集合中
07
[Link]("Second");
08
[Link]("3rd");
09
[Link](new Integer(4));
10
[Link](new Float(5.0));
11
12
13 //列印ArrayList,利用toString()方法 ArrayList 的 toString()
14 [Link]([Link]());
15
16 //移除元素 利用 remove() 將指定元素由 ArrayList 中移除
17 [Link](0);
18 [Link]([Link]()-1);
19 [Link]("3rd");
20 [Link](myList);
21 }
22 }
裝箱、拆箱
◆ 基本型別與包覆類別 wrapper class 轉換
Java SE 5 之前資料型態不一樣,不可混用
Integer i1 = 10;
int i2= new Integer(10);
裝箱 boxing:基本型別轉成包裹物件 int i4 10
10
Integer i3 0x1234
⚫ 將int包裝為Integer物件 int i2 0x1234
拆箱 unboxing :包裹物件中取出基本型別資料
⚫ 將Integer物件的int值取出
int i4= [Link]( );
自動裝箱、自動拆箱
◆ J2SE 5.0 提供自動裝箱 (Auto-boxing) 及自動拆箱 (Auto-unboxing)
功能
自動裝箱 : 自動拆箱 :
Integer i = 10;
[Link](i + 10); 自動拆箱再運算
[Link](i++);
自動拆箱再運算
自動拆箱再運算
5 分鐘
練習 : 類別進階操作
操作重點
1. 撰寫 [Link]:
• 驗證 main( ) 傳入參數,沒有傳入參數或參數值為 “ help” 字串,列印使用方法訊息如下:
程式用法: java GuessingGame [傳入參數]
傳入參數為 1-5 間的整數
• 傳入參數值轉換為整數儲存於 int guessing
• [Link]( )*5+1產生 1-5 之間整數為答案 answer
• 若傳入參數 >5 或 <1,在螢幕上列印錯誤訊息如下:
傳入參數錯誤,請輸入 1-5 間的整數
• 若傳入參數在 1-5 之間,比對 guessing 與 answer
✓ 若兩者不同列印 "很抱歉,答案是"+answer
✓ 若兩者相同列印 "恭喜你,猜對了!"
46