---------------------------------------------------------
---------------------------------------------------------
(五)Java基本資料型別:
Java資料型別分為基本資料型態(Primitive Type)和參考資料型態(Reference Type)兩種。我們先看變數在記憶體中是如何被儲存的。
一般記憶體中(RAM, Random-Access Memory)有Global、Stack與Heap三個儲存空間,我們來看要如何在記憶體中儲存Java的變數資料,如下說明:
l Global-儲存媒體:存放著被宣告為static的類別成員變數。在這空間內存放的類別成員變數將是屬於這個類別的,也是Java程式在執行期間一直被維護的資料,不會因為存取它的物件更動(另外建立出一個新物件)而配置一個新的static成員變數供該物件存取。
l Stack-儲存媒體:存放Java中宣告為基本資料型態的變數內容或物件變數的參考內容值(object reference variable)的地方。當新的宣告產生時,stack將有指標直接指向該變數,所以存取該變數資料內容時速度較快。也就是說,在stack中是利用指標的來回移動指向該變數,以幫助程式能快速存取該變數的內容值。
l Heap-儲存媒體:存放被宣告為參考資料型態的物件實體,但該物件的參考內容值(object reference variable)是存放在stack中。當你宣告了一個參考資料型別(Reference Type)物件並用new這個關鍵字產生此物件實體,物件參考值將會存在記憶體的stack中,新建立(new)的物件實體則在記憶體中的heap中配置一塊新區域存放,同時在stack中的物件參考值也將會指向heap中的物件實體。一般來說,在heap中儲存的資料沒有一定限制,但盲目與不當使用容易造成記憶體空間與存取時間的浪費。
1.記憶體中的存放位置:宣告基本資料型態是在記憶體stack中直接存放變數內容。int I =100,記憶體中stack直接存100。
2.基本資料型別分類:
資料類別
|
資料型態
|
位元組數(bytes)
|
位元數(bits)
|
資料範圍
|
初始值
|
字元
|
char
|
2
|
16
|
0~65535
| |
整數
|
byte
|
1
|
8
|
-128-127
|
0
|
short
|
2
|
16
|
-32768~32767
|
0
| |
int
|
4
|
32
|
-2(31次方)~2(31次方)-1
|
0
| |
long
|
8
|
64
|
0L
| ||
浮點數
|
float
|
4
|
32
|
-3.4E+38~3.4E+38
|
0.0F
|
double
|
8
|
64
|
-1.7E+308~1.7E+308
|
0.0D
| |
布林值
|
boolean
|
1
|
8
|
true false
|
false
|
類別變數與物件變數若宣告為基本資料型態,系統會給定初始值,區域變數則不會給定初始值。整數的預設資料型態是int,浮點數預設的資料型態是double。
3.字元:Java編碼方式為Unicode(可參考電腦編碼系統),char型態可以存放單一字元變數,存的資料是以單引號表示。
char c1 = ‘A’;
char c2 = ‘中’; 可以放中文字
char c5 = 65; 指的是ASCII(65) à A
char myArray[]; 字元陣列宣告
char n =’\0’; 宣告一個空字元
char的單一個別圈住符號是用‘ ‘單引號,而String字串圈住符號則是用” ”雙引號。
4.整數:可分為byte、short、int與long。
byte b1 = ‘A’ //b1=65,因為A字元所以系統將自動指派65
byte b2 = 255; //Compile error 超過byte資料範圍。
5.基本資料型別的資料轉換:
int i = 1; //合法,整數的hard-coded預設是int資料型別。
double d; //合法,浮點數的hard-coded預設是double資料型別。
d = i; //將i變數內容指派給d,合法
i = d; //不合法,程式需要做Explicit Casting(強行轉換),系統不自動轉換。
i = (int)d; //將d變數的內容值經過手動EC後指派給i,合法。
float f; //合法。
f = 2.5; //不合法,hard-coded預設是double。
f = (float)2.5; //經過手動EC後指派給f,合法。
f = 2.5f; //透過F或f特定轉型字元直接轉型成float,合法。
(六)Java參考資料型別:在Java語言中基本資料型態以外的資料型別都是參考資料型別(reference type)。
1.記憶體中的存放位置:參考資料型別的實體會以物件的方式儲存在heap中,而stack裡面存放的是該物件的參照位置(如0xabcd),並且被該物件變數所指向(參照)。
2.一維陣列與字串:
l 陣列指的是一連串資料或物件,在Java語言中同一個陣列只能存放相同資料型態的資料。
l 不論是基本資料型態或類別型態的資料,皆可宣告成陣列。
l 在陣列中 [ ] 代表的是索引運算子(indexing operator),用來指向陣列物件中每個元素的位置,或者是物件陣列宣告的長度。
System.out.println(args[0]); //代表螢幕上列印出args陣列中第一個元素內容值。
int[ ] i = new int[10]; //代表宣告一個int陣列其長度為10,維度是從[0~9]。
(1)基本資料型態陣列宣告:
int i [ ];
int [ ] i;
int [ ]i;
(2)類別型態陣列宣告:
String s[ ];
String [ ] s;
String [ ]s;
[ ]不可放於資料型態的右邊:[ ] String s;à這是錯誤的。
宣告陣列時,可利用new這關鍵字來產生陣列實體,例如,int [] i = new int[5]。new運算子會傳回一個參考,用來指向物件變數的實體,並為該物件在記憶體中配置一個實體的空間。
陣列初始值為0。
(3)一維陣列直接給定預設內容值的宣告方式:
int [] i = new int[] {1, 2, 3, 4, 5};
int [] j = {1, 2, 3, 4, 5};
int [] k = new int[5] {1, 2, 3, 4, 5}; //不合法的陣列初始值宣告。
Object o = new int[10]; //可以將陣列宣告成Object型態。
(4)Java中的String字串基本上就是char陣列。
String:
l 是一個類別。
l 使用雙引號””。
l 內容值是不可變。
char c1 = ‘A’;
char c2 = ‘A; //àc1 == c2時會回傳true。
String s1 = new String(“Java”);
String s2 = new String(“Java”); //às1 == s2 回傳值為false。
因為各自會在heap中擷取一塊記憶體空間來存放字串內容,因為是各自擷取,所以該變數在stack內容也會不同。
l 如何比較字串實際內容值:可以寫成s1.equals(s2);,字串實際內容比對,true。
l 為提升String的使用效率,在heap中為String物件建造一個虛擬的String pool來存放String。
String s3 = “JAVA”;
String s4 = “JAVA”; //às3 == s4 會回傳 true。字串物件是共用的。
l 字串內容是不可變的:當字串已在記憶體中被建立出來,該記憶體中的字串內容就不被允許被變更。
String s = “Java”;
s = s+”SCJP”;
System.out.print(s); //à仍會印出JavaSCJP,但在記憶體中另開一塊新空間存放新字串。
l 陣列的長度與字串長度:
(a)
int [] i = new int[10];
int len = i.length; //len = 10
(b)
String s = “PCSCHOOL”;
int len = s.length(); //len = 8;
(5)多維陣列:在Java中多維陣列,就是陣列中的陣列。因此在多維陣列中,每一個維度(陣列大小)可以不相同。可分為對稱陣列與非對稱陣列。
a.對稱型陣列(Rectangular):
//這是一個3X3的二維陣列
int mInt [][] = new int[3][3];
int [] mInt[] = new int[3][3];
int [][]mInt = new int[3][3];
//這是一個2X3
int mInt[][] = new [2][3]; //àmInt[0][0].[0][1].[0][2]、mInt[1][0].[1][1].[1][2];
//這是一個2X3X5三維陣列
int mInt [] [] [] = new [2][3][5];
b.非對稱型陣列(Non-Rectangular):
int m [] [] = new int [2][]; //àm[0]、m[1]
m[0] = new int[3]; //àm[0][0]、m[0][1]、m[0][2]
m[1] = new int[1]; //àm[1][0]
c.多維陣列的初始化內容宣告:
int mutiInt[ ][ ] = { {1, 2}, {1, 2, 3} };
d.陣列的宣告式從左至右方式來初始陣列大小:
int [] [] m1 = new int [2][]; //合法
int [] [] m2 = new int [][3]; //不合法
留言
張貼留言