跳到主要內容

Java-Java 語言基礎(2)


Java語言基礎-2



---------------------------------------------------------


---------------------------------------------------------



Java資料型別分為基本資料型態(Primitive Type)參考資料型態(Reference Type)兩種。我們先看變數在記憶體中是如何被儲存的。

一般記憶體中(RAM, Random-Access Memory)GlobalStackHeap三個儲存空間,我們來看要如何在記憶體中儲存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.整數:可分為byteshortintlong
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;                //透過Ff特定轉型字元直接轉型成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]; //不合法

留言

這個網誌中的熱門文章

107年高考資訊處理上榜心得(自修)

107 年高考資訊處理上榜心得 ( 自修 ) ------------------------------------------------------------------------- l    背景及報考動機 l    個人成績 l    準備經驗及時程規劃 l    各科準備方式 l    Q&A ------------------------------------------------------------------------- l    背景及報考動機: 小弟很幸運地今年考上高考資訊處理 ( 正取尾巴錄取 ) ,剛好這兩年開缺很多,今年總共錄取 117 人,正取 92 ,增額 25 人。因為自己也在網路上參考很多心得文章,所以想分享自己這次考上的心得。 先說一下自己考公職的歷程,所有的考試,都未曾補習過,小弟比較喜歡自己讀。考完公職才發現從小到大的考試根本無法比。準備資訊處理的考試前前後後時間加起來算是一年左右吧。 101/06              大學畢業 ( 資訊傳播工程學系 ) 102/09              考取特考交通行政 ( 參考: 交通行政上榜心得 ) 104/07              差 0.5 分考上高考交通行政 105/01              考取桃園捷運有限公司 106/03-12        邊工作 ( 桃捷 ) 邊念 106/07              差 6 分考上高考資訊處理 107/01            離職當全職考生 小弟並非第一次參與國家考試了,只是這次考試類別從交通行政轉換成資訊處理。本來考上桃捷公司就沒有想轉換跑道了,但在同事勸說下,再加上去年的高考考試,差 6 分考上,所以才毅然堅持地辭掉工作,當個全職考生,算賭一把機會 ( 只給自己兩年時間 ) 。 l    個人成績 - 資訊處理 107 年高考 ( 正取 ) 國文:                     56 ( 申 42 、測 14) 法學與英文:         66 資通網路:             56 程式語言:             7

電腦編碼系統介紹

( 參考資料: wiki + 淺 談 電腦 編 碼 )   工作上在練習寫 Struts 架構時,發現編碼蠻重要的,例如設定登入頁面,設定編碼不一致時會出現編碼錯誤 ,加上自己不是很懂整個概念,而整理了這篇電腦編碼系統。 電腦編碼系統介紹: -------------------------------------------------------- ( 一 ) 基礎概念 ( 二 ) 常見的編碼及說明 ( 三 ) 網際網路的發展 ( 四 ) Unicode -------------------------------------------------------- ( 一 ) 基礎概念: 由於人能理解各種特殊複雜的文字及符號,而電腦只懂得兩個數字,即 0 與 1 ,因此我們必須制定一些規則,將特殊複雜的文字及符號,用 0 與 1 的數字組合表示。 如大寫英文字母” A ”,在 ASCII 編碼中,” 1000001 ” (7bits) 表示。” 1000001 ”稱為 字元集、字符集 (Character encoding) 。     所以字元編碼是一種系統,會將支援的字元集中的每一個字元的與代表該字元的某個值配對。 PS : Bit( 位元 ) 為最小單位: 0 或 1 。 Bytes( 位元組 ) 由八個 Bit 所組成。 ( 二 ) 常見的編碼及說明: 1.      ASCII(American Standard Code for Information Interchange) : (1)   美國資訊交換標準碼,字面意思就知此編碼由美國制定,為基於拉丁字母的一套字元邏輯, ASCII 編碼僅用 7bits ,最多僅能表示 2 7 , 128 個字元,所以能展現的字元極其有限,只能表達英文字母 A-Z 、 a-z 、數字 0-9 及少量標點符號,適合用於開發英文環境中。 (2) 每台電腦都有此編碼,用來儲存英文字元素。其他語言國家透過相同的 ANSI 編碼,去做自己國家的語言文字對應,因而產生不同的編碼系統。若是用同樣文字轉換成別的編碼辨識,會形成亂碼。 ( 以 2 個 Bytes- 16bits 對應一個文字 進行儲存 ) 2.    

閱讀心得:真希望17歲就學會的金融知識

書名:真希望 17 歲就學會的金融知識         作者:慎 泰俊 (Shin Taejun) 此書是在 2013 年 2 月 11 日記錄的心得內容,因學校教育沒有教導我們理財知識,而去書局找一些基本書來學習,本書由基礎觀點一步一步深入教導,例如了解風險與報酬、分散風險、現在與未來價值、應用篇 … 等,書中內容附有相關計算公式。除了教導理財知識,書中也提到我們可以把時間拿來做甚麼事情,這也是一種投資,投資自己。 想學習理財 / 投資等知識,必須一步一步慢慢來,才能成為理財高手,絕對沒有一步登天賺大錢的神蹟;重點在於自己的判斷與思考。 書中提到當一個 BETA 值低的人,就是做很少做的事情或專研該領域,當發生危機時,你會是一個很重要的人,因為只有你懂,你能處理別人處理不了的危機風險。 ※ BETA 係數說明 ---------------------------- 一、前言 二、朝會 三、 第一堂課 - 風險與報酬 四、 第二堂課 - 分散風險 五、 第三堂課 - 現在價值與未來價值 六、 第四堂課 - 應用篇 - 國文 七、 第五堂課 - 應用篇 - 社會 八、老師指導時間 九、放學後 ---------------------------- 一、前言 古羅馬思想家塞內卡 (Lucius Annaeus Seneca) 說過:「人生非常漫長,若能全部加以有效利用,就能豐富人生,完成最偉大的事。」 不論是任何狀況, 永遠都有無限的可能。只要你希望,就可以實現幾乎所有的事 。 二、朝會 1.       不容許任何失敗、把自己牢牢束縛住的人、只跟與自己類似的人相處的人、只跟其他人作相同事情的人,都是 無法妥善處理不確定事務的人 。 為了順利使用某事物,並加以妥善處理, 第一步就是瞭解其結構 。對於不確定事物的結構,只有重要三件事要注意: n    第一, 愈能接受不確定性,回報也愈大。 n    第二, 有辦法成功降低不確定性。 n    第三, 確定的現在與不確定的將來是兩碼子事 。 2.       先學習如何 思考重點 。 金融理論採用報酬 ( 回報 ) 與風險 ( 結果的不確定性 ) 的思考