'想學習Java,這些Java基本語法和代碼規範你得提前搞懂'

Java 算術 python一點通 2019-07-31
"

Java語言基本語法

一、標識符和關鍵字

  1. 標識符
  • 在java語言中,用來標誌類名、對象名、變量名、方法名、類型名、數組名、包名的有效字符序列,稱為“標識符”;
  • 標識符由字母、數字、下劃線、美元符號組成,且第一個字符不能是數字;
  • java語言區分大小寫;
  • 標誌符命名規則:類名首字母大寫,變量名和方法名採用駝峰標誌法,常量全大寫,多個單詞之間用“_”隔開,包名全小寫;
  1. 關鍵字
  • 在java語言中,有一些專門的詞彙已經被賦予了特殊的含義,不能再使用這些詞彙來命名標識符,這些專有詞彙,稱為“關鍵字”;
  • java有50個關鍵字和3個保留字,均不能用來命名標識符;
"

Java語言基本語法

一、標識符和關鍵字

  1. 標識符
  • 在java語言中,用來標誌類名、對象名、變量名、方法名、類型名、數組名、包名的有效字符序列,稱為“標識符”;
  • 標識符由字母、數字、下劃線、美元符號組成,且第一個字符不能是數字;
  • java語言區分大小寫;
  • 標誌符命名規則:類名首字母大寫,變量名和方法名採用駝峰標誌法,常量全大寫,多個單詞之間用“_”隔開,包名全小寫;
  1. 關鍵字
  • 在java語言中,有一些專門的詞彙已經被賦予了特殊的含義,不能再使用這些詞彙來命名標識符,這些專有詞彙,稱為“關鍵字”;
  • java有50個關鍵字和3個保留字,均不能用來命名標識符;
想學習Java,這些Java基本語法和代碼規範你得提前搞懂

  • true、false、null不是關鍵字,是保留字,但是仍不能用來命名標識符,保留字是java預留的關鍵字,在以後的升級版本中可能會作為關鍵字;

二、基本數據類型

"

Java語言基本語法

一、標識符和關鍵字

  1. 標識符
  • 在java語言中,用來標誌類名、對象名、變量名、方法名、類型名、數組名、包名的有效字符序列,稱為“標識符”;
  • 標識符由字母、數字、下劃線、美元符號組成,且第一個字符不能是數字;
  • java語言區分大小寫;
  • 標誌符命名規則:類名首字母大寫,變量名和方法名採用駝峰標誌法,常量全大寫,多個單詞之間用“_”隔開,包名全小寫;
  1. 關鍵字
  • 在java語言中,有一些專門的詞彙已經被賦予了特殊的含義,不能再使用這些詞彙來命名標識符,這些專有詞彙,稱為“關鍵字”;
  • java有50個關鍵字和3個保留字,均不能用來命名標識符;
想學習Java,這些Java基本語法和代碼規範你得提前搞懂

  • true、false、null不是關鍵字,是保留字,但是仍不能用來命名標識符,保留字是java預留的關鍵字,在以後的升級版本中可能會作為關鍵字;

二、基本數據類型

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

1. 整數類型(int為默認類型)

"

Java語言基本語法

一、標識符和關鍵字

  1. 標識符
  • 在java語言中,用來標誌類名、對象名、變量名、方法名、類型名、數組名、包名的有效字符序列,稱為“標識符”;
  • 標識符由字母、數字、下劃線、美元符號組成,且第一個字符不能是數字;
  • java語言區分大小寫;
  • 標誌符命名規則:類名首字母大寫,變量名和方法名採用駝峰標誌法,常量全大寫,多個單詞之間用“_”隔開,包名全小寫;
  1. 關鍵字
  • 在java語言中,有一些專門的詞彙已經被賦予了特殊的含義,不能再使用這些詞彙來命名標識符,這些專有詞彙,稱為“關鍵字”;
  • java有50個關鍵字和3個保留字,均不能用來命名標識符;
想學習Java,這些Java基本語法和代碼規範你得提前搞懂

  • true、false、null不是關鍵字,是保留字,但是仍不能用來命名標識符,保留字是java預留的關鍵字,在以後的升級版本中可能會作為關鍵字;

二、基本數據類型

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

1. 整數類型(int為默認類型)

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

2. 浮點類型(double為默認類型)

"

Java語言基本語法

一、標識符和關鍵字

  1. 標識符
  • 在java語言中,用來標誌類名、對象名、變量名、方法名、類型名、數組名、包名的有效字符序列,稱為“標識符”;
  • 標識符由字母、數字、下劃線、美元符號組成,且第一個字符不能是數字;
  • java語言區分大小寫;
  • 標誌符命名規則:類名首字母大寫,變量名和方法名採用駝峰標誌法,常量全大寫,多個單詞之間用“_”隔開,包名全小寫;
  1. 關鍵字
  • 在java語言中,有一些專門的詞彙已經被賦予了特殊的含義,不能再使用這些詞彙來命名標識符,這些專有詞彙,稱為“關鍵字”;
  • java有50個關鍵字和3個保留字,均不能用來命名標識符;
想學習Java,這些Java基本語法和代碼規範你得提前搞懂

  • true、false、null不是關鍵字,是保留字,但是仍不能用來命名標識符,保留字是java預留的關鍵字,在以後的升級版本中可能會作為關鍵字;

二、基本數據類型

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

1. 整數類型(int為默認類型)

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

2. 浮點類型(double為默認類型)

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

  • 在給float類型的變量賦值時,如果賦的值有小數部分則一定要在末尾加上“F”或“f”;

3. 字符類型(2字節)

  • char ch = 'a';
  • 有些字符不能通過鍵盤輸入到程序當中,這時就需要使用到轉義字符;
"

Java語言基本語法

一、標識符和關鍵字

  1. 標識符
  • 在java語言中,用來標誌類名、對象名、變量名、方法名、類型名、數組名、包名的有效字符序列,稱為“標識符”;
  • 標識符由字母、數字、下劃線、美元符號組成,且第一個字符不能是數字;
  • java語言區分大小寫;
  • 標誌符命名規則:類名首字母大寫,變量名和方法名採用駝峰標誌法,常量全大寫,多個單詞之間用“_”隔開,包名全小寫;
  1. 關鍵字
  • 在java語言中,有一些專門的詞彙已經被賦予了特殊的含義,不能再使用這些詞彙來命名標識符,這些專有詞彙,稱為“關鍵字”;
  • java有50個關鍵字和3個保留字,均不能用來命名標識符;
想學習Java,這些Java基本語法和代碼規範你得提前搞懂

  • true、false、null不是關鍵字,是保留字,但是仍不能用來命名標識符,保留字是java預留的關鍵字,在以後的升級版本中可能會作為關鍵字;

二、基本數據類型

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

1. 整數類型(int為默認類型)

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

2. 浮點類型(double為默認類型)

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

  • 在給float類型的變量賦值時,如果賦的值有小數部分則一定要在末尾加上“F”或“f”;

3. 字符類型(2字節)

  • char ch = 'a';
  • 有些字符不能通過鍵盤輸入到程序當中,這時就需要使用到轉義字符;
想學習Java,這些Java基本語法和代碼規範你得提前搞懂

4. 布爾類型(1字節)

  • boolean flag = true;

5. 默認值

  • 數值變量:0;
  • 字符變量:‘\\0’;
  • 布爾變量:false;
  • 引用數據類型:null;

6. 不同數據類型之間的轉換

  • 自動類型轉換(低 到 高)
"

Java語言基本語法

一、標識符和關鍵字

  1. 標識符
  • 在java語言中,用來標誌類名、對象名、變量名、方法名、類型名、數組名、包名的有效字符序列,稱為“標識符”;
  • 標識符由字母、數字、下劃線、美元符號組成,且第一個字符不能是數字;
  • java語言區分大小寫;
  • 標誌符命名規則:類名首字母大寫,變量名和方法名採用駝峰標誌法,常量全大寫,多個單詞之間用“_”隔開,包名全小寫;
  1. 關鍵字
  • 在java語言中,有一些專門的詞彙已經被賦予了特殊的含義,不能再使用這些詞彙來命名標識符,這些專有詞彙,稱為“關鍵字”;
  • java有50個關鍵字和3個保留字,均不能用來命名標識符;
想學習Java,這些Java基本語法和代碼規範你得提前搞懂

  • true、false、null不是關鍵字,是保留字,但是仍不能用來命名標識符,保留字是java預留的關鍵字,在以後的升級版本中可能會作為關鍵字;

二、基本數據類型

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

1. 整數類型(int為默認類型)

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

2. 浮點類型(double為默認類型)

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

  • 在給float類型的變量賦值時,如果賦的值有小數部分則一定要在末尾加上“F”或“f”;

3. 字符類型(2字節)

  • char ch = 'a';
  • 有些字符不能通過鍵盤輸入到程序當中,這時就需要使用到轉義字符;
想學習Java,這些Java基本語法和代碼規範你得提前搞懂

4. 布爾類型(1字節)

  • boolean flag = true;

5. 默認值

  • 數值變量:0;
  • 字符變量:‘\\0’;
  • 布爾變量:false;
  • 引用數據類型:null;

6. 不同數據類型之間的轉換

  • 自動類型轉換(低 到 高)
想學習Java,這些Java基本語法和代碼規範你得提前搞懂

  • 強制類型轉換(高 到 低)

public class Test003 {

public static void main(String[] args) {

byte b = 100;

int i = 22;

float f = 78.98f;

int res = b + i + (int)f; //此處對f使用了強制類型轉換(int)f,轉換後的值為78

System.out.println("res: "+res); //res: 200

}

}

三、運算符與表達式

1. 算術運算符

"

Java語言基本語法

一、標識符和關鍵字

  1. 標識符
  • 在java語言中,用來標誌類名、對象名、變量名、方法名、類型名、數組名、包名的有效字符序列,稱為“標識符”;
  • 標識符由字母、數字、下劃線、美元符號組成,且第一個字符不能是數字;
  • java語言區分大小寫;
  • 標誌符命名規則:類名首字母大寫,變量名和方法名採用駝峰標誌法,常量全大寫,多個單詞之間用“_”隔開,包名全小寫;
  1. 關鍵字
  • 在java語言中,有一些專門的詞彙已經被賦予了特殊的含義,不能再使用這些詞彙來命名標識符,這些專有詞彙,稱為“關鍵字”;
  • java有50個關鍵字和3個保留字,均不能用來命名標識符;
想學習Java,這些Java基本語法和代碼規範你得提前搞懂

  • true、false、null不是關鍵字,是保留字,但是仍不能用來命名標識符,保留字是java預留的關鍵字,在以後的升級版本中可能會作為關鍵字;

二、基本數據類型

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

1. 整數類型(int為默認類型)

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

2. 浮點類型(double為默認類型)

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

  • 在給float類型的變量賦值時,如果賦的值有小數部分則一定要在末尾加上“F”或“f”;

3. 字符類型(2字節)

  • char ch = 'a';
  • 有些字符不能通過鍵盤輸入到程序當中,這時就需要使用到轉義字符;
想學習Java,這些Java基本語法和代碼規範你得提前搞懂

4. 布爾類型(1字節)

  • boolean flag = true;

5. 默認值

  • 數值變量:0;
  • 字符變量:‘\\0’;
  • 布爾變量:false;
  • 引用數據類型:null;

6. 不同數據類型之間的轉換

  • 自動類型轉換(低 到 高)
想學習Java,這些Java基本語法和代碼規範你得提前搞懂

  • 強制類型轉換(高 到 低)

public class Test003 {

public static void main(String[] args) {

byte b = 100;

int i = 22;

float f = 78.98f;

int res = b + i + (int)f; //此處對f使用了強制類型轉換(int)f,轉換後的值為78

System.out.println("res: "+res); //res: 200

}

}

三、運算符與表達式

1. 算術運算符

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

public class Test003 {

public static void main(String[] args) {

int i = 5;

System.out.println(0/i); //0

System.out.println(0%i); //0

System.out.println(i/0); //除數不能為零,報異常java.lang.ArithmeticException

System.out.println(i%0); //除數不能為零,報異常java.lang.ArithmeticException

}

}

2. 賦值運算符

"

Java語言基本語法

一、標識符和關鍵字

  1. 標識符
  • 在java語言中,用來標誌類名、對象名、變量名、方法名、類型名、數組名、包名的有效字符序列,稱為“標識符”;
  • 標識符由字母、數字、下劃線、美元符號組成,且第一個字符不能是數字;
  • java語言區分大小寫;
  • 標誌符命名規則:類名首字母大寫,變量名和方法名採用駝峰標誌法,常量全大寫,多個單詞之間用“_”隔開,包名全小寫;
  1. 關鍵字
  • 在java語言中,有一些專門的詞彙已經被賦予了特殊的含義,不能再使用這些詞彙來命名標識符,這些專有詞彙,稱為“關鍵字”;
  • java有50個關鍵字和3個保留字,均不能用來命名標識符;
想學習Java,這些Java基本語法和代碼規範你得提前搞懂

  • true、false、null不是關鍵字,是保留字,但是仍不能用來命名標識符,保留字是java預留的關鍵字,在以後的升級版本中可能會作為關鍵字;

二、基本數據類型

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

1. 整數類型(int為默認類型)

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

2. 浮點類型(double為默認類型)

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

  • 在給float類型的變量賦值時,如果賦的值有小數部分則一定要在末尾加上“F”或“f”;

3. 字符類型(2字節)

  • char ch = 'a';
  • 有些字符不能通過鍵盤輸入到程序當中,這時就需要使用到轉義字符;
想學習Java,這些Java基本語法和代碼規範你得提前搞懂

4. 布爾類型(1字節)

  • boolean flag = true;

5. 默認值

  • 數值變量:0;
  • 字符變量:‘\\0’;
  • 布爾變量:false;
  • 引用數據類型:null;

6. 不同數據類型之間的轉換

  • 自動類型轉換(低 到 高)
想學習Java,這些Java基本語法和代碼規範你得提前搞懂

  • 強制類型轉換(高 到 低)

public class Test003 {

public static void main(String[] args) {

byte b = 100;

int i = 22;

float f = 78.98f;

int res = b + i + (int)f; //此處對f使用了強制類型轉換(int)f,轉換後的值為78

System.out.println("res: "+res); //res: 200

}

}

三、運算符與表達式

1. 算術運算符

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

public class Test003 {

public static void main(String[] args) {

int i = 5;

System.out.println(0/i); //0

System.out.println(0%i); //0

System.out.println(i/0); //除數不能為零,報異常java.lang.ArithmeticException

System.out.println(i%0); //除數不能為零,報異常java.lang.ArithmeticException

}

}

2. 賦值運算符

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

3. 自增自減運算符(++,--)

public class Test003 {

public static void main(String[] args) {

int i = 5;

System.out.println(i++); //5

System.out.println(++i); //7

System.out.println(i); //7

System.out.println(--i); //6

System.out.println(i--); //6

System.out.println(i); //5

}

}

4. 關係運算符

"

Java語言基本語法

一、標識符和關鍵字

  1. 標識符
  • 在java語言中,用來標誌類名、對象名、變量名、方法名、類型名、數組名、包名的有效字符序列,稱為“標識符”;
  • 標識符由字母、數字、下劃線、美元符號組成,且第一個字符不能是數字;
  • java語言區分大小寫;
  • 標誌符命名規則:類名首字母大寫,變量名和方法名採用駝峰標誌法,常量全大寫,多個單詞之間用“_”隔開,包名全小寫;
  1. 關鍵字
  • 在java語言中,有一些專門的詞彙已經被賦予了特殊的含義,不能再使用這些詞彙來命名標識符,這些專有詞彙,稱為“關鍵字”;
  • java有50個關鍵字和3個保留字,均不能用來命名標識符;
想學習Java,這些Java基本語法和代碼規範你得提前搞懂

  • true、false、null不是關鍵字,是保留字,但是仍不能用來命名標識符,保留字是java預留的關鍵字,在以後的升級版本中可能會作為關鍵字;

二、基本數據類型

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

1. 整數類型(int為默認類型)

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

2. 浮點類型(double為默認類型)

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

  • 在給float類型的變量賦值時,如果賦的值有小數部分則一定要在末尾加上“F”或“f”;

3. 字符類型(2字節)

  • char ch = 'a';
  • 有些字符不能通過鍵盤輸入到程序當中,這時就需要使用到轉義字符;
想學習Java,這些Java基本語法和代碼規範你得提前搞懂

4. 布爾類型(1字節)

  • boolean flag = true;

5. 默認值

  • 數值變量:0;
  • 字符變量:‘\\0’;
  • 布爾變量:false;
  • 引用數據類型:null;

6. 不同數據類型之間的轉換

  • 自動類型轉換(低 到 高)
想學習Java,這些Java基本語法和代碼規範你得提前搞懂

  • 強制類型轉換(高 到 低)

public class Test003 {

public static void main(String[] args) {

byte b = 100;

int i = 22;

float f = 78.98f;

int res = b + i + (int)f; //此處對f使用了強制類型轉換(int)f,轉換後的值為78

System.out.println("res: "+res); //res: 200

}

}

三、運算符與表達式

1. 算術運算符

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

public class Test003 {

public static void main(String[] args) {

int i = 5;

System.out.println(0/i); //0

System.out.println(0%i); //0

System.out.println(i/0); //除數不能為零,報異常java.lang.ArithmeticException

System.out.println(i%0); //除數不能為零,報異常java.lang.ArithmeticException

}

}

2. 賦值運算符

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

3. 自增自減運算符(++,--)

public class Test003 {

public static void main(String[] args) {

int i = 5;

System.out.println(i++); //5

System.out.println(++i); //7

System.out.println(i); //7

System.out.println(--i); //6

System.out.println(i--); //6

System.out.println(i); //5

}

}

4. 關係運算符

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

5. 邏輯運算符

public class Test003 {

public static void main(String[] args) {

boolean t = true;

boolean f = false;

System.out.println(t && f); //false,短路與運算符,若運算符左側為false則不計算右側的表達式

System.out.println(t || f); //true,短路或運算符,若運算符左側為true則不計算右側的表達式

System.out.println(t & f); //false,與運算符,不管左側是否為false都要計算右側的表達式

System.out.println(t | f); //true,或運算符,不管左側是否為true都要計算右側的表達式

System.out.println(t ^ f); //true,異或運算符,只要左右兩側不相同則為true,反之為false

System.out.println(!f); //true,取反運算符

}

}

6. 位運算符

public class Test003 {

public static void main(String[] args) {

//在位運算符中1相當於true,0相當於false

int b1 = 6; //二進制為00000000 00000000 00000000 00000110

int b2 = 11; //二進制為00000000 00000000 00000000 00001011

System.out.println(b1 & b2); //按位與運算符,二進制為00000000 00000000 00000000 00000010,結果為2

System.out.println(b1 | b2); //按位或運算符,二進制為00000000 00000000 00000000 00001111,結果為15

System.out.println(b1 ^ b2); //按位異或運算符,二進制為00000000 00000000 00000000 00001101,結果為13

System.out.println(~b1); //按位取反運算符,二進制為11111111 11111111 11111111 11111001,結果為-7

System.out.println(b1 << 2); //左移位運算符,二進制為00000000 00000000 00000000 00011000,結果為24

int b3 = -14; //二進制為11111111 11111111 11111111 11110010

System.out.println(b3 >> 2); //帶符號右移位運算符,二進制為11111111 11111111 11111111 11111100,結果為-4

System.out.println(b3 >>> 2); //無符號右移位運算符,二進制為00111111 11111111 11111111 11111100,結果為1073741820

}

}

7. 三元運算符

public class Test003 {

public static void main(String[] args) {

int a = 1;

int b = 2;

int c = 4;

int res = c==a+b?++a:c>a+b?++b:++c; //三元運算符 (表達式)?(值1):(值2),若表達式為true則取值1,反之取值2

System.out.println(res); //++b,結果為3

}

}

8. 運算符優先級

"

Java語言基本語法

一、標識符和關鍵字

  1. 標識符
  • 在java語言中,用來標誌類名、對象名、變量名、方法名、類型名、數組名、包名的有效字符序列,稱為“標識符”;
  • 標識符由字母、數字、下劃線、美元符號組成,且第一個字符不能是數字;
  • java語言區分大小寫;
  • 標誌符命名規則:類名首字母大寫,變量名和方法名採用駝峰標誌法,常量全大寫,多個單詞之間用“_”隔開,包名全小寫;
  1. 關鍵字
  • 在java語言中,有一些專門的詞彙已經被賦予了特殊的含義,不能再使用這些詞彙來命名標識符,這些專有詞彙,稱為“關鍵字”;
  • java有50個關鍵字和3個保留字,均不能用來命名標識符;
想學習Java,這些Java基本語法和代碼規範你得提前搞懂

  • true、false、null不是關鍵字,是保留字,但是仍不能用來命名標識符,保留字是java預留的關鍵字,在以後的升級版本中可能會作為關鍵字;

二、基本數據類型

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

1. 整數類型(int為默認類型)

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

2. 浮點類型(double為默認類型)

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

  • 在給float類型的變量賦值時,如果賦的值有小數部分則一定要在末尾加上“F”或“f”;

3. 字符類型(2字節)

  • char ch = 'a';
  • 有些字符不能通過鍵盤輸入到程序當中,這時就需要使用到轉義字符;
想學習Java,這些Java基本語法和代碼規範你得提前搞懂

4. 布爾類型(1字節)

  • boolean flag = true;

5. 默認值

  • 數值變量:0;
  • 字符變量:‘\\0’;
  • 布爾變量:false;
  • 引用數據類型:null;

6. 不同數據類型之間的轉換

  • 自動類型轉換(低 到 高)
想學習Java,這些Java基本語法和代碼規範你得提前搞懂

  • 強制類型轉換(高 到 低)

public class Test003 {

public static void main(String[] args) {

byte b = 100;

int i = 22;

float f = 78.98f;

int res = b + i + (int)f; //此處對f使用了強制類型轉換(int)f,轉換後的值為78

System.out.println("res: "+res); //res: 200

}

}

三、運算符與表達式

1. 算術運算符

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

public class Test003 {

public static void main(String[] args) {

int i = 5;

System.out.println(0/i); //0

System.out.println(0%i); //0

System.out.println(i/0); //除數不能為零,報異常java.lang.ArithmeticException

System.out.println(i%0); //除數不能為零,報異常java.lang.ArithmeticException

}

}

2. 賦值運算符

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

3. 自增自減運算符(++,--)

public class Test003 {

public static void main(String[] args) {

int i = 5;

System.out.println(i++); //5

System.out.println(++i); //7

System.out.println(i); //7

System.out.println(--i); //6

System.out.println(i--); //6

System.out.println(i); //5

}

}

4. 關係運算符

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

5. 邏輯運算符

public class Test003 {

public static void main(String[] args) {

boolean t = true;

boolean f = false;

System.out.println(t && f); //false,短路與運算符,若運算符左側為false則不計算右側的表達式

System.out.println(t || f); //true,短路或運算符,若運算符左側為true則不計算右側的表達式

System.out.println(t & f); //false,與運算符,不管左側是否為false都要計算右側的表達式

System.out.println(t | f); //true,或運算符,不管左側是否為true都要計算右側的表達式

System.out.println(t ^ f); //true,異或運算符,只要左右兩側不相同則為true,反之為false

System.out.println(!f); //true,取反運算符

}

}

6. 位運算符

public class Test003 {

public static void main(String[] args) {

//在位運算符中1相當於true,0相當於false

int b1 = 6; //二進制為00000000 00000000 00000000 00000110

int b2 = 11; //二進制為00000000 00000000 00000000 00001011

System.out.println(b1 & b2); //按位與運算符,二進制為00000000 00000000 00000000 00000010,結果為2

System.out.println(b1 | b2); //按位或運算符,二進制為00000000 00000000 00000000 00001111,結果為15

System.out.println(b1 ^ b2); //按位異或運算符,二進制為00000000 00000000 00000000 00001101,結果為13

System.out.println(~b1); //按位取反運算符,二進制為11111111 11111111 11111111 11111001,結果為-7

System.out.println(b1 << 2); //左移位運算符,二進制為00000000 00000000 00000000 00011000,結果為24

int b3 = -14; //二進制為11111111 11111111 11111111 11110010

System.out.println(b3 >> 2); //帶符號右移位運算符,二進制為11111111 11111111 11111111 11111100,結果為-4

System.out.println(b3 >>> 2); //無符號右移位運算符,二進制為00111111 11111111 11111111 11111100,結果為1073741820

}

}

7. 三元運算符

public class Test003 {

public static void main(String[] args) {

int a = 1;

int b = 2;

int c = 4;

int res = c==a+b?++a:c>a+b?++b:++c; //三元運算符 (表達式)?(值1):(值2),若表達式為true則取值1,反之取值2

System.out.println(res); //++b,結果為3

}

}

8. 運算符優先級

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

四、數組

1. 一維數組

public class Test003 {

public static void main(String[] args) {

int[] i; //聲明一個整型的一維數組變量

int ii[]; //聲明一個整型的一維數組變量

i = new int[5]; //創建一個長度為5的一維數組對象,並將變量i指向該對象

float[] f = new float[5]; //直接創建一個長度為5的單精度浮點型一維數組對象,並將變量f指向該對象

double[] d = {1, 2, 3.4, 4.5}; //直接初始化一個一維數組元素

System.out.println(d[3]); //通過數組下標來獲取數組內的元素,數組下標從0開始,結果為4.5

System.out.println(f[0]); //當創建出一個數組對象時,該對象內的數組元素為該數據類型的默認值,所以此處結果為0.0

//System.out.println(i[5]); //當通過數組下標來獲取數組內元素時,[]內的值>=數組長度則報異常java.lang.ArrayIndexOutOfBoundsException(數組下標越界)

//System.out.println(ii[0]); //若一個數組變量只聲明而未指向某一個具體的數組對象時,編譯出錯

System.out.println(d.length); //得到該數組的長度,結果為4

}

}

2. 二維數組

public class Test003 {

public static void main(String[] args) {

int[][] i; //聲明一個整型的二維數組變量

int ii[][]; //聲明一個整型的二維數組變量

int[] iii[]; //聲明一個整型的二維數組變量

i = new int[5][2]; //創建一個長度為5的二維數組對象,並將變量i指向該對象

float[][] f = new float[5][2]; //直接創建一個長度為5的單精度浮點型二維數組對象,並將變量f指向該對象

double[][] d = {{1}, {2,3}, {4,5,6}, {7,8,9,10}}; //直接初始化一個二維數組元素

System.out.println(d[3][1]); //通過數組下標來獲取數組內的元素,數組下標從0開始,結果為8

System.out.println(f[0][0]); //當創建出二個數組對象時,該對象內的數組元素為該數據類型的默認值,所以此處結果為0.0

//System.out.println(i[5][0]); //當通過數組下標來獲取數組內元素時,[]內的值>=數組長度則報異常java.lang.ArrayIndexOutOfBoundsException(數組下標越界)

//System.out.println(ii[0][0]); //若一個數組變量只聲明而未指向某一個具體的數組對象時,編譯出錯

System.out.println(d.length); //得到該數組的長度,結果為4

System.out.println(d[2].length); //得到二位數組內的下標為2的那個一維數組的長度

}

}

五、流程控制語句(if,switch,for,while,do...while)

1. 條件分支語句

public class Test003 {

public static void main(String[] args) {

int[] score = new int[5];

score[0] = -7;

score[1] = 65;

score[2] = 80;

score[3] = 90;

score[4] = 59;

for(int i=0; i<score.length; i++) {

if(score[i]>=0 && score[i]<60) {

System.out.println("不及格");

}else if(score[i]>=60 && score[i]<80) {

System.out.println("及格");

}else if(score[i]>=80 && score[i]<90) {

System.out.println("良");

}else if(score[i]>=90 && score[i]<100) {

System.out.println("優");

}else {

System.out.println("成績異常");

}

}

char ch = 'a';

switch(ch) { //switch括號內只支持 byte,short,int,char,enum五種數據類型,但是JDK1.7版本增加了String類型,所以相對於JDK1.7而言就是六種了

case 'A': //case為switch語句的入口,break為出口,從入口開始執行,直到遇到出口或代碼執行完畢才結束

case 'a':

System.out.println("優");

break;

case 'B':

case 'b':

System.out.println("良");

break;

case 'C':

case 'c':

System.out.println("及格");

break;

default: //若上述條件均不匹配,則進default開始執行語句

System.out.println("不及格");

}

}

}

2. 循環語句

public class Test003 {

public static void main(String[] args) {

int res = 0;

out: //out是一個標號,告訴java從哪裡開始執行程序

for(int i=1; i<=10; i++) {

if(i==3) continue out; //continue終止本次循環,執行下次循環

if(i==5) break out; //break跳出循環

res = res + i;

}

System.out.println(res); //結果為1+2+4=7

int res2 = 0;

int i = 1;

in:

do{

if(i==3) continue in; //continue終止本次循環,執行下次循環

if(i==5) break in; //break跳出循環

res2 = res2 + i;

i++;

}while(i<=10);

System.out.println(res2);

}

}

Java代碼規範

一、前言

本文參考《阿里巴巴Java開發手冊》,這本書主要定義了一些代碼的規範以及一些注意事項。我只根據我自己的不足,摘錄了一些內容,方便以後查閱。

二、讀書筆記

  • 命名

1、代碼中的命名均不能以下劃線或美元符號開始,也不能以下劃線或美元符號結束。

2、常量命名全部大寫,單詞間用下劃線隔開,力求語義表達完整清楚,不要嫌名字長。

3、抽象類命名使用 Abstract 或 Base 開頭; 異常類命名使用 Exception 結尾; 測試類命名以它要測試的類的名稱開始,以 Test 結尾。

4、中括號是數組類型的一部分,數組定義如下: String[] args;

5、POJO 類中布爾類型的變量,都不要加 is,否則部分框架解析會引起序列化錯誤。

反例: 定義為基本數據類型 Boolean isDeleted; 的屬性,它的方法也是 isDeleted()。 RPC框架在反向解析的時候, “以為”對應的屬性名稱是 deleted,導致屬性獲取不到,進而拋出異常。

6、包名統一使用小寫,點分隔符之間有且僅有一個自然語義的英語單詞。包名統一使用單數形式,但是類名如果有複數含義,類名可以使用複數形式。

7、如果使用到了設計模式,建議在類名中體現出具體模式。有利於閱讀者快速理解架構設計思想。

8、接口類中的方法和屬性不要加任何修飾符號(public 也不要加) ,保持代碼的簡潔性,並加上有效的 Javadoc 註釋。儘量不要在接口裡定義變量,如果一定要定義變量,肯定是與接口方法相關,並且是整個應用的基礎常量。

9、枚舉類名建議帶上 Enum 後綴,枚舉成員名稱需要全大寫,單詞間用下劃線隔開。

說明: 枚舉其實就是特殊的常量類,且構造方法默認強制為私有。

正例: 枚舉名字: DealStatusEnum, 成員名稱: SUCCESS / UNKOWN_REASON。

10、各層命名規約:

A) Service/DAO 層方法命名規約

1) 獲取單個對象的方法用 get 做前綴。

2) 獲取多個對象的方法用 list 做前綴。

3) 獲取統計值的方法用 count 做前綴。

4) 插入的方法用 save(推薦) 或 insert 做前綴。

5) 刪除的方法用 remove(推薦) 或 delete 做前綴。

6) 修改的方法用 update 做前綴。

B) 領域模型命名規約

1) 數據對象: xxxDO, xxx 即為數據表名。

2) 數據傳輸對象: xxxDTO, xxx 為業務領域相關的名稱。

3) 展示對象: xxxVO, xxx 一般為網頁名稱。

4) POJO 是 DO/DTO/BO/VO 的統稱,禁止命名成 xxxPOJO。

  • 常量定義

1、不允許任何未經定義的常量直接出現在代碼中。

反例: String key = "Id#taobao_" + tradeId;

cache.put(key, value);

2、long 或者 Long 初始賦值時,必須使用大寫的 L,不能是小寫的 l,小寫容易跟數字1 混淆,造成誤解。

3、不要使用一個常量類維護所有常量,應該按常量功能進行歸類,分開維護。如:緩存相關的常量放在類: CacheConsts 下; 系統配置相關的常量放在類: ConfigConsts 下。

  • OOP規約

1、避免通過一個類的對象引用訪問此類的靜態變量或靜態方法,無謂增加編譯器解析成本,直接用類名來訪問即可。

2、外部正在調用或者二方庫依賴的接口,不允許修改方法簽名,避免對接口調用方產生影響。接口過時必須加@Deprecated 註解,並清晰地說明採用的新接口或者新服務是什麼。

3、不能使用過時的類或方法。

4、Object 的 equals 方法容易拋空指針異常,應使用常量或確定有值的對象來調用

equals

正例: "test".equals(object);

反例: object.equals("test");

5、所有的相同類型的包裝類對象之間值的比較,全部使用 equals 方法比較。對於 Integer var = ? 在-128 至 127 範圍內的賦值, Integer 對象是在IntegerCache.cache 產生,會複用已有對象,這個區間內的 Integer 值可以直接使用==進行判斷,但是這個區間之外的所有數據,都會在堆上產生,並不會複用已有對象,這是一個大坑,推薦使用 equals 方法進行判斷。

6、關於基本數據類型與包裝數據類型的使用標準如下:

1) 【強制】 所有的 POJO 類屬性必須使用包裝數據類

2) 【強制】 RPC 方法的返回值和參數必須使用包裝數

3) 【推薦】 所有的局部變量使用基本數據類型。

說明:用基本數據類型數據默認值是0,而包裝數據類型默認值是null,數據庫的查詢結果可能為null,因為自動拆箱,用基本數據類型接收有NPE風險。

7、定義 DO/DTO/VO 等 POJO 類時,不要設定任何屬性默認值(在數據提取時並沒有置入具體值,在更新其它字段時又附帶更新了此字段,導致創建時間被修改成當前時間。)

8、序列化類新增屬性時,請不要修改 serialVersionUID 字段,避免反序列失敗; 如果完全不兼容升級,避免反序列化混亂,那麼請修改 serialVersionUID 值。注意 serialVersionUID 不一致會拋出序列化運行時異常。

9、構造方法裡面禁止加入任何業務邏輯,如果有初始化邏輯,請放在 init 方法中。

10、類內方法定義順序依次是:公有方法或保護方法 > 私有方法 > getter/setter方法。

11、循環體內,字符串的連接方式,使用 StringBuilder 的 append 方法進行擴展。

12、慎用 Object 的 clone 方法來拷貝對象。對象的 clone 方法默認是淺拷貝,若想實現深拷貝需要重寫 clone 方法實現屬性對象的拷貝。

13、工具類不允許有 public 或 default 構造方法。

  • 集合處理

1、ArrayList的subList結果不可強轉成ArrayList,否則會拋出 ClassCastException異常: java.util.RandomAccessSubList cannot be cast to java.util.ArrayList。subList 返回的是 ArrayList 的內部類 SubList,並不是 ArrayList ,而是ArrayList 的一個視圖,對於 SubList 子列表的所有操作最終會反映到原列表上。

2、在 subList 場景中, 高度注意對原集合元素個數的修改,會導致子列表的遍歷、增加、刪除均產生 ConcurrentModificationException 異常。

3、使用集合轉數組的方法,必須使用集合的 toArray(T[] array),傳入的是類型完全一樣的數組,大小就是 list.size()。

說明: 使用 toArray 帶參方法,入參分配的數組空間不夠大時, toArray 方法內部將重新分配內存空間,並返回新數組地址; 如果數組元素大於實際所需,下標為[ list.size() ]的數組元素將被置為 null,其它數組元素保持原值,因此最好將方法入參數組大小定義與集合元素個數一致。

正例:

List<String> list = new ArrayList<String>(2);

list.add("guan");

list.add("bao");

String[] array = new String[list.size()];

array = list.toArray(array);

反例: 直接使用 toArray 無參方法存在問題,此方法返回值只能是 Object[]類,若強轉其它類型數組將出現 ClassCastException 錯誤

4、使用工具類 Arrays.asList()把數組轉換成集合時,不能使用其修改集合相關的方法,它的 add/remove/clear 方法會拋出 UnsupportedOperationException 異常。

說明: asList 的返回對象是一個 Arrays 內部類,並沒有實現集合的修改方法。Arrays.asList體現的是適配器模式,只是轉換接口,後臺的數據仍是數組。

5、泛型通配符<? extends T>來接收返回的數據,此寫法的泛型集合不能使用 add 方法, 而<? super T>不能使用 get 方法,做為接口調用賦值時易出錯。

說明: 擴展說一下 PECS(Producer Extends Consumer Super)原則: 1) 頻繁往外讀取內容的,適合用上界 Extends。 2) 經常往裡插入的,適合用下界 Super。

6、不要在 foreach 循環裡進行元素的 remove/add 操作。 remove 元素請使用 Iterator方式,如果併發操作,需要對 Iterator 對象加鎖。

正例:

Iterator<String> it = a.iterator();

while (it.hasNext()) {

String temp = it.next();

if (刪除元素的條件) {

it.remove();

}

}

反例:

List<String> a = new ArrayList<String>();

a.add("1");

a.add("2");

for (String temp : a) {

if ("1".equals(temp)) {

a.remove(temp);

}

}

7、集合初始化時, 指定集合初始值大小。

說明: HashMap 使用 HashMap(int initialCapacity) 初始化,

正例:initialCapacity = (需要存儲的元素個數 / 負載因子) + 1。注意負載因子(即 loaderfactor) 默認為 0.75, 如果暫時無法確定初始值大小, 請設置為 16。

9、使用 entrySet 遍歷 Map 類集合 KV,而不是 keySet 方式進行遍歷。

說明: keySet 其實是遍歷了 2 次,一次是轉為 Iterator 對象,另一次是從 hashMap 中取出key 所對應的 value。而 entrySet 只是遍歷了一次就把 key 和 value 都放到了 entry 中,效率更高。如果是 JDK8,使用 Map.foreach 方法。

正例: values()返回的是 V 值集合,是一個 list 集合對象; keySet()返回的是 K 值集合,是一個 Set 集合對象; entrySet()返回的是 K-V 值組合集合。

10、高度注意 Map 類集合 K/V 能不能存儲 null 值的情況,如下表格:

Hashtable不允許為 null不允許為 nullDictionary線程安全ConcurrentHashMap不允許為 null不允許為 nullAbstractMap分段鎖技術TreeMap不允許為 null允許為 nullAbstractMap線程不安全HashMap允許為 null允許為 nullAbstractMap線程不安全

反例: 由於 HashMap 的干擾,很多人認為 ConcurrentHashMap 是可以置入 null 值,而事實上,存儲 null 值時會拋出 NPE 異常。

  • 控制語句

1、在 if/else/for/while/do 語句中必須使用大括號。 即使只有一行代碼,避免使用單行的形式: if (condition) statements;

2、表達異常的分支時, 少用 if-else 方式。如果非得使用 if()...else if()...else...方式表達邏輯,避免後續代碼維護困難, 請勿超過 3 層。

3、除常用方法(如 getXxx/isXxx)等外,不要在條件判斷中執行其它複雜的語句,將複雜邏輯判斷的結果賦值給一個有意義的布爾變量名,以提高可讀性。

正例:

final boolean existed = (file.open(fileName, "w") != null) && (...) || (...);

if (existed) {

...

}

反例:

if ((file.open(fileName, "w") != null) && (...) || (...)) {

...

}

  • 異常處理

1、Java 類庫中定義的一類 RuntimeException 可以通過預先檢查進行規避,而不應該通過 catch 來處理,比如: IndexOutOfBoundsException, NullPointerException 等等。

正例: if (obj != null) {...}

反例: try { obj.method() } catch (NullPointerException e) {...}

2、異常不要用來做流程控制,條件控制,因為異常的處理效率比條件分支低。

3、有 try 塊放到了事務代碼中, catch 異常後,如果需要回滾事務,一定要注意手動回滾事務。

4、不能在 finally 塊中使用 return, finally 塊中的 return 返回後方法結束執行,不會再執行 try 塊中的 return 語句。

5、防止空指針異常,是程序員的基本修養。

6、避免出現重複的代碼(Don’t Repeat Yourself) ,即 DRY 原則。

說明: 隨意複製和粘貼代碼,必然會導致代碼的重複,在以後需要修改時,需要修改所有的副本,容易遺漏。必要時抽取共性方法,或者抽象公共類,甚至是共用模塊。

  • 日誌規約

1、應用中不可直接使用日誌系統(Log4j、 Logback) 中的 API,而應依賴使用日誌框架SLF4J 中的 API,使用門面模式的日誌框架,有利於維護和各個類的日誌處理方式統一。

private static final Logger logger = LoggerFactory.getLogger(Abc.class);

2、日誌文件推薦至少保存 15 天,因為有些異常具備以“周”為頻次發生的特點。

3、對 trace/debug/info 級別的日誌輸出,必須使用條件輸出形式或者使用佔位符的方式。

說明: logger.debug("Processing trade with id: " + id + " symbol: " + symbol);

如果日誌級別是 warn,上述日誌不會打印,但是會執行字符串拼接操作,如果 symbol 是對象,會執行 toString()方法,浪費了系統資源,執行了上述操作,最終日誌卻沒有打印。

正例: (條件)

if (logger.isDebugEnabled()) {

logger.debug("Processing trade with id: " + id + " symbol: " + symbol);

}

正例: (佔位符)

logger.debug("Processing trade with id: {} symbol : {} ", id, symbol);

4、避免重複打印日誌,浪費磁盤空間,務必在 log4j.xml 中設置 additivity=false。

<logger name="com.taobao.dubbo.config" additivity="false">

5、謹慎地記錄日誌。生產環境禁止輸出 debug 日誌; 有選擇地輸出 info 日誌; 如果使用 warn 來記錄剛上線時的業務行為信息,一定要注意日誌輸出量的問題,避免把服務器磁盤撐爆,並記得及時刪除這些觀察日誌 。

  • 其他

1、在使用正則表達式時,利用好其預編譯功能,可以有效加快正則匹配速度。

說明: 不要在方法體內定義: Pattern pattern = Pattern.compile(規則);

2、後臺輸送給頁面的變量必須加$!{var}——中間的感嘆號。

說明: 如果 var=null 或者不存在,那麼${var}會直接顯示在頁面上。

3、不要在視圖模板中加入任何複雜的邏輯。

說明: 根據 MVC 理論,視圖的職責是展示,不要搶模型和控制器的活。

4、任何數據結構的構造或初始化,都應指定大小,避免數據結構無限增長吃光內存。

5、對於“明確停止使用的代碼和配置”,如方法、變量、類、配置文件、動態配置屬性等要堅決從程序中清理出去,避免造成過多垃圾。

6、SimpleDateFormat 是線程不安全的類,一般不要定義為 static 變量,如果定義為static,必須加鎖,或者使用 DateUtils 工具類。

正例: 注意線程安全,使用DateTools 。亦推薦如下處理:

public class DateTools

{

private static ThreadLocal<SimpleDateFormat> t1=new ThreadLocal<>();

public static SimpleDateFormat getSdf(String pattern){

SimpleDateFormat simpleDateFormat = t1.get();

if (simpleDateFormat==null){

simpleDateFormat=new SimpleDateFormat(pattern);

}

t1.set(simpleDateFormat);

return simpleDateFormat;

}

}

說明: 如果是 JDK8 的應用,可以使用 Instant 代替 Date, LocalDateTime 代替 Calendar,DateTimeFormatter代替Simpledateformatter,官方給出的解釋:simple beautiful strong immutable thread-safe。

讀到此刻-----

是不是感覺Java很是強大?Java能排在排行榜第一名,就足以證明它的強大和重要之處,那需要怎麼樣去學習呢?不要怕,小編這裡有Java學習視頻可以供你學習!

"

Java語言基本語法

一、標識符和關鍵字

  1. 標識符
  • 在java語言中,用來標誌類名、對象名、變量名、方法名、類型名、數組名、包名的有效字符序列,稱為“標識符”;
  • 標識符由字母、數字、下劃線、美元符號組成,且第一個字符不能是數字;
  • java語言區分大小寫;
  • 標誌符命名規則:類名首字母大寫,變量名和方法名採用駝峰標誌法,常量全大寫,多個單詞之間用“_”隔開,包名全小寫;
  1. 關鍵字
  • 在java語言中,有一些專門的詞彙已經被賦予了特殊的含義,不能再使用這些詞彙來命名標識符,這些專有詞彙,稱為“關鍵字”;
  • java有50個關鍵字和3個保留字,均不能用來命名標識符;
想學習Java,這些Java基本語法和代碼規範你得提前搞懂

  • true、false、null不是關鍵字,是保留字,但是仍不能用來命名標識符,保留字是java預留的關鍵字,在以後的升級版本中可能會作為關鍵字;

二、基本數據類型

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

1. 整數類型(int為默認類型)

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

2. 浮點類型(double為默認類型)

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

  • 在給float類型的變量賦值時,如果賦的值有小數部分則一定要在末尾加上“F”或“f”;

3. 字符類型(2字節)

  • char ch = 'a';
  • 有些字符不能通過鍵盤輸入到程序當中,這時就需要使用到轉義字符;
想學習Java,這些Java基本語法和代碼規範你得提前搞懂

4. 布爾類型(1字節)

  • boolean flag = true;

5. 默認值

  • 數值變量:0;
  • 字符變量:‘\\0’;
  • 布爾變量:false;
  • 引用數據類型:null;

6. 不同數據類型之間的轉換

  • 自動類型轉換(低 到 高)
想學習Java,這些Java基本語法和代碼規範你得提前搞懂

  • 強制類型轉換(高 到 低)

public class Test003 {

public static void main(String[] args) {

byte b = 100;

int i = 22;

float f = 78.98f;

int res = b + i + (int)f; //此處對f使用了強制類型轉換(int)f,轉換後的值為78

System.out.println("res: "+res); //res: 200

}

}

三、運算符與表達式

1. 算術運算符

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

public class Test003 {

public static void main(String[] args) {

int i = 5;

System.out.println(0/i); //0

System.out.println(0%i); //0

System.out.println(i/0); //除數不能為零,報異常java.lang.ArithmeticException

System.out.println(i%0); //除數不能為零,報異常java.lang.ArithmeticException

}

}

2. 賦值運算符

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

3. 自增自減運算符(++,--)

public class Test003 {

public static void main(String[] args) {

int i = 5;

System.out.println(i++); //5

System.out.println(++i); //7

System.out.println(i); //7

System.out.println(--i); //6

System.out.println(i--); //6

System.out.println(i); //5

}

}

4. 關係運算符

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

5. 邏輯運算符

public class Test003 {

public static void main(String[] args) {

boolean t = true;

boolean f = false;

System.out.println(t && f); //false,短路與運算符,若運算符左側為false則不計算右側的表達式

System.out.println(t || f); //true,短路或運算符,若運算符左側為true則不計算右側的表達式

System.out.println(t & f); //false,與運算符,不管左側是否為false都要計算右側的表達式

System.out.println(t | f); //true,或運算符,不管左側是否為true都要計算右側的表達式

System.out.println(t ^ f); //true,異或運算符,只要左右兩側不相同則為true,反之為false

System.out.println(!f); //true,取反運算符

}

}

6. 位運算符

public class Test003 {

public static void main(String[] args) {

//在位運算符中1相當於true,0相當於false

int b1 = 6; //二進制為00000000 00000000 00000000 00000110

int b2 = 11; //二進制為00000000 00000000 00000000 00001011

System.out.println(b1 & b2); //按位與運算符,二進制為00000000 00000000 00000000 00000010,結果為2

System.out.println(b1 | b2); //按位或運算符,二進制為00000000 00000000 00000000 00001111,結果為15

System.out.println(b1 ^ b2); //按位異或運算符,二進制為00000000 00000000 00000000 00001101,結果為13

System.out.println(~b1); //按位取反運算符,二進制為11111111 11111111 11111111 11111001,結果為-7

System.out.println(b1 << 2); //左移位運算符,二進制為00000000 00000000 00000000 00011000,結果為24

int b3 = -14; //二進制為11111111 11111111 11111111 11110010

System.out.println(b3 >> 2); //帶符號右移位運算符,二進制為11111111 11111111 11111111 11111100,結果為-4

System.out.println(b3 >>> 2); //無符號右移位運算符,二進制為00111111 11111111 11111111 11111100,結果為1073741820

}

}

7. 三元運算符

public class Test003 {

public static void main(String[] args) {

int a = 1;

int b = 2;

int c = 4;

int res = c==a+b?++a:c>a+b?++b:++c; //三元運算符 (表達式)?(值1):(值2),若表達式為true則取值1,反之取值2

System.out.println(res); //++b,結果為3

}

}

8. 運算符優先級

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

四、數組

1. 一維數組

public class Test003 {

public static void main(String[] args) {

int[] i; //聲明一個整型的一維數組變量

int ii[]; //聲明一個整型的一維數組變量

i = new int[5]; //創建一個長度為5的一維數組對象,並將變量i指向該對象

float[] f = new float[5]; //直接創建一個長度為5的單精度浮點型一維數組對象,並將變量f指向該對象

double[] d = {1, 2, 3.4, 4.5}; //直接初始化一個一維數組元素

System.out.println(d[3]); //通過數組下標來獲取數組內的元素,數組下標從0開始,結果為4.5

System.out.println(f[0]); //當創建出一個數組對象時,該對象內的數組元素為該數據類型的默認值,所以此處結果為0.0

//System.out.println(i[5]); //當通過數組下標來獲取數組內元素時,[]內的值>=數組長度則報異常java.lang.ArrayIndexOutOfBoundsException(數組下標越界)

//System.out.println(ii[0]); //若一個數組變量只聲明而未指向某一個具體的數組對象時,編譯出錯

System.out.println(d.length); //得到該數組的長度,結果為4

}

}

2. 二維數組

public class Test003 {

public static void main(String[] args) {

int[][] i; //聲明一個整型的二維數組變量

int ii[][]; //聲明一個整型的二維數組變量

int[] iii[]; //聲明一個整型的二維數組變量

i = new int[5][2]; //創建一個長度為5的二維數組對象,並將變量i指向該對象

float[][] f = new float[5][2]; //直接創建一個長度為5的單精度浮點型二維數組對象,並將變量f指向該對象

double[][] d = {{1}, {2,3}, {4,5,6}, {7,8,9,10}}; //直接初始化一個二維數組元素

System.out.println(d[3][1]); //通過數組下標來獲取數組內的元素,數組下標從0開始,結果為8

System.out.println(f[0][0]); //當創建出二個數組對象時,該對象內的數組元素為該數據類型的默認值,所以此處結果為0.0

//System.out.println(i[5][0]); //當通過數組下標來獲取數組內元素時,[]內的值>=數組長度則報異常java.lang.ArrayIndexOutOfBoundsException(數組下標越界)

//System.out.println(ii[0][0]); //若一個數組變量只聲明而未指向某一個具體的數組對象時,編譯出錯

System.out.println(d.length); //得到該數組的長度,結果為4

System.out.println(d[2].length); //得到二位數組內的下標為2的那個一維數組的長度

}

}

五、流程控制語句(if,switch,for,while,do...while)

1. 條件分支語句

public class Test003 {

public static void main(String[] args) {

int[] score = new int[5];

score[0] = -7;

score[1] = 65;

score[2] = 80;

score[3] = 90;

score[4] = 59;

for(int i=0; i<score.length; i++) {

if(score[i]>=0 && score[i]<60) {

System.out.println("不及格");

}else if(score[i]>=60 && score[i]<80) {

System.out.println("及格");

}else if(score[i]>=80 && score[i]<90) {

System.out.println("良");

}else if(score[i]>=90 && score[i]<100) {

System.out.println("優");

}else {

System.out.println("成績異常");

}

}

char ch = 'a';

switch(ch) { //switch括號內只支持 byte,short,int,char,enum五種數據類型,但是JDK1.7版本增加了String類型,所以相對於JDK1.7而言就是六種了

case 'A': //case為switch語句的入口,break為出口,從入口開始執行,直到遇到出口或代碼執行完畢才結束

case 'a':

System.out.println("優");

break;

case 'B':

case 'b':

System.out.println("良");

break;

case 'C':

case 'c':

System.out.println("及格");

break;

default: //若上述條件均不匹配,則進default開始執行語句

System.out.println("不及格");

}

}

}

2. 循環語句

public class Test003 {

public static void main(String[] args) {

int res = 0;

out: //out是一個標號,告訴java從哪裡開始執行程序

for(int i=1; i<=10; i++) {

if(i==3) continue out; //continue終止本次循環,執行下次循環

if(i==5) break out; //break跳出循環

res = res + i;

}

System.out.println(res); //結果為1+2+4=7

int res2 = 0;

int i = 1;

in:

do{

if(i==3) continue in; //continue終止本次循環,執行下次循環

if(i==5) break in; //break跳出循環

res2 = res2 + i;

i++;

}while(i<=10);

System.out.println(res2);

}

}

Java代碼規範

一、前言

本文參考《阿里巴巴Java開發手冊》,這本書主要定義了一些代碼的規範以及一些注意事項。我只根據我自己的不足,摘錄了一些內容,方便以後查閱。

二、讀書筆記

  • 命名

1、代碼中的命名均不能以下劃線或美元符號開始,也不能以下劃線或美元符號結束。

2、常量命名全部大寫,單詞間用下劃線隔開,力求語義表達完整清楚,不要嫌名字長。

3、抽象類命名使用 Abstract 或 Base 開頭; 異常類命名使用 Exception 結尾; 測試類命名以它要測試的類的名稱開始,以 Test 結尾。

4、中括號是數組類型的一部分,數組定義如下: String[] args;

5、POJO 類中布爾類型的變量,都不要加 is,否則部分框架解析會引起序列化錯誤。

反例: 定義為基本數據類型 Boolean isDeleted; 的屬性,它的方法也是 isDeleted()。 RPC框架在反向解析的時候, “以為”對應的屬性名稱是 deleted,導致屬性獲取不到,進而拋出異常。

6、包名統一使用小寫,點分隔符之間有且僅有一個自然語義的英語單詞。包名統一使用單數形式,但是類名如果有複數含義,類名可以使用複數形式。

7、如果使用到了設計模式,建議在類名中體現出具體模式。有利於閱讀者快速理解架構設計思想。

8、接口類中的方法和屬性不要加任何修飾符號(public 也不要加) ,保持代碼的簡潔性,並加上有效的 Javadoc 註釋。儘量不要在接口裡定義變量,如果一定要定義變量,肯定是與接口方法相關,並且是整個應用的基礎常量。

9、枚舉類名建議帶上 Enum 後綴,枚舉成員名稱需要全大寫,單詞間用下劃線隔開。

說明: 枚舉其實就是特殊的常量類,且構造方法默認強制為私有。

正例: 枚舉名字: DealStatusEnum, 成員名稱: SUCCESS / UNKOWN_REASON。

10、各層命名規約:

A) Service/DAO 層方法命名規約

1) 獲取單個對象的方法用 get 做前綴。

2) 獲取多個對象的方法用 list 做前綴。

3) 獲取統計值的方法用 count 做前綴。

4) 插入的方法用 save(推薦) 或 insert 做前綴。

5) 刪除的方法用 remove(推薦) 或 delete 做前綴。

6) 修改的方法用 update 做前綴。

B) 領域模型命名規約

1) 數據對象: xxxDO, xxx 即為數據表名。

2) 數據傳輸對象: xxxDTO, xxx 為業務領域相關的名稱。

3) 展示對象: xxxVO, xxx 一般為網頁名稱。

4) POJO 是 DO/DTO/BO/VO 的統稱,禁止命名成 xxxPOJO。

  • 常量定義

1、不允許任何未經定義的常量直接出現在代碼中。

反例: String key = "Id#taobao_" + tradeId;

cache.put(key, value);

2、long 或者 Long 初始賦值時,必須使用大寫的 L,不能是小寫的 l,小寫容易跟數字1 混淆,造成誤解。

3、不要使用一個常量類維護所有常量,應該按常量功能進行歸類,分開維護。如:緩存相關的常量放在類: CacheConsts 下; 系統配置相關的常量放在類: ConfigConsts 下。

  • OOP規約

1、避免通過一個類的對象引用訪問此類的靜態變量或靜態方法,無謂增加編譯器解析成本,直接用類名來訪問即可。

2、外部正在調用或者二方庫依賴的接口,不允許修改方法簽名,避免對接口調用方產生影響。接口過時必須加@Deprecated 註解,並清晰地說明採用的新接口或者新服務是什麼。

3、不能使用過時的類或方法。

4、Object 的 equals 方法容易拋空指針異常,應使用常量或確定有值的對象來調用

equals

正例: "test".equals(object);

反例: object.equals("test");

5、所有的相同類型的包裝類對象之間值的比較,全部使用 equals 方法比較。對於 Integer var = ? 在-128 至 127 範圍內的賦值, Integer 對象是在IntegerCache.cache 產生,會複用已有對象,這個區間內的 Integer 值可以直接使用==進行判斷,但是這個區間之外的所有數據,都會在堆上產生,並不會複用已有對象,這是一個大坑,推薦使用 equals 方法進行判斷。

6、關於基本數據類型與包裝數據類型的使用標準如下:

1) 【強制】 所有的 POJO 類屬性必須使用包裝數據類

2) 【強制】 RPC 方法的返回值和參數必須使用包裝數

3) 【推薦】 所有的局部變量使用基本數據類型。

說明:用基本數據類型數據默認值是0,而包裝數據類型默認值是null,數據庫的查詢結果可能為null,因為自動拆箱,用基本數據類型接收有NPE風險。

7、定義 DO/DTO/VO 等 POJO 類時,不要設定任何屬性默認值(在數據提取時並沒有置入具體值,在更新其它字段時又附帶更新了此字段,導致創建時間被修改成當前時間。)

8、序列化類新增屬性時,請不要修改 serialVersionUID 字段,避免反序列失敗; 如果完全不兼容升級,避免反序列化混亂,那麼請修改 serialVersionUID 值。注意 serialVersionUID 不一致會拋出序列化運行時異常。

9、構造方法裡面禁止加入任何業務邏輯,如果有初始化邏輯,請放在 init 方法中。

10、類內方法定義順序依次是:公有方法或保護方法 > 私有方法 > getter/setter方法。

11、循環體內,字符串的連接方式,使用 StringBuilder 的 append 方法進行擴展。

12、慎用 Object 的 clone 方法來拷貝對象。對象的 clone 方法默認是淺拷貝,若想實現深拷貝需要重寫 clone 方法實現屬性對象的拷貝。

13、工具類不允許有 public 或 default 構造方法。

  • 集合處理

1、ArrayList的subList結果不可強轉成ArrayList,否則會拋出 ClassCastException異常: java.util.RandomAccessSubList cannot be cast to java.util.ArrayList。subList 返回的是 ArrayList 的內部類 SubList,並不是 ArrayList ,而是ArrayList 的一個視圖,對於 SubList 子列表的所有操作最終會反映到原列表上。

2、在 subList 場景中, 高度注意對原集合元素個數的修改,會導致子列表的遍歷、增加、刪除均產生 ConcurrentModificationException 異常。

3、使用集合轉數組的方法,必須使用集合的 toArray(T[] array),傳入的是類型完全一樣的數組,大小就是 list.size()。

說明: 使用 toArray 帶參方法,入參分配的數組空間不夠大時, toArray 方法內部將重新分配內存空間,並返回新數組地址; 如果數組元素大於實際所需,下標為[ list.size() ]的數組元素將被置為 null,其它數組元素保持原值,因此最好將方法入參數組大小定義與集合元素個數一致。

正例:

List<String> list = new ArrayList<String>(2);

list.add("guan");

list.add("bao");

String[] array = new String[list.size()];

array = list.toArray(array);

反例: 直接使用 toArray 無參方法存在問題,此方法返回值只能是 Object[]類,若強轉其它類型數組將出現 ClassCastException 錯誤

4、使用工具類 Arrays.asList()把數組轉換成集合時,不能使用其修改集合相關的方法,它的 add/remove/clear 方法會拋出 UnsupportedOperationException 異常。

說明: asList 的返回對象是一個 Arrays 內部類,並沒有實現集合的修改方法。Arrays.asList體現的是適配器模式,只是轉換接口,後臺的數據仍是數組。

5、泛型通配符<? extends T>來接收返回的數據,此寫法的泛型集合不能使用 add 方法, 而<? super T>不能使用 get 方法,做為接口調用賦值時易出錯。

說明: 擴展說一下 PECS(Producer Extends Consumer Super)原則: 1) 頻繁往外讀取內容的,適合用上界 Extends。 2) 經常往裡插入的,適合用下界 Super。

6、不要在 foreach 循環裡進行元素的 remove/add 操作。 remove 元素請使用 Iterator方式,如果併發操作,需要對 Iterator 對象加鎖。

正例:

Iterator<String> it = a.iterator();

while (it.hasNext()) {

String temp = it.next();

if (刪除元素的條件) {

it.remove();

}

}

反例:

List<String> a = new ArrayList<String>();

a.add("1");

a.add("2");

for (String temp : a) {

if ("1".equals(temp)) {

a.remove(temp);

}

}

7、集合初始化時, 指定集合初始值大小。

說明: HashMap 使用 HashMap(int initialCapacity) 初始化,

正例:initialCapacity = (需要存儲的元素個數 / 負載因子) + 1。注意負載因子(即 loaderfactor) 默認為 0.75, 如果暫時無法確定初始值大小, 請設置為 16。

9、使用 entrySet 遍歷 Map 類集合 KV,而不是 keySet 方式進行遍歷。

說明: keySet 其實是遍歷了 2 次,一次是轉為 Iterator 對象,另一次是從 hashMap 中取出key 所對應的 value。而 entrySet 只是遍歷了一次就把 key 和 value 都放到了 entry 中,效率更高。如果是 JDK8,使用 Map.foreach 方法。

正例: values()返回的是 V 值集合,是一個 list 集合對象; keySet()返回的是 K 值集合,是一個 Set 集合對象; entrySet()返回的是 K-V 值組合集合。

10、高度注意 Map 類集合 K/V 能不能存儲 null 值的情況,如下表格:

Hashtable不允許為 null不允許為 nullDictionary線程安全ConcurrentHashMap不允許為 null不允許為 nullAbstractMap分段鎖技術TreeMap不允許為 null允許為 nullAbstractMap線程不安全HashMap允許為 null允許為 nullAbstractMap線程不安全

反例: 由於 HashMap 的干擾,很多人認為 ConcurrentHashMap 是可以置入 null 值,而事實上,存儲 null 值時會拋出 NPE 異常。

  • 控制語句

1、在 if/else/for/while/do 語句中必須使用大括號。 即使只有一行代碼,避免使用單行的形式: if (condition) statements;

2、表達異常的分支時, 少用 if-else 方式。如果非得使用 if()...else if()...else...方式表達邏輯,避免後續代碼維護困難, 請勿超過 3 層。

3、除常用方法(如 getXxx/isXxx)等外,不要在條件判斷中執行其它複雜的語句,將複雜邏輯判斷的結果賦值給一個有意義的布爾變量名,以提高可讀性。

正例:

final boolean existed = (file.open(fileName, "w") != null) && (...) || (...);

if (existed) {

...

}

反例:

if ((file.open(fileName, "w") != null) && (...) || (...)) {

...

}

  • 異常處理

1、Java 類庫中定義的一類 RuntimeException 可以通過預先檢查進行規避,而不應該通過 catch 來處理,比如: IndexOutOfBoundsException, NullPointerException 等等。

正例: if (obj != null) {...}

反例: try { obj.method() } catch (NullPointerException e) {...}

2、異常不要用來做流程控制,條件控制,因為異常的處理效率比條件分支低。

3、有 try 塊放到了事務代碼中, catch 異常後,如果需要回滾事務,一定要注意手動回滾事務。

4、不能在 finally 塊中使用 return, finally 塊中的 return 返回後方法結束執行,不會再執行 try 塊中的 return 語句。

5、防止空指針異常,是程序員的基本修養。

6、避免出現重複的代碼(Don’t Repeat Yourself) ,即 DRY 原則。

說明: 隨意複製和粘貼代碼,必然會導致代碼的重複,在以後需要修改時,需要修改所有的副本,容易遺漏。必要時抽取共性方法,或者抽象公共類,甚至是共用模塊。

  • 日誌規約

1、應用中不可直接使用日誌系統(Log4j、 Logback) 中的 API,而應依賴使用日誌框架SLF4J 中的 API,使用門面模式的日誌框架,有利於維護和各個類的日誌處理方式統一。

private static final Logger logger = LoggerFactory.getLogger(Abc.class);

2、日誌文件推薦至少保存 15 天,因為有些異常具備以“周”為頻次發生的特點。

3、對 trace/debug/info 級別的日誌輸出,必須使用條件輸出形式或者使用佔位符的方式。

說明: logger.debug("Processing trade with id: " + id + " symbol: " + symbol);

如果日誌級別是 warn,上述日誌不會打印,但是會執行字符串拼接操作,如果 symbol 是對象,會執行 toString()方法,浪費了系統資源,執行了上述操作,最終日誌卻沒有打印。

正例: (條件)

if (logger.isDebugEnabled()) {

logger.debug("Processing trade with id: " + id + " symbol: " + symbol);

}

正例: (佔位符)

logger.debug("Processing trade with id: {} symbol : {} ", id, symbol);

4、避免重複打印日誌,浪費磁盤空間,務必在 log4j.xml 中設置 additivity=false。

<logger name="com.taobao.dubbo.config" additivity="false">

5、謹慎地記錄日誌。生產環境禁止輸出 debug 日誌; 有選擇地輸出 info 日誌; 如果使用 warn 來記錄剛上線時的業務行為信息,一定要注意日誌輸出量的問題,避免把服務器磁盤撐爆,並記得及時刪除這些觀察日誌 。

  • 其他

1、在使用正則表達式時,利用好其預編譯功能,可以有效加快正則匹配速度。

說明: 不要在方法體內定義: Pattern pattern = Pattern.compile(規則);

2、後臺輸送給頁面的變量必須加$!{var}——中間的感嘆號。

說明: 如果 var=null 或者不存在,那麼${var}會直接顯示在頁面上。

3、不要在視圖模板中加入任何複雜的邏輯。

說明: 根據 MVC 理論,視圖的職責是展示,不要搶模型和控制器的活。

4、任何數據結構的構造或初始化,都應指定大小,避免數據結構無限增長吃光內存。

5、對於“明確停止使用的代碼和配置”,如方法、變量、類、配置文件、動態配置屬性等要堅決從程序中清理出去,避免造成過多垃圾。

6、SimpleDateFormat 是線程不安全的類,一般不要定義為 static 變量,如果定義為static,必須加鎖,或者使用 DateUtils 工具類。

正例: 注意線程安全,使用DateTools 。亦推薦如下處理:

public class DateTools

{

private static ThreadLocal<SimpleDateFormat> t1=new ThreadLocal<>();

public static SimpleDateFormat getSdf(String pattern){

SimpleDateFormat simpleDateFormat = t1.get();

if (simpleDateFormat==null){

simpleDateFormat=new SimpleDateFormat(pattern);

}

t1.set(simpleDateFormat);

return simpleDateFormat;

}

}

說明: 如果是 JDK8 的應用,可以使用 Instant 代替 Date, LocalDateTime 代替 Calendar,DateTimeFormatter代替Simpledateformatter,官方給出的解釋:simple beautiful strong immutable thread-safe。

讀到此刻-----

是不是感覺Java很是強大?Java能排在排行榜第一名,就足以證明它的強大和重要之處,那需要怎麼樣去學習呢?不要怕,小編這裡有Java學習視頻可以供你學習!

想學習Java,這些Java基本語法和代碼規範你得提前搞懂

獲取方式:轉發關注私信小編“學習”就可以拿到了!經典不容錯過!

"

相關推薦

推薦中...