jdk5新特性用法詳解

一.自動拆裝箱(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底層用法解析



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章