主頁 > 後端開發 > ?全網最強Java基礎總結 ?,質量不行你直接拉黑我就行

?全網最強Java基礎總結 ?,質量不行你直接拉黑我就行

2021-10-10 08:13:49 後端開發

💂 個人主頁: Java程式魚

💬 如果文章對你有幫助,歡迎關注、點贊、收藏(一鍵三連)和訂閱專欄

👤 微信號:hzy1014211086,想加入技術交流群的小伙伴可以加我好友,群里會分享學習資料、學習方法


序號內容
1面試題專欄
2Redis專欄
3SpringBoot專欄

文章目錄

  • 一、第一個Java程式
  • 二、八種基本資料型別
  • 三、包裝型別
  • 四、快取池
  • 五、String
    • 1.常用API
    • 2.字串池(String Pool)
    • 3.字串拼接操作
    • 4.拼接操作與append操作的效率對比
    • 5.為什么 String 在 Java 中是不可變的?
    • 6.String、StringBuffer、StringBuilder的區別
  • 五、變數
    • 1.區域變數
    • 2.實體變數
    • 3.靜態變數
  • 五、運算子
    • 1.賦值運算子
    • 2.算術運算子
    • 3.關系運算子
    • 4.邏輯運算子
    • 5.位運算子
    • 6.位移運算子
    • 7.三元運算子
  • 六、條件陳述句
    • 1.if
    • 2.if...else
    • 3.if...else if...else
    • 4.嵌套的 if…else
  • 八、switch case
  • 九、回圈
    • 1.while回圈
    • 2.do…while 回圈
    • 3.for 回圈
    • 4.break 關鍵字
    • 5.continue
  • ?? 彩蛋


一、第一個Java程式

public class HelloWorld {
    public static void main(String[] args) {
    	System.out.println("hello world");
    }
}

我給大家介紹下上述代碼:

  • class:這是一個關鍵字,用于在Java中宣告一個類,
  • public:這是一個關鍵字,表示公開的訪問修飾符,這意味著它對所有人可見,
  • static:這是是一個關鍵字,如果我們將任何方法宣告為靜態方法,則稱為靜態方法,靜態方法的核心優點是,不需要創建物件來呼叫靜態方法,main方法由JVM執行,因此不需要創建物件來呼叫main方法,這樣可以節省記憶體,
  • void:是方法的回傳型別,意味著它不回傳任何值,
  • main:代表程式的起點,
  • String[] args:用于命令列引數,我們稍后會學習,
  • System.out.println():用于列印輸出的陳述句,System是一個類,out是PrintStream類的物件,println() 是PrintStream類的方法,

二、八種基本資料型別

Java 中有 8 種基本資料型別,分別為:
4 種「 整數 」型別:byte、short、int、long
2 種「 浮點 」型別 :float、double
1 種「 字符 」型別:char
1 種「 布爾 」型:boolean

這 8 種基本資料型別的默認值以及所占空間的大小如下:

基本型別位數位元組默認值
int3240
short1620
long6480L
byte810
char162‘u0000’
float3240f
double6480d
boolean1false

boolean 只有兩個值:true、false,可以使用 1 bit 來存盤,但是官方未明確定義,它依賴于 JVM 廠商的具體實作,

三、包裝型別

每個基本型別都有對應的包裝型別,基本型別與其對應的包裝型別之間的賦值使用自動裝箱與拆箱完成,

Integer x = 100;     // 裝箱 呼叫了 Integer.valueOf(100)
int y = x;         // 拆箱 呼叫了 x.intValue()

裝箱:將基本型別用它們對應的參考型別包裝起來;
拆箱:將包裝型別轉換為基本資料型別;

Integer x = 100 等價于 Integer x = Integer.valueOf(100);
int y = x 等價于 int y = x.intValue();

四、快取池

Java 基本型別的包裝類的大部分都實作了常量池技術,Byte、Short、Integer、Long 這 4 種包裝類默認創建了數值 [-128,127] 的相應型別的快取資料,Character 創建了數值在[0,127]范圍的快取資料,Boolean 直接回傳 True Or False,

Integer 快取原始碼:

/**
 * 此方法將始終快取-128 到 127(包括端點)范圍內的值,并可以快取此范圍之外的其他值,
 * @param i
 * @return
 */
public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

private static class IntegerCache {
    static final int low = -128;
    static final int high;
    static final Integer cache[];
} 
public static void main(String[] args) {
	Integer i1 = 100;
	Integer i2 = 100;
	System.out.println(i1 == i2); // 輸出 true
	
	Integer y1 = 128;
	Integer y2 = 128;
	System.out.println(y1 == y2); // 輸出 false
}

如果超出對應范圍仍然會去創建新的物件,快取的范圍區間的大小只是在性能和資源之間的權衡,

public static void main(String[] args) {
	Float i1 = 1f;
	Float i2 = 1f;
	System.out.println(i1 == i2);// 輸出 false

	Double y1 = 1.2;
	Double y2 = 1.2;
	System.out.println(y1 == y2);// 輸出 false
}

兩種浮點數型別的包裝類 Float、Double 「 并沒有實作常量池技術 」

public static void main(String[] args) {
	Integer i1 = 100;
	Integer i2 = new Integer(100);
	System.out.println(i1 == i2); // false
}

new Integer(100) 與 Integer.valueOf(100) 的區別在于:

  • new Integer(100) 「 每次都會新建一個物件 」
  • Integer.valueOf(100) 會使用快取池中的物件,「 多次呼叫會取得同一個物件的參考 」

五、String

字串就是一系列字符,在Java中,字串可以包含任意 Unicode 字符,例如,字串Java?或字串Java\u2122 是由5個Unicode字符J、a、v、a和?組成的,最后一個字符是"U+211商標",

public static void main(String[] args) {
    System.out.println("Java\u2122");
}

列印結果:Java?

在 Java 8 中,String 內部使用 char 陣列存盤資料,

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];
}

在 Java 9 之后,String 類的實作改用 byte 陣列存盤字串,同時使用 coder 來標識使用了哪種編碼,

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final byte[] value;

    /** The identifier of the encoding used to encode the bytes in {@code value}. */
    private final byte coder;
}

value 陣列被宣告為 final,這意味著 value 陣列初始化之后就不能再參考其它陣列,并且 String 內部沒有改變 value 陣列的方法,「 因此可以保證 String 不可變 」

1.常用API

這塊大家可以自行上官網查看,然后自己動手寫一寫,這塊比較簡單,

Java官網 String:https://docs.oracle.com/javase/8/docs/api/java/lang/String.html

2.字串池(String Pool)

在作業中,String類是我們使用頻率非常高的一種物件型別,JVM為了提升性能和減少記憶體開銷,避免字串的重復創建,其維護了一塊特殊的記憶體空間,即字串池(String Pool),字串池由 String 類私有的維護,

我們知道,在Java中有兩種創建字串物件的方式:

  • 采用字面值的方式賦值
  • 采用new關鍵字新建一個字串物件,

這兩種方式在性能和記憶體占用方面存在著差別,

public static void main(String[] args) {
	String str1 = "abc";
	String str2 = "abc";
	System.out.println(str1 == str2); // true
}

采用字面值的方式創建一個字串時, 「 首先會去字串池中查找是否存在"abc"這個物件 」,如果不存在,則在字串池中創建"abc"這個物件,然后將池中"abc"這個物件的參考地址回傳給字串常量str,這樣str會指向池中"abc"這個字串物件;如果存在,則不創建任何物件,直接將池中"abc"這個物件的地址回傳,賦給字串常量,因此,上面案例中,str1==str2 得到的結果是 true,

public static void main(String[] args) {
	String str3 = new String("abc");
	String str4 = new String("abc");
	System.out.println(str3 == str4); // false
}

采用new關鍵字新建一個字串物件時,JVM首先在字串池中查找有沒有"abc"這個字串物件,如果有,則不在池中再去創建"abc"這個物件了,直接在堆中創建一個"abc"字串物件,然后將堆中的這個"abc"物件的地址回傳賦給參考str3,這樣,str3就指向了堆中創建的這個"abc"字串物件;如果沒有,則首先在字串池中創建一個"abc"字串物件,然后再在堆中創建一個"abc"字串物件,然后將堆中這個"abc"字串物件的地址回傳賦給str3參考,這樣,str3指向了堆中創建的這個"abc"字串物件,因此,上面案例中,str3==str4 得到的結果是 false,

字串池的實作有一個前提條件:「 String物件是不可變的 」,因為這樣可以保證多個參考可以同事指向字串池中的同一個物件,如果字串是可變的,那么一個參考操作改變了物件的值,對其他參考會有影響,這樣顯然是不合理的,

3.字串拼接操作

@Test
public void test2(){
    String s1 = "javaEE";
    String s2 = "hadoop";

    String s3 = "javaEEhadoop";
    String s4 = "javaEE" + "hadoop";//編譯期優化(在編譯時得到的結果,s4會指向字串常量池)
    //如果拼接符號的前后出現了變數,則相當于在堆空間中new String(),具體的內容為拼接的結果:javaEEhadoop(在運行時得到的結果)
    String s5 = s1 + "hadoop";
    String s6 = "javaEE" + s2;
    String s7 = s1 + s2;

    System.out.println(s3 == s4);//true
    System.out.println(s3 == s5);//false
    System.out.println(s3 == s6);//false
    System.out.println(s3 == s7);//false
    System.out.println(s5 == s6);//false
    System.out.println(s5 == s7);//false
    System.out.println(s6 == s7);//false
    
    //intern():判斷字串常量池中是否存在javaEEhadoop值,如果存在,則回傳常量池中javaEEhadoop的地址;
    //如果字串常量池中不存在javaEEhadoop,則在常量池中加載一份javaEEhadoop,并回傳次物件的地址,
    String s8 = s6.intern();
    System.out.println(s3 == s8);//true
    final String s9 = "a";
    final String s10 = "b";
    String s11 = "ab";
    String s12 = s9 + s10;
    System.out.println(s11 == s12);//true
}
  • 常量與常量的拼接結果在常量池,原理是編譯期優化
  • 拼接程序中,只要其中有一個是變數,結果就在堆中(相當于在堆空間中new String),變數拼接的原理是StringBuilder
  • intern():判斷字串常量池中是否存在javaEEhadoop這個值,如果存在,則回傳常量池中地址,如果不存在,則在常量池中加載一份并回傳地址
  • 如果拼接符左右兩邊都是字串常量或常量參考,則仍然使用編譯期優化

這部分內容可能比較難理解,如果有小伙伴理解不了,可以先記錄下來,跳過去學習其他的內容,等你有一定的代碼量積累了,在反過頭來看就簡單了,

4.拼接操作與append操作的效率對比

public void test1(int highLevel){
    String src = "";
    for (int i = 0; i < highLevel; i++) {
        src = src + "a";
    }
}

public void test2(int highLevel){
    StringBuilder src = new StringBuilder();
    for (int i = 0; i < highLevel; i++) {
        src.append("a");
    }
}

通過StringBuilder的append()的方式添加字串的效率要遠高于使用String的字串拼接方式,

  • StringBuilder的append方式,自始至終只創建一個StringBuilder的物件,使用String的字串拼接方式會創建多個StringBuilder物件和String物件
  • 使用 String 的字串拼接方式會創建多個 StringBuilder 物件和 String 物件,記憶體占用更大,如果進行GC,需要花費額外的時間

改進空間:如果基本確定長度,建議使用構造器指定StringBuilder底層陣列的長度,避免多次擴容消耗

這部分內容可能比較難理解,如果有小伙伴理解不了,可以先記錄下來,跳過去學習其他的內容,等你有一定的代碼量積累了,在反過頭來看就簡單了,

5.為什么 String 在 Java 中是不可變的?

  • 提供程式運行效率,只有字串是不可變時,我們才能實作JVM中的字串常量池,字串常量池可以為我們快取字串,提供程式運行效率
  • 安全,比如在核心業務操作之前,可能會有一系列校驗,校驗String字串的合法性,如果是可變的話,在校驗過后,它的內部值又被改變了,這可能會引發一系列問題,這是迫使String類設計成不可變的一個重要原因,
  • 快取hashCode,字串的 hashCode 在 Java 中經常使用,例如,在 HashMap 或 HashSet 中,不可變保證了 hashcode 始終相同,這意味著只需要計算一次hashCode就行了,這樣效率更高,
  • 執行緒安全,String 不可變性天生具備執行緒安全,可以在多個執行緒中安全地使用,

6.String、StringBuffer、StringBuilder的區別

String、StringBuffer、StringBuilder 三個都可以存盤字串,其中String只讀字串,它的值不可改變長度也是固定的,而StringBuffer、StringBuilder類表示的字串可以直接進行修改,StringBuilder是JDK1.5中引入的,他和StringBuffer的方法完全相同,區別在于StringBuilder是單執行緒環境下使用的,因為它的所有方法都沒有被synchronized修飾,因此它的效率比StringBuffer高,

五、變數

變數是在執行Java程式時保存值的容器,變數分配有資料型別,

變數是記憶體位置的名稱,Java中存在三種型別的變數:區域變數,實體變數和靜態變數,

1.區域變數

  • 區域變數宣告在方法、構造方法或者陳述句塊中
  • 區域變數在「 方法、構造方法、或者陳述句塊被執行的時候創建」,當它們執行完成后,變數將會被銷毀
  • 區域變數只在宣告它的方法、構造方法或者陳述句塊中可見
  • 區域變數沒有默認值,所以區域變數被宣告后,必須經過初始化,才可以使用
  • 區域變數不能用「 static 」關鍵字定義

2.實體變數

在類內部但在方法主體外部宣告的變數稱為「 實體變數 」,它沒有宣告為static,

  • 實體變數宣告在一個類中,但在方法、構造方法和陳述句塊之外
  • 實體變數在「 物件創建的時候創建 」,在物件被銷毀的時候銷毀
  • 實體變數對于類中的方法、構造方法或者陳述句塊是可見的,一般情況下應該把實體變數設為私有,通過使用訪問修飾符可以使實體變數對子類可見
  • 實體變數具有默認值

3.靜態變數

  • 類變數也稱為靜態變數,在類中以static關鍵字宣告,但必須在方法構造方法和陳述句塊之外
  • 無論一個類創建了多少個物件,類只擁有類變數的一份拷貝
  • 靜態變數在「 第一次被訪問時創建 」,在程式結束時銷毀
  • 與實體變數具有相似的可見性,但為了對類的使用者可見,大多數靜態變數宣告為public型別
  • 靜態變數具有默認值

靜態變數和實體變數的區別:

  • 呼叫方式
    • 可以直接通過類名呼叫,也可以通過物件實體呼叫,這個變數屬于類,(new Student().name、Student.name)
    • 只能通過物件實體呼叫,這個變數屬于物件,(new Student().name)
  • 生命周期
    • 靜態變數隨著類的加載而存在,隨著類的消失而消失,生命周期長,
    • 實體變數隨著物件的創建而存在,隨著物件的消失而消失,
  • 與物件的相關性
    • 靜態變數是所有物件共享一份資料,
    • 實體變數是每個物件獨享一份資料,
public class HelloWorld {
	int x = 50;	// 實體變數
	static int y = 100;	// 靜態變數

	void method() {
		int z = 90;	// 區域變數
	}
}

五、運算子

1.賦值運算子

賦值運算子(=)用于為變數賦值

int count = 1;

2.算術運算子

public static void main(String[] args) {
	int x = 1 + 2;
	int y = 2 - 1;
	int z = 2 * 1;
	int i = 4 / 2;
	int t = 9 % 3; // 結果是0,取余
	int k = -i; // 結果是-2,取反運算
	
	// ++和--運算子可以放在變數之前,也可以放在變數之后,當運算子放在變數之前時(前綴),先自增/減,再賦值;當運算子放在變數之后時(后綴),先賦值,再自增/減,
	int q = 0;
	System.out.println(q++); // 0
	int w = 0;
	System.out.println(++w); // 1
}

3.關系運算子

運算子描述例子
==檢查如果兩個運算元的值是否相等,如果相等則條件為真,(A == B)為假,
!=檢查如果兩個運算元的值是否相等,如果值不相等則條件為真,(A != B) 為真,
>檢查左運算元的值是否大于右運算元的值,如果是那么條件為真,(A> B)為假,
<檢查左運算元的值是否小于右運算元的值,如果是那么條件為真,(A <B)為真,
>=檢查左運算元的值是否大于或等于右運算元的值,如果是那么條件為真,(A> = B)為假,
<=檢查左運算元的值是否小于或等于右運算元的值,如果是那么條件為真,(A <= B)為真,

4.邏輯運算子

運算子描述例子
&&稱為邏輯與運算子,當且僅當兩個運算元都為真,條件才為真,(A && B)為假,
| |稱為邏輯或運算子,如果任何兩個運算元任何一個為真,條件為真,(A || B)為真,
稱為邏輯非運算子,用來反轉運算元的邏輯狀態,如果條件為true,則邏輯非運算子將得到false,!(A && B)為真,
  • && 與 & 區別:&和&&都可以用作邏輯與的運算子,表示邏輯與(and),當運算子兩邊的運算式的結果都為true時,整個運算結果才為true,否則,只要有一方為false,則結果為false,&&還具有短路的功能,即如果第一個運算式為false,則不再計算第二個運算式
  • || 與 | 區別:短路或與短路與同理,

5.位運算子

A = 0011 1100
B = 0000 1101
--------------
A&B = 0000 1100
A | B = 0011 1101
A ^ B = 0011 0001
~A= 1100 0011

下表列出了位運算子的基本運算,假設整數變數 A 的值為 60 和變數 B 的值為 13:

運算子描述例子
如果相對應位都是1,則結果為1,否則為0(A&B),得到12,即0000 1100
|如果相對應位都是 0,則結果為 0,否則為 1(A | B)得到61,即 0011 1101
^如果相對應位值相同,則結果為0,否則為1(A ^ B)得到49,即 0011 0001
?按位取反運算子翻轉運算元的每一位,即0變成1,1變成0,(?A)得到-61,即1100 0011
public class Test {
  public static void main(String[] args) {
     int a = 60; /* 60 = 0011 1100 */ 
     int b = 13; /* 13 = 0000 1101 */
     int c = 0;
     c = a & b;       /* 12 = 0000 1100 */
     System.out.println("a & b = " + c );
 
     c = a | b;       /* 61 = 0011 1101 */
     System.out.println("a | b = " + c );
 
     c = a ^ b;       /* 49 = 0011 0001 */
     System.out.println("a ^ b = " + c );
 
     c = ~a;          /*-61 = 1100 0011 */
     System.out.println("~a = " + c );
  }
} 

6.位移運算子

(1)<<

左移位運算子為 << ,其運算規則是:按二進制形式把所有的數字向左移動對應的位數,高位移出(舍棄),低位的空位補零,

例如,將整數 11 向左位移 1 位的程序如下圖所示,
在這里插入圖片描述

從上圖可以看到,原來數的所有二進制位都向左移動 1 位,原來位于左邊的最高位 0 被移出舍棄,再向尾部追加 0 補位,最終到的結果是 22,相當于原來數的 2 倍,

(2)>>

右位移運算子為 >> ,其運算規則是:按二進制形式把所有的數字向右移動對應的位數,低位移出(舍棄),高位的空位補零,

例如,將整數 11 向右位移 1 位的程序如下圖所示,

在這里插入圖片描述
從上圖可以看到,原來數的所有二進制位都向右移動 1 位,原來位于右邊的最低位 1 被移出舍棄,再向最高位追加 0 補位,最終到的結果是 5,相當于原數整除 2 的結果,

(3)>>>

無符號右移運算子

無符號右移運算子和右移運算子是一樣的,不過無符號右移運算子在右移的時候是補0的,而右移運算子是補符號位的,

7.三元運算子

條件運算子也被稱為三元運算子,該運算子有3個運算元,并且需要判斷布爾運算式的值,該運算子的主要是決定哪個值應該賦值給變數,

variable x = (expression) ? value if true : value if false
public class Test {
   public static void main(String[] args){
      int a , b;
      a = 10;
      // 如果 a 等于 1 成立,則設定 b 為 20,否則為 30
      b = (a == 1) ? 20 : 30;
      System.out.println( "Value of b is : " +  b );
 
      // 如果 a 等于 10 成立,則設定 b 為 20,否則為 30
      b = (a == 10) ? 20 : 30;
      System.out.println( "Value of b is : " + b );
   }
}

六、條件陳述句

一個 if 陳述句包含一個布爾運算式和一潭訓多條陳述句,

1.if

if(布爾運算式)
{
   //如果布爾運算式為true將執行的陳述句
}

2.if…else

if 陳述句后面可以跟 else 陳述句,當 if 陳述句的布爾運算式值為 false 時,else 陳述句塊會被執行,

if(布爾運算式){
   //如果布爾運算式的值為true
}else{
   //如果布爾運算式的值為false
}

3.if…else if…else

if(布爾運算式 1){
   //如果布爾運算式 1的值為true執行代碼
}else if(布爾運算式 2){
   //如果布爾運算式 2的值為true執行代碼
}else if(布爾運算式 3){
   //如果布爾運算式 3的值為true執行代碼
}else {
   //如果以上布爾運算式都不為true執行代碼
}

4.嵌套的 if…else

if(布爾運算式 1){
	  如果布爾運算式 1的值為true執行代碼
   if(布爾運算式 2){
      如果布爾運算式 2的值為true執行代碼
   }else{
	  如果布爾運算式 2的值為false執行代碼
   }
}

八、switch case

switch case 陳述句判斷一個變數與一系列值中某個值是否相等,每個值稱為一個分支,

switch(運算式){
    case1 :
       //陳述句塊1
       break; //可選
    case2 :
       //陳述句塊2
       break; //可選
    //你可以有任意數量的case陳述句
    default : //可選
       //陳述句
}

switch case 陳述句有如下規則:

  • switch運算式,運算式的值必須為 byte、short、int 或者 char,從 Java SE 7 開始,switch 支持字串 String 型別了,同時 case 標簽必須為字串常量或字面量,
  • switch 陳述句可以擁有多個 case 陳述句,每個 case 后面跟一個要比較的值和冒號,
  • case的值資料型別必須與運算式的值的資料型別相同,而且只能是常量或者字面常量;case值必須唯一,如果值重復,則會產生編譯時錯誤,
  • 當變數的值與 case 陳述句的值相等時,那么 case 陳述句之后的陳述句開始執行,直到 break 陳述句出現才會跳出 switch 陳述句,
  • 當遇到 break 陳述句時,switch 陳述句終止,程式跳轉到 switch 陳述句后面的陳述句執行,case 陳述句不必須要包含 break 陳述句,如果沒有 break 陳述句出現,程式會繼續執行下一條 case 陳述句,直到出現 break 陳述句,
  • switch 陳述句可以包含一個 default 分支,該分支一般是 switch 陳述句的最后一個分支(可以在任何位置,但建議在最后一個),default 在沒有 case 陳述句的值和變數值相等的時候執行,default 分支不需要 break 陳述句,

switch case 執行時,一定會先進行匹配,匹配成功回傳當前 case 的值,再根據是否有 break,判斷是否繼續輸出,或是跳出判斷,

public class Test {
	public static void main(String[] args) {
		int score = 90;
		switch (score) {
		case 10:
			System.out.println("學神");
			break;
		case 9:
			System.out.println("成績為A");
			break;
		case 8:
			System.out.println("成績為B");
			break;
		case 7:
			System.out.println("成績為C");
			break;
		case 6:
			System.out.println("成績為D");
			break;
		default:
			System.out.println("成績為E");
			break;
		}
	}
}

九、回圈

在Java語言中,回圈用于重復執行一組指令/功能,Java中有三種主要的回圈結構:

  • for回圈
  • while回圈
  • do-while回圈

1.while回圈

// 列印1-10
public class Test {
	public static void main(String[] args) {
		int i = 1;
		// 只要布爾運算式(i<=10)為true,回圈就會一直執行下去,
		while (i <= 10) {
			System.out.println(i++);
		}
	}
}

2.do…while 回圈

對于 while 陳述句而言,如果不滿足條件,則不能進入回圈,但有時候我們需要即使不滿足條件,也至少執行一次,

do…while 回圈和 while 回圈相似,不同的是,do…while 回圈至少會執行一次,

public class Test {
	public static void main(String[] args) {
		int i = 1;
		do {
			System.out.println(i++);
		} while (i < 0);
	}
}

布爾運算式在回圈體的后面,所以陳述句塊在檢測布爾運算式之前已經執行了, 如果布爾運算式的值為 true,則陳述句塊一直執行,直到布爾運算式的值為 false,

3.for 回圈

for(初始化; 布爾運算式; 更新) {
    //代碼陳述句
}

關于 for 回圈有以下幾點說明:

  • 最先執行初始化步驟,可以宣告一種型別,但可初始化一個或多個回圈控制變數,也可以是空陳述句,
  • 然后,檢測布爾運算式的值,如果為 true,回圈體被執行,如果為false,回圈終止,開始執行回圈體后面的陳述句,
  • 執行一次回圈后,更新回圈控制變數,
  • 再次檢測布爾運算式,回圈執行上面的程序,
// 列印1-10
public class Test {
	public static void main(String args[]) {
		for (int i = 1; i <= 10; i++) {
			System.out.println(i);
		}
	}
}

Java5 引入了一種主要用于陣列的增強型 for 回圈,

for(宣告陳述句 : 運算式)
{
   //代碼句子
}

宣告陳述句:宣告新的區域變數,該變數的型別必須和陣列元素的型別匹配,其作用域限定在回圈陳述句塊,其值與此時陣列元素的值相等,

運算式:運算式是要訪問的陣列名,或者是回傳值為陣列的方法,

public class Test {
	public static void main(String args[]) {
		int[] numbers = { 10, 20, 30, 40, 50 };
		for (int number : numbers) {
			System.out.println(number);
		}
	}
}

4.break 關鍵字

break 主要用在回圈陳述句或者 switch 陳述句中,用來跳出整個陳述句塊,

break 跳出最里層的回圈,并且繼續執行該回圈下面的陳述句,

public class Test {
	public static void main(String args[]) {
		for (int i = 1; i <= 10; i++) {
			System.out.println(i);
			// 執行到i==5就停止
			if(i == 5){
				break;
			}
		}
	}
}

如果有兩層for回圈,我們想讓最外層的for停止怎么辦?

方案一:

public static void main(String args[]) {
	outCycle: for (int i = 0; i < 10; i++) {
		for (int j = 0; j < 10; j++) {
			if (j == i) {
				break outCycle;
			}
		}
	}
}

方案二:

public static void main(String args[]) {
	boolean outCycle = true;
	boolean innerCycel = true;

	for (int i = 0; i < 10 && outCycle; i++) {
		for (int j = 0; j < 10 && innerCycel; j++) {
			if (j == i) {
				outCycle = false;
			}
		}
	}
}

想要停止內層的for回圈,我們可以直接break或者把 innerCycel=false,停止外層的for回圈只需要把outCycle=false;

5.continue

continue 適用于任何回圈控制結構中,作用是讓程式立刻跳轉到下一次回圈的迭代,

在 for 回圈中,continue 陳述句使程式立即跳轉到更新陳述句,

在 while 或者 do…while 回圈中,程式立即跳轉到布爾運算式的判斷陳述句,

// 列印1-10
public class Test {
	public static void main(String args[]) {
		for (int i = 1; i <= 10; i++) {
			System.out.println(i);
			// 跳過i等于5的列印,其他的數字正常列印
			if(i == 5){
				break;
			}
		}
	}
}

?? 彩蛋

在這里插入圖片描述

「粉絲福利、三連送書 」

「 粉絲專屬福利(包郵送書2本,書單里5本書可任選一本) 」
在這里插入圖片描述

「 抽獎方式:截止到10月10日 14:00,留言獲贊最高的兩位同學,將獲得圖書一本,上述5本書可以任選一本 」

請添加圖片描述
Spring Boot 企業級應用開發實戰 - 京東圖書

Spring Boot 企業級應用開發實戰 - 當當圖書

作者:柳偉衛(英文名Way Lau),關注編程、系統架構、性能優化,在大型IT公司擔任過專案經理、架構師、高級開發顧問等職位,具有多年軟體開發管理及系統架構經驗,負責過多個大型分布式系統的設計與研發,參與了多個大型專案的微服務架構的技術改造,在實際作業中積累了大量的微服務架構經驗,

亮點:

  • 「 新 」,本書基于新的Spring Boot 2.0版本撰寫,深入淺出地講解了Spring與Spring Boot,
  • 「 實戰 」,跳脫純理論講述,案例貫穿全書,一步步講述使用Spring Boot開發企業系統的方法,讀者不僅能全面學到軟體開發技能,還能學到專案實戰經驗,
  • 「 全 」,彌補市面上有關 Spring Boot 學習資料的不足,重新撰寫整個教學案例,使讀者輕松脫離“Hello World”階段,向Spring Boot企業級快速應用開發躍遷,

「 沒中的小伙伴可以等下期,或者自行購買哈 」

Spring Boot 企業級應用開發實戰 - 京東圖書

Spring Boot 企業級應用開發實戰 - 當當圖書

億級流量Java高并發與網路編程實戰 - 京東圖書

億級流量Java高并發與網路編程實戰 - 當當圖書

Java高并發編程指南 - 京東圖書

Java高并發編程指南 - 當當圖書

Java核心技術及面試指南 - 京東圖書

Java核心技術及面試指南 - 當當圖書

Spring Cloud 微服務架構開發實戰 - 京東圖書

Spring Cloud 微服務架構開發實戰 - 當當圖書

參考文獻:
《Java核心技術卷I》
《Oracle Java tutorial》:https://docs.oracle.com/javase/tutorial/java/index.html

因為篇幅問題,面向物件、例外、反射、IO、集合等內容下篇文章發,大家可以持續關注,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/307230.html

標籤:java

上一篇:為了減少代碼復雜度,我將if-else升級為面向狀態編程

下一篇:阿里內部不外傳的 50 萬字 Java 面試手冊,首次開放,一天遭狂轉 10w 次

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more