程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 【03-流程控制與數組】,03-流程數組

【03-流程控制與數組】,03-流程數組

編輯:JAVA綜合教程

【03-流程控制與數組】,03-流程數組


 

 

流程控制與數組


 

 

順序結構

 

  •順序結構就是程序從上到下一行一行地執行,中間沒有任何判斷和跳轉。

  •如果main方法多行代碼之間沒有任何流程控制,則程序總是從上向下依次執行,排在前面的代碼先執行,排在後

面的代碼後執行。

 


分支結構

 

 

•Java提供了兩種常見的分支控制結構:

–if語句:使用布爾表達式或布爾值作為分支條件來進行分支控制。

–switch語句:用於對多個整型值進行匹配,從而實現分支控制。


 

 

 if條件語句

 

•if條件語句的3種形式:

•  ▲ if (logic expression) { statements…}

 

•  ▲ if (logic expression) { statements…}

•       else { statements…}

 

•  ▲ if (logic expression) { statements…}

•       else if (logic expression) { statements…}

•       …//可以有0個或多個else if 語句

•       else { statements…} //最後的else語句也可以省略

 

•注意:if、else、else if 後條件執行體要麼是一個花括號括起來的語句塊,則這個語句塊整體作為條件執行體;

要麼是以分號為結束符的一行語句,甚至可能是一個空語句(空語句就是一個分號)。


If語句常見的錯誤

 

 

•如果if、else、else if後的執行體只有一行語句時,則可以省略花括號,但我們最好不要省略花括號,因為保留花

括號會有更好的可讀性,且還可以減少發生錯誤的可能。

 

•對於if 語句,還有一個很容易出現的邏輯錯誤,這個邏輯錯誤並不屬於語法問題,但引起錯誤的可能性更大。如

後面程序TestIfError.java我們想打印的是中年人,但打印出來的結果是青年人。

 

• 對於任何的if else 語句,表面上看起來else後沒有任何條件,或者else if後只有一個條件,但這不是真相:因為

else的含義是“否則”,else本身就是一個條件!else 的隱含條件就是對前面條件取反。


 

 switch分支語句

 

 

•可以省略case後代碼塊的花括號


◆使用break;語句,防止case穿透


◆default可以省略,但不推薦省略


◆switch語句中控制表達式的類型只能是byte、short、char、int、String(JDK7新增)和枚舉


 

 Switch語句容易導致的錯誤

 

 

•switch語句後的expression表達式的數據類型只能是byte、short、char、int、String類型和枚舉;

•小心省略了case後代碼塊的break;時所引入的陷阱。


循環結構 

 

 

•Java支持3種基本的循環語句:

–while 循環語句

–do while 循環語句

– for 循環語句


while  & do while 循環語句

 

 

★ while 循環的語法格式如下:

[init_statements]

while (test_expression)

{          statements;

  [iteration_statements]

}

★ 執行過程:先判斷邏輯表達式的值,若為true

則執行其後面的語句,然後再次判斷條件並反復

執行,直到條件不成立為止。

 

 


★ do while 循環的語法格式如下:

[init_statements]

do

{    statements;

  [iteration_statements]

}while (test_expression);

 

※注意:do while 循環的循環條件必須有一個分

號,這個分號表明循環結束。

★ 執行過程:先執行語句,再判斷邏輯表達式的

值,若為true,再執行語句,否則結束循環

 

 


控制循環條件

 

 

•使用循環時,一定要保證循環條件有變成false的時候,如果循環條件永遠為true,那就是死循環。使用while循

  環時還有一個陷阱,while循環條件後緊跟一個分號。

 

•do while 循環語句裡,即使test_expression循環條件的值開始是假,do while循環也會執行循環體。因此,

  do while循環的循環體至少執行一次。


本文原創作者:pipi-changing

本文原創出處:http://www.cnblogs.com/pipi-changing/

 


 

for 循環語句

 

 

•for ([inint_statements] ; [test_expression] ; [iteration_statements]){  statements  }

 

•★ 執行過程:首先計算表達式1,即init_statements,接著執行表達式2,即test_expression,若表達式2的

值為true,則執行語句(statements),接著執行表達式3,即iteration_statements,再判斷表達式2的值;

依次重復下去,直到表達式的值=false,則結束for循環。因此,for循環的循環條件(表達式2)比循環體(語

句)要多執行一次。

 

•注意:for循環的循環迭代語句並沒有與循環體放在一起,因此即使在執行循環體時遇到continue語句結束本次

循環,循環迭代語句一樣會得到執行。


for循環指定多個初始化語句

 

 

•for 循環允許同時指定多個初始化語句,循環條件也可以是一個包含邏輯運算符的表達式。但只能有一個聲明語

  句,因此如果需要在初始化表達式中聲明多個變量,那麼這些變量應該有相同的數據類型。

 

•初學者使用for循環時也容易犯一個錯誤,他們以為只要在for後的括號內控制了循環循環迭代語句就萬無一失,

  但實際情況則不是這樣的。


for循環的分號

 

 

•for 循環圓括號中只有兩個分號是必須的,初始化語句、循環條件、迭代語句部分都可以省略,如果省略了循環

  條件,則這個循環條件默認是true,將會產生一個死循環。

 

•使用for循環時,還可以把初始化條件定義在循環體之外,把循環迭代語句放在循環體內,這種做法將非常類似前

  面的while循環。


嵌套循環

 

 

•各種基本類型的循環都可以作為外層循環,各種基本類型的循環也可以作為內層循環。

•假設外層循環的循環次數為n次,內層循環的循環次數為m次,那麼內層循環的循環體實際上需要執行n*m次。

•實際上,嵌套循環不僅可以是兩層嵌套,還可以是三層嵌套,四層嵌套……


break語句

 

 

•break用於完全結束一個循環,跳出循環體。不管是哪種循環,一旦在循環體中遇到break,系統將完全結束循

  環,開始執行循環之後的代碼。

 

•break不僅可以結束其所在的循環,還可結束其外層循環。此時需要在break後緊跟一個標簽,這個標簽用於標

識一個外層循環。Java中的標簽就是一個緊跟著英文冒號(:)的標識符。且它必須放在循環語句之前才有作用。


continue 語句

 

 

•continue的功能和break有點類似,區別是continue只是中止本次循環,接著開始下一次循環。而break則是

完全中止循環。


return語句

 

 

• return關鍵字並不是專門用於跳出循環的,return的功能是結束一個方法。

 

•一旦在循環體內執行到一個return語句,return語句將會結束該方法,循環自然也隨之結束。與continue和

break不同的是,return直接結束整個方法,不管這個return處於多少層循環之內。


數組類型

 

 

•在任何已有類型後加上方括號[ ],又變成一種新類型,這種類型統稱為數組類型,所有的數組類型又稱為引用類

型,所以又稱引用類型。

 

•Java的數組要求所有數組元素具有相同的數據類型。因此,在一個數組中,數組元素的類型是唯一的,即一個數

組裡只能存儲一種數據類型的數據,而不能存儲多種數據類型的數據。

 

•一旦數組的初始化完成,數組在內存中所占的空間將被固定下來,因此數組的長度將不可改變。即使把某個數組

元素的數據清空,但它所占的空間依然被保留,依然屬於該數組,數組的長度依然不變。

 

•Java的數組既可以存儲基本類型的數據,也可以存儲引用類型的數據。

 

•值得指出的是:數組也是一種數據類型,它本身是一種引用類型。


定義數組

 

 

•Java語言支持兩種語法格式來定義數組:

–type[ ] arrayName;

–type  arrayName[ ];

•對於這兩種語法格式,一般推薦使用第一種格式。因為第一種格式不僅具有更好的語意,也具有更好的可讀性。

•數組是一種引用類型的變量,因此使用它定義一個變量時,僅僅表示定義了一個引用變量(也就是定義了一個指

  針),這個引用變量還未指向任何有效的內存,因此定義數組時不能指定數組的長度。

 

•※注意:定義數組時不能指定數組的長度。


數組的初始化

 

 

•靜態初始化:初始化時由程序員顯式指定每個數組的初始值,由系統決定需要的數組長度。

•動態初始化:初始化時程序員指定數組長度,由系統為數組元素分配初始值


動態初始化

 

 

•arrayName = new type[ length];


在上面的語法中,需要指定一個int整型的length參數,這個參數指定了數組的長度,也就是可以容納數組元素的

個數。


使用數組

 

 

•數組最常用的用法就是訪問數組元素,包括對數組元素賦值和訪問數組元素的值,訪問數組元素是通過在數組引用變

量後緊跟一個方括號([ ]),方括號裡是數組元素的索引值。

 

•Java語言的數組索引是從0開始的,也就是說,第一個數組元素的索引值為0,最後一個數組元素的索引為數組長度

減1。

 

•如果訪問數組元素進指定的索引小於0,或者大於等於數組的長度,編譯程序不會出現任何錯誤,但運行時出現異

常:java.lang.ArrayIndexOutOfBoundsException:2(數組索引越界異常),在這個異常提示信息後有一個int

整數,這個整數就是程序員試圖訪問的數組索引。

 

•所有數組都提供了一個length屬性,通過這個屬性可以訪問到數組的長度,一旦獲得了數組的長度後,就可以通過循

環來遍歷該數組的每個數組元素。


 JDK1.5 提供了foreach循環

 

 

•從JDK1.5 之後,Java提供了一種更簡單的循環:foreach循環,這種循環遍歷數組和集合更加簡潔。使用

foreach循環遍歷數組和集合元素時,無須獲得數組和集合長度,無須根據索引來訪問數組元素和集合元素,

foreach循環自動遍歷數組和集合的每個元素。

 

•當使用foreach循環來迭代輸出數組元素或集合時,通常不要對循環變量進行賦值,雖然這種賦值在語法上是允

許的,但沒有太大的意義,而且極容易引起錯誤。


深入數組

 

 

•數組元素和數組變量在內存裡是分開存放的。


實際的數組元素是存儲在堆(heap)內存中;數組引用變量是一個引用類型的變量,被存儲在棧(stack)內存

中。

 

 

•如果堆內存中數組不再有任何引用變量指向自己,則這個數組將成為垃圾,該數組所占的內存將會被系統的垃圾

回收機制回收。因此,為了讓垃圾回收機制回收一個數組所占的內存空間,則可以將該數組變量賦為null,也就切

斷了數組引用變量和實際數組之間的引用關系,實際數組也就成了垃圾。


 

 數組長度不可變

 

 

•只要類型相互兼容,可以讓一個數組變量指向另一個實際的數組,這種操作會產生數組的長度可變的錯覺。

•但由於數組變量整體賦值導致的數組的長度可以改變,只是一個假相。


基本類型數組的初始化

 

 

•對於基本類型數組而言,數組元素的值直接存儲在對應的數組元素中,因此,初始化數組時,先為該數組分配內

存空間,然後直接將數組元素的值存入對應數組元素中,

public class TestPrimitiveArray { public static void main(String[] args) { // 定義一個int[ ]類型的數組變量 int[] iArr; // 動態初始化數組,數組長度為5 iArr = new int[5]; // 采用循環方式為每個數組元素賦值 for (int i = 0; i < iArr.length; i++) { iArr[i] = i + 10; System.out.println(iArr[i]); } } } TestPrimitiveArray

 

 

 

 

 


 

 引用類型數組的初始化

 

 

引用類型數組的數組元素是引用,因此情況變得更加復雜:每個數組元素裡存儲的還是引用,它指向另一塊內存,

這塊內存裡存儲了有效數據。


沒有多維數組

         

 

•Java語言提供了多維數組的語法,但多維數組實質上還是一維數組。


Java語言裡的數組類型是引用類型,因此,數組變量其實是一個引用,這個引用指向真實的數組內存。數組元素

的類型也可以是引用,如果數組元素的引用再次指向真實的數組內存,這種情形看上去很像多維數組。

 

•定義二維數組的語法:

•type[ ] [ ]  arrName;


 

public class TestTwoDimension { public static void main(String[] args) { // 定義一個二維數組 int[][] a; // 把a當成一維數組進行初始化,初始化a是一個長度為3的整數 // a數組的數組元素又是引用類型 a = new int[3][]; // 把a數組當成一維數組,遍歷a數組的每個元素 for (int i = 0; i < a.length; i++) { System.out.println(a[i]); } // 初始化a數組的第一個元素 a[0] = new int[2]; // 訪問a數組的第一個元素所指數組的第二個元素 a[0][1] = 6; // a數組的第一個元素是一個一維數組,遍歷這個一維數組 for (int i = 0; i < a[0].length; i++) { System.out.println(a[0][i]); } } // null // null // null // 0 // 6 } TestTwoDimension

我們可以得到一個結論:

 

二維數組是一維數組,其數組元素是一維數組;三維數組也是一維數組,其數組元素是二維數組;四維數組還是一維數

組,其數組元素是三維數組……從這個角度來看,Java語言裡沒有多維數組。

 


 

 Java 8增強的Arrays工具類

 

 

•Arrays類裡包含的一些static修飾的方法可以直接操作數組。

•Java 8增強了Arrays類的功能,Java 8為Arrays類增加了一些工具方法,這些工具方法可以充分利用多CPU並

行的能力來提高設值、排序的性能。


 

代碼區: 

 

public class IfCorrectTest { public static void main(String[] args) { int age = 45; if (age > 60) { System.out.println("老年人"); } else if (age > 40) { System.out.println("中年人"); } else if (age > 20) { System.out.println("青年人"); } } // 中年人 } IfCorrectTest public class IfCorrectTest2 { public static void main(String[] args) { int age = 45; if (age > 60) { System.out.println("老年人"); } // 在原本的if條件中增加了else的隱含條件 if (age > 40 && !(age > 60)) { System.out.println("中年人"); } // 在原本的if條件中增加了else的隱含條件 if (age > 20 && !(age > 60) && !(age > 40 && !(age > 60))) { System.out.println("青年人"); } } // 中年人 } IfCorrectTest2 public class IfErrorTest { public static void main(String[] args) { int age = 45; if (age > 20) { System.out.println("青年人"); } else if (age > 40) { System.out.println("中年人"); } else if (age > 60) { System.out.println("老年人"); } } // 青年人 } IfErrorTest public class IfErrorTest2 { public static void main(String[] args) { int age = 45; if (age > 20) { System.out.println("青年人"); } // 在原本的if條件中增加了else的隱含條件 if (age > 40 && !(age > 20)) { System.out.println("中年人"); } // 在原本的if條件中增加了else的隱含條件 if (age > 60 && !(age > 20) && !(age > 40 && !(age > 20))) { System.out.println("老年人"); } } // 青年人 } IfErrorTest2 public class IfTest { public static void main(String[] args) { int age = 30; if (age > 20) // 只有當age > 20時,下面花括號括起來的語句塊才會執行 // 花括號括起來的語句是一個整體,要麼一起執行,要麼一起不會執行 { System.out.println("年齡已經大於20歲了"); System.out.println("20歲以上的人應該學會承擔責任..."); } // 定義變量a ,並為其賦值 int a = 5; if (a > 4) // 如果a>4,執行下面的執行體,只有一行代碼作為代碼塊 System.out.println("a大於4"); else // 否則,執行下面的執行體,只有一行代碼作為代碼塊 System.out.println("a不大於4"); // 定義變量b ,並為其賦值 int b = 5; if (b > 4) // 如果b>4,執行下面的執行體,只有一行代碼作為代碼塊 System.out.println("b大於4"); else // 否則,執行下面的執行體,只有一行代碼作為代碼塊 b--; // 對於下面代碼而言,它已經不再是條件執行體的一部分,因此總會執行。 System.out.println("b不大於4"); // 定義變量c ,並為其賦值 int c = 5; if (c > 4) // 如果b>4,執行下面的執行體,將只有c--;一行代碼為條件體 c--; // 下面是一行普通代碼,不屬於條件體 System.out.println("c大於4"); // 此處的else將沒有if語句,因此編譯出錯。 // else // 否則,執行下面的執行體,只有一行代碼作為代碼塊 System.out.println("c不大於4"); } // 年齡已經大於20歲了 // 20歲以上的人應該學會承擔責任... // a大於4 // b大於4 // b不大於4 // c大於4 // c不大於4 } IfTest public class StringSwitchTest { public static void main(String[] args) { // 聲明變量season String season = "夏天"; // 執行swicth分支語句 switch (season) { case "春天": System.out.println("春暖花開."); break; case "夏天": System.out.println("夏日炎炎."); break; case "秋天": System.out.println("秋高氣爽."); break; case "冬天": System.out.println("冬雪皚皚."); break; default: System.out.println("季節輸入錯誤"); } } // 夏日炎炎. } StringSwitchTest public class SwitchTest { public static void main(String[] args) { // 聲明變量score,並為其賦值為'C' char score = 'C'; // 執行swicth分支語句 switch (score) { case 'A': System.out.println("優秀"); break; case 'B': System.out.println("良好"); break; case 'C': System.out.println("中"); break; case 'D': System.out.println("及格"); break; case 'F': System.out.println("不及格"); break; default: System.out.println("成績輸入錯誤"); } } // 中 } SwitchTest

 

 

public class WhileTest { public static void main(String[] args) { // // 循環的初始化條件 // int count = 0; // // 當count小於10時,執行循環體 // while (count < 10) // { // System.out.println(count); // // 迭代語句 // count++; // } // System.out.println("循環結束!"); // // 下面是一個死循環 // int count = 0; // while (count < 10) // { // System.out.println("不停執行的死循環 " + count); // count--; // } // System.out.println("永遠無法跳出的循環體"); int count = 0; // while後緊跟一個分號,表明循環體是一個分號(空語句) while (count < 10) ; // 下面的代碼塊與while循環已經沒有任何關系 { System.out.println("------" + count); count++; } } } WhileTest public class DoWhileTest { public static void main(String[] args) { // 定義變量count int count = 1; // 執行do while循環 do { System.out.println(count); // 循環迭代語句 count++; // 循環條件緊跟while關鍵字 } while (count < 10); System.out.println("循環結束!"); // 定義變量count2 int count2 = 20; // 執行do while循環 do // 這行代碼把循環體和迭代部分合並成了一行代碼 System.out.println(count2++); while (count2 < 10); System.out.println("循環結束!"); } // 1 // 2 // 3 // 4 // 5 // 6 // 7 // 8 // 9 // 循環結束! // 20 // 循環結束! } DoWhileTest public class ForErrorTest { public static void main(String[] args) { // 循環的初始化條件,循環條件,循環迭代語句都在下面一行 for (int count = 0; count < 10; count++) { System.out.println(count); // 再次修改了循環變量 count *= 0.1; } System.out.println("循環結束!"); } } ForErrorTest public class ForInsteadWhile { public static void main(String[] args) { // 把for循環的初始化條件提出來獨立定義 int count = 0; // for循環裡只放循環條件 for (; count < 10;) { System.out.println(count); // 把循環迭代部分放在循環體之後定義 count++; } System.out.println("循環結束!"); // 此處將還可以訪問count變量 } // 0 // 1 // 2 // 3 // 4 // 5 // 6 // 7 // 8 // 9 // 循環結束! } ForInsteadWhile public class ForTest { public static void main(String[] args) { // 循環的初始化條件,循環條件,循環迭代語句都在下面一行 for (int count = 0; count < 10; count++) { System.out.println(count); } System.out.println("循環結束!"); } // 0 // 1 // 2 // 3 // 4 // 5 // 6 // 7 // 8 // 9 // 循環結束! } ForTest public class ForTest2 { public static void main(String[] args) { // 同時定義了三個初始化變量,使用&&來組合多個boolean表達式 for (int b = 0, s = 0, p = 0; b < 10 && s < 4 && p < 10; p++) { System.out.println(b++); System.out.println(++s + p); } } // 0 // 1 // 1 // 3 // 2 // 5 // 3 // 7 } ForTest2 public class NestedLoopTest { public static void main(String[] args) { // 外層循環 for (int i = 0; i < 5; i++) { // 內層循環 for (int j = 0; j < 3; j++) { System.out.println("i的值為:" + i + " j的值為:" + j); } } } // i的值為:0 j的值為:0 // i的值為:0 j的值為:1 // i的值為:0 j的值為:2 // i的值為:1 j的值為:0 // i的值為:1 j的值為:1 // i的值為:1 j的值為:2 // i的值為:2 j的值為:0 // i的值為:2 j的值為:1 // i的值為:2 j的值為:2 // i的值為:3 j的值為:0 // i的值為:3 j的值為:1 // i的值為:3 j的值為:2 // i的值為:4 j的值為:0 // i的值為:4 j的值為:1 // i的值為:4 j的值為:2 } NestedLoopTest public class WhileTest { public static void main(String[] args) { // // 循環的初始化條件 // int count = 0; // // 當count小於10時,執行循環體 // while (count < 10) // { // System.out.println(count); // // 迭代語句 // count++; // } // System.out.println("循環結束!"); // // 下面是一個死循環 // int count = 0; // while (count < 10) // { // System.out.println("不停執行的死循環 " + count); // count--; // } // System.out.println("永遠無法跳出的循環體"); int count = 0; // while後緊跟一個分號,表明循環體是一個分號(空語句) while (count < 10) ; // 下面的代碼塊與while循環已經沒有任何關系 { System.out.println("------" + count); count++; } } } WhileTest

 

 

 

 

public class BreakTest { public static void main(String[] args) { // 一個簡單的for循環 for (int i = 0; i < 10; i++) { System.out.println("i的值是" + i); if (i == 2) { // 執行該語句時將結束循環 break; } } } // i的值是0 // i的值是1 // i的值是2 } BreakTest public class BreakTest2 { public static void main(String[] args) { // 外層循環,outer作為標識符 outer: for (int i = 0; i < 5; i++) { // 內層循環 for (int j = 0; j < 3; j++) { System.out.println("i的值為:" + i + " j的值為:" + j); if (j == 1) { // 跳出outer標簽所標識的循環。 break outer; } } } } // i的值為:0 j的值為:0 // i的值為:0 j的值為:1 } BreakTest2 public class ContinueTest { public static void main(String[] args) { // 一個簡單的for循環 for (int i = 0; i < 3; i++) { System.out.println("i的值是" + i); if (i == 1) { // 忽略本次循環的剩下語句 continue; } System.out.println("continue後的輸出語句"); } } // i的值是0 // continue後的輸出語句 // i的值是1 // i的值是2 // continue後的輸出語句 } ContinueTest public class ContinueTest2 { public static void main(String[] args) { // 外層循環 outer: for (int i = 0; i < 5; i++) { // 內層循環 for (int j = 0; j < 3; j++) { System.out.println("i的值為:" + i + " j的值為:" + j); if (j == 1) { // 忽略outer標簽所指定的循環中本次循環所剩下語句。 continue outer; } } } } // i的值為:0 j的值為:0 // i的值為:0 j的值為:1 // i的值為:1 j的值為:0 // i的值為:1 j的值為:1 // i的值為:2 j的值為:0 // i的值為:2 j的值為:1 // i的值為:3 j的值為:0 // i的值為:3 j的值為:1 // i的值為:4 j的值為:0 // i的值為:4 j的值為:1 } ContinueTest2 public class ReturnTest { public static void main(String[] args) { // 一個簡單的for循環 for (int i = 0; i < 3; i++) { System.out.println("i的值是" + i); if (i == 1) { return; } System.out.println("return後的輸出語句"); } } // i的值是0 // return後的輸出語句 // i的值是1 } ReturnTest

 

 

 

 

public class ArrayTest { public static void main(String[] args) { // 定義一個int數組類型的變量,變量名為intArr. int[] intArr; // 使用靜態初始化,初始化數組時只指定數組元素的初始值,不指定數組長度。 intArr = new int[] { 5, 6, 8, 20 }; // 定義一個Object數組類型的變量,變量名為objArr. Object[] objArr; // 使用靜態初始化,初始化數組時數組元素的類型是 // 定義數組時所指定的數組元素類型的子類 objArr = new String[] { "Java", "李" }; Object[] objArr2; // 使用靜態初始化 objArr2 = new Object[] { "Java", "李" }; // 數組的定義和初始化同時完成,使用簡化的靜態初始化寫法 int[] a = { 5, 6, 7, 9 }; // 數組的定義和初始化同時完成,使用動態初始化語法 int[] prices = new int[5]; // 數組的定義和初始化同時完成,初始化數組時元素的類型是定義數組時元素類型的子類 Object[] books = new String[4]; // 輸出objArr數組的第二個元素,將輸出字符串"李" System.out.println(objArr[1]); // 為objArr2的第一個數組元素賦值 objArr2[0] = "Spring"; // 訪問數組元素指定的索引等於數組長度,所以下面代碼將在運行時出現異常 // System.out.println(objArr2[2]); // 使用循環輸出prices數組的每個數組元素的值 for (int i = 0; i < prices.length; i++) { System.out.println(prices[i]); } // 對動態初始化後的數組元素進行賦值 books[0] = "Java講義"; books[1] = "輕量級Java EE企業應用實戰"; // 使用循環輸出books數組的每個數組元素的值 for (int i = 0; i < books.length; i++) { System.out.println(books[i]); } } // 李 // 0 // 0 // 0 // 0 // 0 // Java講義 // 輕量級Java EE企業應用實戰 // null // null } ArrayTest public class ForEachErrorTest { public static void main(String[] args) { String[] books = { "輕量級Java EE企業應用實戰", "瘋狂Java講義", "瘋狂Android講義" }; // 使用foreach循環來遍歷數組元素,其中book將會自動迭代每個數組元素 for (String book : books) { book = "瘋狂Ajax講義"; System.out.println(book); } System.out.println(books[0]); } // 瘋狂Ajax講義 // 瘋狂Ajax講義 // 瘋狂Ajax講義 // 輕量級Java EE企業應用實戰 } ForEachErrorTest public class ForEachTest { public static void main(String[] args) { String[] books = { "輕量級Java EE企業應用實戰", "瘋狂Java講義", "瘋狂Android講義" }; // 使用foreach循環來遍歷數組元素, // 其中book將會自動迭代每個數組元素 for (String book : books) { System.out.println(book); } } // 輕量級Java EE企業應用實戰 // 瘋狂Java講義 // 瘋狂Android講義 } ForEachTest public class ArrayInRam { public static void main(String[] args) { // 定義並初始化數組,使用靜態初始化 int[] a = { 5, 7, 20 }; // 定義並初始化數組,使用動態初始化 int[] b = new int[4]; // 輸出b數組的長度 System.out.println("b數組的長度為:" + b.length); // 循環輸出a數組的元素 for (int i = 0, len = a.length; i < len; i++) { System.out.println(a[i]); } // 循環輸出b數組的元素 for (int i = 0, len = b.length; i < len; i++) { System.out.println(b[i]); } // 因為a是int[]類型,b也是int[]類型,所以可以將a的值賦給b。 // 也就是讓b引用指向a引用指向的數組 b = a; // 再次輸出b數組的長度 System.out.println("b數組的長度為:" + b.length); } // b數組的長度為:4 // 5 // 7 // 20 // 0 // 0 // 0 // 0 // b數組的長度為:3 } ArrayInRam public class ArraysTest { public static void main(String[] args) { // 定義一個a數組 int[] a = new int[] { 3, 4, 5, 6 }; // 定義一個a2數組 int[] a2 = new int[] { 3, 4, 5, 6 }; // a數組和a2數組的長度相等,每個元素依次相等,將輸出true System.out.println("a數組和a2數組是否相等:" + Arrays.equals(a, a2)); // 通過復制a數組,生成一個新的b數組 int[] b = Arrays.copyOf(a, 6); System.out.println("a數組和b數組是否相等:" + Arrays.equals(a, b)); // 輸出b數組的元素,將輸出[3, 4, 5, 6, 0, 0] System.out.println("b數組的元素為:" + Arrays.toString(b)); // 將b數組的第3個元素(包括)到第5個元素(不包括)賦為1 Arrays.fill(b, 2, 4, 1); // 輸出b數組的元素,將輸出[3, 4, 1, 1, 0, 0] System.out.println("b數組的元素為:" + Arrays.toString(b)); // 對b數組進行排序 Arrays.sort(b); // 輸出b數組的元素,將輸出[0, 0, 1, 1, 3, 4] System.out.println("b數組的元素為:" + Arrays.toString(b)); } // a數組和a2數組是否相等:true // a數組和b數組是否相等:false // b數組的元素為:[3, 4, 5, 6, 0, 0] // b數組的元素為:[3, 4, 1, 1, 0, 0] // b數組的元素為:[0, 0, 1, 1, 3, 4] } ArraysTest public class ArraysTest2 { public static void main(String[] args) { int[] arr1 = new int[] { 3, -4, 25, 16, 30, 18 }; // 對數組arr1進行並發排序 Arrays.parallelSort(arr1); System.out.println(Arrays.toString(arr1)); int[] arr2 = new int[] { 3, -4, 25, 16, 30, 18 }; Arrays.parallelPrefix(arr2, new IntBinaryOperator() { // left代表數組中前一個所索引處的元素,計算第一個元素時,left為1 // right代表數組中當前索引處的元素 public int applyAsInt(int left, int right) { return left * right; } }); System.out.println(Arrays.toString(arr2)); int[] arr3 = new int[5]; Arrays.parallelSetAll(arr3, new IntUnaryOperator() { // operand代表正在計算的元素索引 public int applyAsInt(int operand) { return operand * 5; } }); System.out.println(Arrays.toString(arr3)); } } ArraysTest2 public class Gobang { // 定義棋盤的大小 private static int BOARD_SIZE = 15; // 定義一個二維數組來充當棋盤 private String[][] board; public void initBoard() { // 初始化棋盤數組 board = new String[BOARD_SIZE][BOARD_SIZE]; // 把每個元素賦為"╋",用於在控制台畫出棋盤 for (int i = 0; i < BOARD_SIZE; i++) { for (int j = 0; j < BOARD_SIZE; j++) { board[i][j] = "╋"; } } } // 在控制台輸出棋盤的方法 public void printBoard() { // 打印每個數組元素 for (int i = 0; i < BOARD_SIZE; i++) { for (int j = 0; j < BOARD_SIZE; j++) { // 打印數組元素後不換行 System.out.print(board[i][j]); } // 每打印完一行數組元素後輸出一個換行符 System.out.print("\n"); } } public static void main(String[] args) throws Exception { Gobang gb = new Gobang(); gb.initBoard(); gb.printBoard(); // 這是用於獲取鍵盤輸入的方法 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String inputStr = null; // br.readLine():每當在鍵盤上輸入一行內容按回車,用戶剛輸入的內容將被br讀取到。 while ((inputStr = br.readLine()) != null) { // 將用戶輸入的字符串以逗號(,)作為分隔符,分隔成2個字符串 String[] posStrArr = inputStr.split(","); // 將2個字符串轉換成用戶下棋的座標 int xPos = Integer.parseInt(posStrArr[0]); int yPos = Integer.parseInt(posStrArr[1]); // 把對應的數組元素賦為"●"。 gb.board[yPos - 1][xPos - 1] = "●"; /* * 電腦隨機生成2個整數,作為電腦下棋的座標,賦給board數組。 還涉及 1.座標的有效性,只能是數字,不能超出棋盤范圍 * 2.如果下的棋的點,不能重復下棋。 3.每次下棋後,需要掃描誰贏了 */ gb.printBoard(); System.out.println("請輸入您下棋的座標,應以x,y的格式:"); } } // ╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋ // ╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋ // ╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋ // ╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋ // ╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋ // ╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋ // ╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋ // ╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋ // ╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋ // ╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋ // ╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋ // ╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋ // ╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋ // ╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋ // ╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋ } Gobang public class Num2Rmb { private String[] hanArr = { "零", "壹", "貳", "三", "肆", "伍", "陸", "柒", "捌", "玖" }; private String[] unitArr = { "十", "百", "千" }; /** * 把一個浮點數分解成整數部分和小數部分字符串 * * @param num * 需要被分解的浮點數 * @return 分解出來的整數部分和小數部分。第一個數組元素是整數部分,第二個數組元素是小數部分。 */ private String[] divide(double num) { // 將一個浮點數強制類型轉換為long,即得到它的整數部分 long zheng = (long) num; // 浮點數減去整數部分,得到小數部分,小數部分乘以100後再取整得到2位小數 long xiao = Math.round((num - zheng) * 100); // 下面用了2種方法把整數轉換為字符串 return new String[] { zheng + "", String.valueOf(xiao) }; } /** * 把一個四位的數字字符串變成漢字字符串 * * @param numStr * 需要被轉換的四位的數字字符串 * @return 四位的數字字符串被轉換成的漢字字符串。 */ private String toHanStr(String numStr) { String result = ""; int numLen = numStr.length(); // 依次遍歷數字字符串的每一位數字 for (int i = 0; i < numLen; i++) { // 把char型數字轉換成的int型數字,因為它們的ASCII碼值恰好相差48 // 因此把char型數字減去48得到int型數字,例如'4'被轉換成4。 int num = numStr.charAt(i) - 48; // 如果不是最後一位數字,而且數字不是零,則需要添加單位(千、百、十) if (i != numLen - 1 && num != 0) { result += hanArr[num] + unitArr[numLen - 2 - i]; } // 否則不要添加單位 else { result += hanArr[num]; } } return result; } public static void main(String[] args) { Num2Rmb nr = new Num2Rmb(); // 測試把一個浮點數分解成整數部分和小數部分 System.out.println(Arrays.toString(nr.divide(236711125.123))); // 測試把一個四位的數字字符串變成漢字字符串 System.out.println(nr.toHanStr("609")); } // [236711125, 12] // 陸百零玖 } Num2Rmb public class Num2Rmb { private String[] hanArr = { "零", "壹", "貳", "三", "肆", "伍", "陸", "柒", "捌", "玖" }; private String[] unitArr = { "十", "百", "千" }; /** * 把一個浮點數分解成整數部分和小數部分字符串 * * @param num * 需要被分解的浮點數 * @return 分解出來的整數部分和小數部分。第一個數組元素是整數部分,第二個數組元素是小數部分。 */ private String[] divide(double num) { // 將一個浮點數強制類型轉換為long,即得到它的整數部分 long zheng = (long) num; // 浮點數減去整數部分,得到小數部分,小數部分乘以100後再取整得到2位小數 long xiao = Math.round((num - zheng) * 100); // 下面用了2種方法把整數轉換為字符串 return new String[] { zheng + "", String.valueOf(xiao) }; } /** * 把一個四位的數字字符串變成漢字字符串 * * @param numStr * 需要被轉換的四位的數字字符串 * @return 四位的數字字符串被轉換成的漢字字符串。 */ private String toHanStr(String numStr) { String result = ""; int numLen = numStr.length(); // 依次遍歷數字字符串的每一位數字 for (int i = 0; i < numLen; i++) { // 把char型數字轉換成的int型數字,因為它們的ASCII碼值恰好相差48 // 因此把char型數字減去48得到int型數字,例如'4'被轉換成4。 int num = numStr.charAt(i) - 48; // 如果不是最後一位數字,而且數字不是零,則需要添加單位(千、百、十) if (i != numLen - 1 && num != 0) { result += hanArr[num] + unitArr[numLen - 2 - i]; } // 否則不要添加單位 else { result += hanArr[num]; } } return result; } public static void main(String[] args) { Num2Rmb nr = new Num2Rmb(); // 測試把一個浮點數分解成整數部分和小數部分 System.out.println(Arrays.toString(nr.divide(236711125.123))); // 測試把一個四位的數字字符串變成漢字字符串 System.out.println(nr.toHanStr("609")); } // [236711125, 12] // 陸百零玖 } Num2Rmb public class PrimitiveArrayTest { public static void main(String[] args) { // 定義一個int[]類型的數組變量 int[] iArr; // 動態初始化數組,數組長度為5 iArr = new int[5]; // 采用循環方式為每個數組元素賦值。 for (int i = 0; i < iArr.length; i++) { iArr[i] = i + 10; } } } PrimitiveArrayTest class Person { public int age; // 年齡 public double height; // 身高 // 定義一個info方法 public void info() { System.out.println("我的年齡是:" + age + ",我的身高是:" + height); } // 我的年齡是:16,我的身高是:161.0 // 我的年齡是:16,我的身高是:161.0 } public class ReferenceArrayTest { public static void main(String[] args) { // 定義一個students數組變量,其類型是Person[] Person[] students; // 執行動態初始化 students = new Person[2]; // 創建一個Person實例,並將這個Person實例賦給zhang變量 Person zhang = new Person(); // 為zhang所引用的Person對象的age、height賦值 zhang.age = 15; zhang.height = 158; // 創建一個Person實例,並將這個Person實例賦給lee變量 Person lee = new Person(); // 為lee所引用的Person對象的age、height賦值 lee.age = 16; lee.height = 161; // 將zhang變量的值賦給第一個數組元素 students[0] = zhang; // 將lee變量的值賦給第二個數組元素 students[1] = lee; // 下面兩行代碼的結果完全一樣,因為lee // 和students[1]指向的是同一個Person實例。 lee.info(); students[1].info(); } } Person public class TwoDimensionTest { public static void main(String[] args) { // 定義一個二維數組 int[][] a; // 把a當成一維數組進行初始化,初始化a是一個長度為4的數組 // a數組的數組元素又是引用類型 a = new int[4][]; // 把a數組當成一維數組,遍歷a數組的每個數組元素 for (int i = 0, len = a.length; i < len; i++) { System.out.println(a[i]); } // 初始化a數組的第一個元素 a[0] = new int[2]; // 訪問a數組的第一個元素所指數組的第二個元素 a[0][1] = 6; // a數組的第一個元素是一個一維數組,遍歷這個一維數組 for (int i = 0, len = a[0].length; i < len; i++) { System.out.println(a[0][i]); } // 同時初始化二維數組的2個維數 int[][] b = new int[3][4]; // 使用靜態初始化的語法來初始化一個二維數組 String[][] str1 = new String[][] { new String[3], new String[] { "hello" } }; // 使用簡化的靜態初始化語法來初始化二維數組 String[][] str2 = { new String[3], new String[] { "hello" } }; System.out.println(str1[1][0]); System.out.println(str2[1][0]); } // null // null // null // null // 0 // 6 // hello // hello } TwoDimensionTest

 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved