一.自動拆裝箱(AutoBoxing&unBoxing)
jdk1.5之前基本類型和包裝類型是不能直接轉換的,jdk1.5之後底層直接可以相互轉換,這樣提高了效率。
package cn.jasonjdk01;
public class AutoBox {
public static void main(String[] args) {
// 自動裝箱
Integer i = 10;// 這裏相當是Integer i=Integer.valueOf(10);這叫自動裝箱
// 先拆箱在裝箱
i = Integer.valueOf(10);// 這裏相當做了這樣一個動作。先把之前裝好箱的i,在拆箱成基本類型10,和20運算後再把30裝箱成Integer類型。
// 也就是代碼。i=Integer.valueOf(Integer.valueOf(10).intValue()+20);
}
}
基本類型轉換 包裝類型用的是valueOf方法,
包裝類型轉換基本類型用的是intValue方法。
通過反編譯看看底層是不是這樣實現的:
package cn.jasonjdk01;
import java.io.PrintStream;
public class AutoBox
{
public AutoBox()
{
}
public static void main(String args[])
{
Integer i = Integer.valueOf(10);
i = Integer.valueOf(i.intValue() + 20);
System.out.println(i);
}
}
總結:
int類型轉換成Integer類型方法:Integer.valueOf()方法;
Integer類型裝換成int類型方法:用的是intValue方法。
二.可變參數(Varargs)
現象:有時定義函數的時候,需要根據用戶傳遞的參數的個數來決定傳幾個參數。而不是自己直接在函數上就把參數的個數限定。這種問題就可以使用可變參數來解決。
package cn.jasonjdk01;
/**
* 可變參數用法
*
* @author Jason
*
*/
public class Varargs {
public static void main(String[] args) {
// 求若干參數之和
getSum(661, 5, 0);
// 若是對於某個參數單獨處理
getMax(888, 5, 2, 1);
}
// 可變參數格式:參數類型...數組名
private static void getSum(int... arr) {
// 定義求和變量
int sum = 0;
// 遍歷數組
for (int i : arr) {
sum += i;
}
// StringBuilder類也重寫的toString方法,所以底層會默認轉換爲字符串
System.out.println(new StringBuilder("c參數之和是:").append(sum));
}
// 獲取第一個參數和後面三個參數之和的最大值
private static void getMax(int i, int... arr) {
// 定義求和變量
int sum = 0;
// 遍歷數組,求後面三個參數之和
for (int j : arr) {
sum += j;
}
// 比較最值
int max = Math.max(i, sum);
System.out.println(new StringBuilder("最大值是:").append(max));
}
}
其實可變參數的底層就是一個數組,getSum(661,5,0)其實是傳的是數組getSum(new int[] {661, 5, 0}),傳的是一個靜態初始化的一個數組而已。方法 private static transient void getSum(int arr[])的可變參數列表底層就是一個數組。
看看底層吧
<span style="font-size:14px;">package cn.jasonjdk01;
import java.io.PrintStream;
public class VariableArguments
{
public VariableArguments()
{
}
public static void main(String args[])
{
getSum(new int[] {
661, 5, 0
});
getMax(888, new int[] {
5, 2, 1
});
}
private static transient void getSum(int arr[])
{
int sum = 0;
int ai[];
int k = (ai = arr).length;
for (int j = 0; j < k; j++)
{
int i = ai[j];
sum += i;
}
System.out.println((new StringBuilder("c參數之和是:")).append(sum).toString());
}
private static transient void getMax(int i, int arr[])
{
int sum = 0;
int ai[];
int l = (ai = arr).length;
for (int k = 0; k < l; k++)
{
int j = ai[k];
sum += j;
}
int max = Math.max(i, sum);
System.out.println((new StringBuilder("最大值是:")).append(max).toString());
}
}
總結:
1.可變參數列表底層就是一個數組。其實在main方法裏面直接寫一個數組也是可以驗證的。
2.可變參數的好處
①可以簡化代碼
②使用可變參數可以接收不確定參數的個數
注意:
1.若是有某個參數單獨處理,參數列表必須放在可變參數列表之前, 因爲第一個參數是可變參數,可以接收傳遞過來的所有參數,第二個參數就變得沒有意義了。
2.對於某個單獨處理的參數,函數名不能相同,否則產生不確定性
3.參數列表不同可以以重載方式存在.
三.靜態導入(Static imports)
靜態導入和導包其實道理一樣,只是在導入包的時候把這些靜態的內容提前導入進來。
我並沒有發現這樣有多簡單,反倒覺得麻煩,代碼body簡單了,但是head重了,給人頭重腳輕的,看看就行。
靜態導入格式:
import static 包名.類名.靜態成員變量/方法名
package cn.jasonjdk01;
import java.util.Arrays;
import static java.util.Arrays.sort;
import static java.lang.System.out;
//靜態導入
//格式:import static 包名.類名.靜態成員變量/方法名
//這裏的類沒有構造方法,方法或成員都是靜態的
public class StaticDemo {
public static void main(String[] args) {
// 定義一個數組
int[] arr = { 1, 6, 2, 4, 0 };
// 對數組進行排序
Arrays.sort(arr);
// 靜態導入方法
sort(arr);
// 把數組轉換成字符串表示
String string = Arrays.toString(arr);
System.out.println(string);
// 靜態導入方法
out.println(string);
}
}
四.foreach、增強for或者高級for
這個請查看之前博客增強for底層用法解析