Java高階進修之Java高階特性
Java高階特性
1 增強for迴圈
引入增強for迴圈的原因:在JDK5以前的版本中,遍歷陣列或集合中的元素,需先獲得陣列的長度或集合的迭代器,比較麻煩!
因此JDK5中定義了一種新的語法——增強for迴圈,以簡化此類操作。增強for迴圈只能用在陣列、或實現Iterable介面的集合類上
語法格式:
for(變數型別 變數 :需迭代的陣列或集合){}
For each是為了讓你的程式碼變得簡捷、和容易維護。
增強for迴圈要注意的細節:
- 迭代器可以對遍歷的元素進行操作,使用增強for迴圈時,不能對集合中的元素進行操作的。
- 增加for迴圈與普通的for迴圈區別。
- map的遍歷。
2 可變引數
JDK中具有可變引數的類Arrays.asList()
方法。
分別傳多個參、傳陣列,傳陣列又傳參的情況。
注意:傳入基本資料型別陣列的問題。
從JDK 5開始, Java 允許為方法定義長度可變的引數。
語法:資料型別…變數名。
可變長引數是Object[]
陣列。(可變引數裡存的是物件陣列)
JDK中的典型應用:
Arrays.asList(T…a)
是jdk中的典型應用。
需求:對若干個整數進行求和
public static int sum1(int a,int b ) {
return a+b;
}
若干個整數求和如何解決?
- 可以使用陣列接收整數。
public static int sum1(int[] numbers) {
if (numbers == null) {
return 0;
}
if (numbers.length == 0) {
return 0;
}
int sum = 0;
for (int num : numbers) {
sum += num;
}
return sum;
}
- 可以使用可變引數
public static int sum2(int... numbers) {
if (numbers == null) {
System.out.println( "可變引數的值為null");
return 0;
}
if (numbers.length == 0) {
System.out.println("可變引數的值的長度為0");
return 0;
}
int sum = 0;
for (int num : numbers) {
sum += num;
}
return sum;
}
- 可變引數的使用
public static void main(String[] args) {
// int result = sum1(new int[] { 1, 3, 5, 7, 9 });
// System.out.println(result);
// // 使用了可變引數,傳一個數組進去
// int result = sum2(new int[] { 1, 3, 5, 7, 9 });
// System.out.println(result);
// 使用了可變引數,不必宣告陣列,簡化書寫
// int result = sum2(2, 4, 6, 8, 10);
// int result = sum2(1);
int result = sum2();
System.out.println(result);
}
- 可變引數的細節
- 宣告:
在一個方法中,最多隻能有一個可變引數。
可變引數只能放在引數列表的最後面。 - 呼叫:
當使用可變引數時,可以傳0或多個引數。
當使用可變引數時,也可以傳一個數組進去,就表示多個引數。 - 使用:
在方法內部使用時,就是在使用一個數組。
當呼叫時沒有傳引數時(傳了0個),這時在方法內部的引數陣列是有值的(不為null),但長度為0.
- 宣告:
3 自動裝箱/拆箱
自動裝箱:指開發人員可以把一個基本資料型別直接賦給對應的包裝類。
自動拆箱:指開發人員可以把一個包裝類物件直接賦給對應的基本資料型別。
典型應用:
List list = new ArrayList();
list.add(1);
//list.add(new Integer(1));
int i=list.get(0);
//int j = (Integer)list.get(0);
基本資料型別包裝類:
包裝類 | 基本資料型別 |
---|---|
Byte | byte |
Short | short |
Integer | int |
Long | long |
Boolean | boolean |
Float | float |
Double | double |
Character | char |
物件變基本資料型別:拆箱 | 基本資料型別包裝為物件:裝箱 |
為了使得java的基本型別有更多的功能,java為其所有的基本型別提供了包裝類來封裝常見的功能。如:最大值、數值轉換等。
將基本資料型別封裝成物件的好處在於可以在物件中定義更多的功能方法操作該資料
所屬的包:java.lang.*
應用一:
獲取最大最小值MAX_VALUE / MIN_VALUE
整數型別最大值
Integer.MAX_VALUE
System.out.println(Integer.MIN_VALUE);// -2147483648
System.out.println(Integer.MAX_VALUE);// 2147483647
應用二:
基本資料型別和字串之間的轉換
例:Integer
的parseInt
方法,intValue
方法
基本資料型別轉換成字串:
- 基本資料型別+””
- 基本資料型別.toString(基本資料型別值);
例如Integer.toString(34); //將34變成了”34”
基本資料型別轉字串
int i=100;
String str=100+"";
String string = Integer.toString(100);
字串變基本資料型別
基本資料型別 a=基本資料型別包裝類.parse基本資料型別(String str);
str="123";
int parseInt = Integer.parseInt(str);
System.out.println(parseInt);
注意:
public static int parseInt(String s)
Integer類中的parseInt方法是靜態的 引數必須是數字格式
Double
str = "3.14";
double parseInt2 = Double.parseDouble(str);
System.out.println(parseInt2);
boolean b = Boolean.parseBoolean("true");
應用三:
進位制轉換:
十進位制轉成其他進位制.
toBinaryString(int i)
以二進位制(基數 2)無符號整數形式返回一個整數引數的字串表示形式。
toHexString(int i)
以十六進位制(基數 16)無符號整數形式返回一個整數引數的字串表示形式。
toOctalString(int i)
以八進位制(基數 8)無符號整數形式返回一個整數引數的字串表示形式。
那麼其他進位制轉成十進位制
parseInt(String radix);
parseInt(String s, int radix)
使用第二個引數指定的基數,將字串引數解析為有符號的整數。
// 十進位制轉二進位制
String binaryString = Integer.toBinaryString(100);
System.out.println(binaryString); // 1100100
// 十進位制轉十六進位制
String hexString = Integer.toHexString(100);
System.out.println(hexString); // 64
// 十進位制轉八進位制
String octalString = Integer.toOctalString(100);
System.out.println(octalString); // 144
// 其他進位制轉十進位制
// 字串轉對應的進位制
int parseInt3 = Integer.parseInt(octalString);
System.out.println(parseInt3);
// 二進位制轉十進位制
int parseInt4 = Integer.parseInt(binaryString, 2);
System.out.println(parseInt4);
// 十六進位制轉十進位制
int parseInt5 = Integer.parseInt(hexString, 16);
System.out.println(parseInt5);
// 八進位制轉十進位制
int parseInt6 = Integer.parseInt(octalString, 8);
System.out.println(parseInt6);
JDK5.0後出現了自動裝箱和拆箱。JDK5.0以後,簡化了定義方式。
Integer x = new Integer(5);//裝箱
int intValue = x.intValue(); //拆箱
// 5.0簡化書寫
// 自動裝箱。new Integer(5);
Integer y = 5;
// 物件加整數,x 進行了自動拆箱,變成了int 型 和5進行加法運算後再將和進行裝箱賦給x。
y = y + 5; // 是通過Integer.intValue() 方法進行拆箱
練習:
public static void main(String[] args) {
Integer a = 127;
Integer b = 127;
System.out.println(a == b);
Integer c = 128;
Integer d = 128;
System.out.println(c == d);
}
請問結果?
a==b 為true 因為a和b指向了同一個Integer 物件.
Integer的快取大小-128 ~127 之間也就是byte的範圍。
4 列舉類
一些方法在執行時,它需要的資料不能是任意的,而必須是一定範圍內的值,此類問題在JDK5以前採用自定義帶有列舉功能的類解決,Java5以後可以直接使用列舉予以解決。
例如: 交通燈(紅、黃、綠) 性別(男、女) 星期(星期一、二、三……)
分數等級(A、B、C、D、E)
JDK 5新增的 enum
關鍵字用於定義一個列舉類。
列舉的實現
使用enum定義列舉類
在列舉類中定義列舉值(大寫)
enum Gender {
MALE, FEMALE;
}
使用javap命令
發現其中每一個列舉值都是列舉類的具體例項物件.只不過是靜態常量.
列舉類具有如下特性:
- 列舉類也是一種特殊形式的Java類。
- 列舉類中宣告的每一個列舉值代表列舉類的一個例項物件。
- 與java中的普通類一樣,在宣告列舉類時,也可以宣告屬性、方法和建構函式.
public class Demo1 {
public static void main(String[] args) {
Gender male = Gender.MALE;
System.out.println(male.getInfo());
}
}
enum Gender {
MALE("男"), FEMALE;
// 成員變數
private String info;
// 建構函式
private Gender() {
}
private Gender(String info) {
this.info = info;
}
// 成員方法
public String getInfo() {
return info;
}
}
列舉類可以宣告抽象方法,但是要有具體的列舉值去實現.
public class Demo1 {
public static void main(String[] args) {
Gender male = Gender.MALE;
System.out.println(male.getInfo());
male.speak();
}
}
enum Gender {
MALE("男") {
@Override
public void speak() {
System.out.println("是男人");
}
},
FEMALE {
@Override
public void speak() {
System.out.println("是女人");
}
};
// 成員變數
private String info;
// 建構函式
private Gender() {
}
private Gender(String info) {
this.info = info;
}
// 成員方法
public String getInfo() {
return info;
}
public abstract void speak();
}
列舉類也可以實現介面(序列化)、或繼承抽象類。
JDK5中擴充套件了swith語句,它除了可以接收int, byte, char, short外,還可以接收一個列舉型別(enum)。
public class Demo2 {
public static void main(String[] args) {
WeekDay mon = WeekDay.MON;
switch (mon) {
case MON:
System.out.println("星期一要上班...");
break;
case TUE:
System.out.println("星期二,繼續上班...");
break;
}
}
}
enum WeekDay {
MON, TUE, WED, THU, FRI, SAT, SUN;
}
若列舉類只有一個列舉值,則可以當作單態設計模式使用。
練習:
請編寫一個關於星期幾的列舉WeekDay,要求:列舉值:Mon,Tue,Wed,Thu,Fri,Sat,Sun 該列舉要有一個方法,呼叫該方法返回中文格式的星期。
enum WeekDay {
MON {
@Override
public String getInfo() {
return "星期一";
}
},
TUE {
@Override
public String getInfo() {
return "星期二";
}
},
WED {
@Override
public String getInfo() {
return "星期三";
}
},
THU {
@Override
public String getInfo() {
return "星期四";
}
},
FRI {
@Override
public String getInfo() {
return "星期五";
}
},
SAT {
@Override
public String getInfo() {
return "星期六";
}
},
SUN {
@Override
public String getInfo() {
return "星期天";
}
};
public abstract String getInfo();
}