零基礎學習之Java包裝類
- 概述
- 基本介紹
- 包裝類的使用
- 裝箱
- 介紹
- 代碼示例
- 拆箱
- 介紹
- 代碼示例
- 包裝類常見的API
- 基本資料型別和字串之間的轉換
- 資料型別的最大值和最小值
- 轉大小寫
- 轉進制
- 包裝類物件的快取問題
- 介紹
- 面試常考
- 常見筆試或面試問題舉例
概述
說起Java包裝類就不得不說Java的特性 - 面向物件,Java是Sun公司的程式James Gosling,Bill Joe本來打算試圖修改和擴展C 的功能,新開發一個語言Oak的發展,C語言是一個面向程序的語言,改進后的Java是面向物件,這是一個非常大的改進,這也是Java發展至今依舊非常流行的原因,
但是,Java又不是完全的面向物件,它沿用了C語言的基本資料型別(這是為了便于開發者的使用,使得在進行基本的資料計算時,開發者可以直接使用基礎類),但當需要和Java其他物件結合使用,如存入集合中,就需要將基礎資料型別實體封裝為Java物件,這樣操作起來又比較麻煩了,為了滿足面向物件的這一特性,Java的java.lang包中設定了包裝類,使得每一個基本型別都有對應的包裝類,這樣直接就方便了開發者的使用,
簡單理解來說:包裝類就是為了使得Java中的基本資料型別具有面向物件的特性,
基本介紹
基本資料型別對應的包裝類有8個(,根據其繼承關系可以分成三類:Character、Number、Boolean,繼承關系圖如下:

這8個包裝類和基本資料型別的對應關系如下表:
| 基本資料型別 | 包裝類(java.lang包) |
|---|---|
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| char | Character |
| boolean | Boolean |
包裝類的使用
裝箱
介紹
把基本型別變成包裝類物件的程序稱為裝箱,
轉為包裝類的物件,是為了使用專門為物件設計的API和特性(比如泛型)
在JDK1.5之前,這個轉化程序需要手動實作,即使用包裝類的構造器來創建物件,(稱為手動裝箱);
在JDK1.15之后,這個轉化程序可以自動實作,即直接賦值,(稱為自動裝箱)
代碼示例
import org.junit.Test;//匯入junit包,用來進行單元測驗(比main方法好用,一個類可以創建多個程式入口)
public class Demo7 {
/**
* Integer(Byte,Double,Float,Long,Short類似)
*/
@Test
public void test1(){
int i1 = 10; //定義基本資料型別(整型)
//基本資料型別轉化成包裝類
//手動裝箱(使用構造器)
Integer i2 = new Integer(i1);
Integer i3 = new Integer("11"); //也可以是字符型別,但是必須是數字,否則報錯
//自動裝箱(直接賦值)
Integer i4 = i1;
//輸出結果,測驗驗證
System.out.println(i1);
System.out.println(i2);
System.out.println(i3);
System.out.println(i4);
}
/**
* Character
*/
@Test
public void test2(){
char c1 = 'a'; //定義基本資料型別(字符型)
//基本資料型別轉化成包裝類
//手動裝箱(構造器)
Character c2 = new Character(c1);
//Character c3 = new Character("a"); 不能是字符,如果是字符就會分不清,本身就是了
//自動裝箱(直接賦值)
Character c4 = c1;
//輸出結果,測驗驗證
System.out.println(c1);
System.out.println(c2);
System.out.println(c4);
}
/**
* Boolean
*/
@Test
public void test3(){
boolean b1=true; //定義基本資料型別(布爾型)
//基本資料型別轉化成包裝類
//手動裝箱
Boolean b2=new Boolean(b1);
Boolean b3=new Boolean("true");//只要引數不是true這個字串,都回傳false
if(b3)
System.out.println("b3=true");
else
System.out.println("b3=false");
//自動裝箱(直接賦值)
Boolean b4=b1;
//輸出結果,測驗驗證
System.out.println(b1);
System.out.println(b2);
System.out.println(b4);
}
}
拆箱
介紹
與裝箱相反,拆箱就是把包裝類物件轉化為基本型別的程序,
轉為基本資料型別,一般是因為需要運算,Java中的大多數運算子是為基本資料型別設計的,比較、算術等,這樣的效率更高
在JDK1.5之前,這個轉化程序需要手動實作,即通過對應的包裝類呼叫xxxValue()方法,(稱為手動拆箱);
在JDK1.15之后,這個轉化程序可以自動實作,即直接賦值,(稱為自動拆箱)
代碼示例
import org.junit.Test;
public class Demo7 {
/**
* Integer(Byte,Double,Float,Long,Short類似)
*/
@Test
public void test1(){
int i1 = 10;//定義基本資料型別(整型)
//自動裝箱,用于后面拆箱
Integer i4 = i1;
//包裝類轉化為基本資料型別
//手動拆箱(呼叫xxxValue())
int i5 = i4.intValue();
//自動拆箱(直接賦值)
int i6 = i4;
//輸出結果,測驗驗證
System.out.println(i1);
System.out.println(i4);
System.out.println(i5);
System.out.println(i6);
}
/**
* Character
*/
@Test
public void test2(){
char c1 = 'a';//定義基本資料型別(字符型)
//自動裝箱,用于后面拆箱
Character c4 = c1;
//包裝類轉化為基本資料型別
//手動拆箱
char c5 = c4.charValue();
//自動拆箱
char c6 =c4;
//輸出結果,測驗驗證
System.out.println(c1);
System.out.println(c4);
System.out.println(c5);
System.out.println(c6);
}
/**
* Boolean
*/
@Test
public void test3(){
boolean b1=true; //定義基本資料型別(布爾型)
//自動裝箱,用于后面拆箱
Boolean b4=b1;
//包裝類轉化為基本資料型別
//手動拆箱
boolean b5=b2.booleanValue();
//自動拆箱
boolean b6=b2;
//輸出結果,測驗驗證
System.out.println(b1);
System.out.println(b4);
System.out.println(b5);
System.out.println(b6);
}
}
包裝類常見的API
基本資料型別和字串之間的轉換
(1)把基本資料型別轉為字串(呼叫valueOf()方法)
import org.junit.Test;
public class Demo8 {
/**
* 基本資料型別轉化為字符型
*/
@Test
public void test(){
int a = 10; //定義基本資料型別
//String str = a;//不能直接轉換
//方式一:
String str = a + "";
//方式二:
String str1 = String.valueOf(a);
}
}
(2)把字串轉為基本資料型別
String轉換成對應的基本型別 ,除了Character類之外,其他所有包裝類都具有parseXxx()靜態方法可以將字串引數轉換為對應的基本型別:
public static byte parseByte(String s):將字串引數轉換為對應的byte基本型別,public static short parseShort(String s):將字串引數轉換為對應的short基本型別,public static int parseInt(String s):將字串引數轉換為對應的int基本型別,public static long parseLong(String s):將字串引數轉換為對應的long基本型別,public static float parseFloat(String s):將字串引數轉換為對應的float基本型別,public static double parseDouble(String s):將字串引數轉換為對應的double基本型別,public static boolean parseBoolean(String s):將字串引數轉換為對應的boolean基本型別,
int a = Integer.parseInt("整數的字串");
double a = Double.parseDouble("小數的字串");
boolean b = Boolean.parseBoolean("true或false");
注意: 如果字串引數的內容無法正確轉換為對應的基本型別,
則會拋出java.lang.NumberFormatException例外,
資料型別的最大值和最小值
求某個資料型別的最大值和最小值,直接呼叫MAX_VALUE和MIN_VALUE方法
import org.junit.Test;
public class Demo8 {
/**
* Integer型別的最大值和最小值(其他類似)
*/
@Test
public void test1(){
//最大值
int maxValue = Integer.MAX_VALUE;
//最小值
int minValue = Integer.MIN_VALUE;
//輸出結果,驗證測驗
System.out.println(maxValue);
System.out.println(minValue);
}
}
轉大小寫
如果轉包裝型別的大小寫,則需要呼叫toUpperCase()方法和toLowerCase()方法
import org.junit.Test;
public class Demo8 {
/**
* Character轉大小寫
*/
@Test
public void test2(){
char x1 = Character.toUpperCase('x');
char x2 = Character.toLowerCase('X');
System.out.println(x1);
System.out.println(x2);
}
}
轉進制
如果轉包裝型別的進制,則需要呼叫對應方法(二進制toBinaryString(),十六進制toHexString(),八進制toOctalString())
package com.atguigu.demo;
import org.junit.Test;
public class Demo8 {
/**
* 轉進制
*/
@Test
public void test3(){
int i = 6; //十進制的6
String s1 = Integer.toBinaryString(i); //二進制
String s2 = Integer.toHexString(i); //十六進制
String s3 = Integer.toOctalString(i); //八進制
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
}
}
包裝類物件的快取問題
介紹
有一部分包裝類提供了物件的快取,對于頻繁使用的包裝類物件,其類在初始化時就會提前創建好物件,當需要使用該包裝類的物件時,如果該物件包裝的值在快取的范圍內(這個范圍是在Java原始碼中設定的),就回傳快取的物件;當該物件的值大于快取的范圍,就會創建新的物件并回傳,
下面以Integer的原始碼進行說明
Integer i = 10; //自動裝箱,默認會呼叫valueOf方法
/**
* Integer的自動裝箱原始碼
*/
public static Integer valueOf(int i) {
//判斷i的值,是否在一個范圍 -128 ~ 127 從陣列中取值(地址)
if (i >= IntegerCache.low && i <= IntegerCache.high)
//如果值在這個范圍,回傳一個陣列中的值
return IntegerCache.cache[i + (-IntegerCache.low)];
//如果不在這個范圍,new一個(和自己new的物件沒區別)
return new Integer(i);
}
各個包裝類對應的快取物件大小如下表:
| 包裝類 | 快取物件 |
|---|---|
| Byte | -128~127 |
| Short | -128~127 |
| Integer | -128~127 |
| Long | -128~127 |
| Float | 沒有 |
| Double | 沒有 |
| Character | 0~127 |
| Boolean | true和false |
面試常考
包裝類中“== ”與equals的用法比較,可以算是非常重要的考點了,
包裝類中的equals方法和String類一樣,都是重寫了Object類中的equals方法,因此比較的是內容而不是地址,而“= =”比較的依然是參考變數的地址,只是當包裝型別和與之相對應的基本型別進行“==”比較時會先做自動拆箱處理,具體可以分類如下:
- ①如果在默認范圍內的自動裝箱,則相等(比較地址)
- ②如果比較的物件有自己new的,則不相等(比較地址)
- ③如果比較的物件值不在范圍內部也是不想等的(比較地址)
- ④如果有基本資料型別參與對比,包裝型別就會自動拆箱,就會變成了基本資料型別的對比,
這個時候比的就是值了,
常見筆試或面試問題舉例
import org.junit.Test;
public class Demo9 {
@Test
public void test(){
Integer i1 = 10; //1. Integer這個類會加載 2. 在創建i2這個區域變數
Integer i2 = 10;
System.out.println(i1 == i2); //true 對比地址
Integer i3 = new Integer(10);
System.out.println(i1 == i3); //false 對比地址
Integer i4 =300;
Integer i5 =300;
System.out.println(i4 == i5);//false 對比地址
Integer i6 = 300;
int i7 = 300;
System.out.println(i6 == i7); //true 對比值(因為有基本資料型別(i6會轉為int在對比) )
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/397634.html
標籤:java
