1.包裝類與創建對象 Java 為8大數據類型都提供了相應的包裝類,並提供屬性和方法,更方便的操作基本數據類型。包裝類位於java.lang包中。 對於這幾種類型的基本數據,都有相似的方法實現基本數據和實例的相互轉換:把基本數據類型變數變成包裝類實例通過包裝類的 valueOf()靜態方法;將包裝類 ...
1.包裝類與創建對象
Java 為8大數據類型都提供了相應的包裝類,並提供屬性和方法,更方便的操作基本數據類型。包裝類位於java.lang包中。
對於這幾種類型的基本數據,都有相似的方法實現基本數據和實例的相互轉換:把基本數據類型變數變成包裝類實例通過包裝類的 valueOf()靜態方法;將包裝類對象轉換成基本類型變數,通過包裝類提供的xxxValue()實例方法。要註意類型匹配。
例如 int 類型:
1 //創建 Integer 對象 2 Integer i1 = new Integer(10); 3 Integer i2 = Integer.valueOf(20); 4 //轉換成基本數據 5 int a = i1.intValue();
而對於 String 類型和基本數據類型的轉換,也有特定的方法。
- 用基礎類型包裝類的 parseXxx(String s)靜態方法將字元串轉成基本類型變數(除了 Character)。
- 利用基礎類型包裝類提供的 valueOf(String s)靜態方法將字元串轉成基本類型變數。
- 用 String 類提供的多個重載的 valueOf()方法將基本類型轉換成 String。
事實上從JDK 1.5 之後,Java 對包裝類都提供了自動裝包和自動拆包,我們完全可以將一個基本類型數據直接賦給一個包裝類的變數,或者將一個包裝類賦值給一個基本數據類型變數,系統會自動裝包成相應的對象或拆包成基本數據。例如:
1 //自動裝箱 2 Integer i = 10; 3 //自動拆箱 4 int n = i;
2 字元串
String 類代表字元串。Java 程式中的所有字元串字面值(如 "abc" )都作為此類的對象。 字元串本質上是一個字元數組,它們的值在創建之後不能更改,所以字元串是常量。可以把字元串看出是字元數組的包裝類,內部聲明一個private final char value[]。
1 String a = "abc"; 2 String b = "abc" 3 //這裡輸出 true,因為“abc”保存在常量池,兩個變數指向同一塊記憶體 4 System.out.println(a == b); 5 //這裡輸出false,因為涉及到變數的運算,系統在運行時才知道結果;若給 a 和 b 加上final,則變成 true 6 System.out.println(a + b == "abcabc");
字元串的構造方法中,支持使用一個 byte 數組作為參數構造一個字元串,預設採用當前系統預設的編碼方式解碼該位元組數組。例如:
1 byte[] b1 = {-42,-48}; 2 String s1 = new String(b1); 3 //這裡將會輸出一個中文漢字:“中”;windows預設用gbk編碼,gbk編碼用兩個位元組編碼漢字。 4 System.out.println(s1);
也可以增加第二個參數,指定解碼方式
3 比較
基本數值類型數據可以直接和其包裝類進行比較,例如:
1 Integer num1 = 2; 2 //輸出true 3 System.out.println(num1 == 2);
但是兩個包裝類的變數的比較就比較複雜,只有兩個變數指向同一實例才返回true。其中也有一些奇怪的現象:
1 Integer a = 2; 2 Integer b = 2; 3 System.out.println(a == b);//輸出true 4 Integer biga = 128; 5 Integer bigb = 128; 6 System.out.println(biga == bigb);//輸出false
這種現象是因為,系統將-128 - 127 的整數放入了一個名為 cache 的數組中緩存起來, 當將這個範圍內的整數自動裝箱成一個 Integer 實例時,實際上直接指向對應的數組元素,因此 a 和 b 指向同一個數組元素,它們相等;而這個範圍外的,將會新建一個對象,所以不相等。
3.1 compareTo() 和 compare() 方法
所有包裝類都提供了 compare(Xxx val1 , Xxx val2) 靜態方法,比較兩個基本類型值的大小,如果參數1大於參數2,返回 1;相等返回 0;小於返回 -1。包括 boolean 類型都有這個方法(true > false)。
包裝類還提供了 compareTo(Xxx val) 實例方法,比較兩個實例的大小,大於返回正數,相等返回 0,小於返回負數。
String 類型的 compareTo() 方法會由第一個字元開始逐個比較,a < z,小寫大於大寫,有大於無,只要有不相同的位就分出大小。
4 LeetCode
66. 加一
給定一個由整數組成的非空數組所表示的非負整數,在該數的基礎上加一。最高位數字存放在數組的首位, 數組中每個元素只存儲一個數字。你可以假設除了整數 0 之外,這個整數不會以零開頭。
示例 1:
輸入: [1,2,3] 輸出: [1,2,4] 解釋: 輸入數組表示數字 123。
示例 2:
輸入: [4,3,2,1] 輸出: [4,3,2,2] 解釋: 輸入數組表示數字 4321。
第一編提交的時候,忽略了這個字元數組最高位是9,同時發生了進位,需要加一位的情況。最終答案如下:
1 class Solution { 2 public int[] plusOne(int[] digits) { 3 int count = 1; 4 for(int i = digits.length - 1; i >= 0; i--){ 5 digits[i] += count; 6 if(digits[i] == 10){ 7 digits[i] = 0; 8 count = 1; 9 if(i == 0){ 10 int[] tmp = new int[digits.length + 1]; 11 System.arraycopy(digits, 0, tmp, 1,digits.length); 12 tmp[0] = count; 13 digits = tmp; 14 15 } 16 }else { 17 count = 0; 18 //也可以直接 break; 19 } 20 } 21 return digits; 22 } 23 }