包裝類的定義,API的使用和快取問題
包裝類
Java提供了兩個型別系統,基本型別與引用型別,使用基本型別在於效率,然而當要使用只針對物件設計的API或新特性(例如泛型),那麼基本資料型別的資料就需要用包裝類來包裝。
序號 | 基本資料型別 | 包裝類(java.lang包) |
---|---|---|
1 | byte | Byte |
2 | short | Short |
3 | int | Integer |
4 | long | Long |
5 | float | Float |
6 | double | Double |
7 | char | Character |
8 | boolean | Boolean |
9 | void | Void |
一, 裝箱與拆箱
裝箱:把基本資料型別轉為包裝類物件。
轉為包裝類的物件,是為了使用專門為物件設計的API和特性
拆箱:把包裝類物件拆為基本資料型別。
轉為基本資料型別,一般是因為需要運算,Java中的大多數運算子是為基本資料型別設計的。比較、算術等
基本數值---->包裝物件
Integer i1 = new Integer(4);//使用建構函式函式
Integer i2 = Integer.valueOf(4);//使用包裝類中的valueOf方法
包裝物件---->基本數值
Integer i1 = new Integer(4);
int num1 = i1.intValue();
JDK1.5之後,可以自動裝箱與拆箱。
注意:只能與自己對應的型別之間才能實現自動裝箱與拆箱。
Integer i = 4;//自動裝箱。相當於Integer i = Integer.valueOf(4);
i = i + 5;//等號右邊:將i物件轉成基本數值(自動拆箱) i.intValue() + 5;
//加法運算完成後,再次裝箱,把基本數值轉成物件。
Integer i = 1;
Double d = 1;//錯誤的,1是int型別
總結:物件(引用資料型別)能用的運算子有哪些?
(1)instanceof
(2)=:賦值運算子
(3)==和!=:用於比較地址,但是要求左右兩邊物件的型別一致或者是有父子類繼承關係。
(4)對於字串這一種特殊的物件,支援“+”,表示拼接。
二,包裝類的一些API
1、基本資料型別和字串之間的轉換
(1)把基本資料型別轉為字串
int a = 10;
//String str = a;//錯誤的
//方式一:
String str = a + "";
//方式二:
String str = String.valueOf(a);
(2)把字串轉為基本資料型別
String轉換成對應的基本型別 ,除了Character類之外,其他所有包裝類都具有parseXxx靜態方法可以將字串引數轉換為對應的基本型別,例如:
-
public static int parseInt(String s)
:將字串引數轉換為對應的int基本型別。 -
public static long parseLong(String s)
:將字串引數轉換為對應的long基本型別。 -
public static double parseDouble(String s)
:將字串引數轉換為對應的double基本型別。
或把字串轉為包裝類,然後可以自動拆箱為基本資料型別
-
public static Integer valueOf(String s)
:將字串引數轉換為對應的Integer包裝類,然後可以自動拆箱為int基本型別 -
public static Long valueOf(String s)
:將字串引數轉換為對應的Long包裝類,然後可以自動拆箱為long基本型別 -
public static Double valueOf(String s)
:將字串引數轉換為對應的Double包裝類,然後可以自動拆箱為double基本型別
注意:如果字串引數的內容無法正確轉換為對應的基本型別,則會丟擲java.lang.NumberFormatException
異常。
int a = Integer.parseInt("整數的字串");
double d = Double.parseDouble("小數的字串");
boolean b = Boolean.parseBoolean("true或false");
int a = Integer.valueOf("整數的字串");
double d = Double.valueOf("小數的字串");
boolean b = Boolean.valueOf("true或false")
2、資料型別的最大最小值
Integer.MAX_VALUE和Integer.MIN_VALUE
Long.MAX_VALUE和Long.MIN_VALUE
Double.MAX_VALUE和Double.MIN_VALUE
3、字元轉大小寫
Character.toUpperCase('x');
Character.toLowerCase('X');
4、整數轉進位制
Integer.toBinaryString(int i)
Integer.toHexString(int i)
Integer.toOctalString(int i)
三,包裝類物件的快取問題
包裝類 | 快取物件 |
---|---|
Byte | -128~127 |
Short | -128~127 |
Integer | -128~127 |
Long | -128~127 |
Float | 沒有 |
Double | 沒有 |
Character | 0~127 |
Boolean | true和false |
Integer i = 1;
Integer j = 1;
System.out.println(i == j);//true
Integer i = 128;
Integer j = 128;
System.out.println(i == j);//false
Integer i = new Integer(1);//新new的在堆中
Integer j = 1;//這個用的是緩衝的常量物件,在方法區
System.out.println(i == j);//false
Integer i = new Integer(1);//新new的在堆中
Integer j = new Integer(1);//另一個新new的在堆中
System.out.println(i == j);//false
@Test
public void test3(){
Double d1 = 1.0;
Double d2 = 1.0;
System.out.println(d1==d2);//false 比較地址,沒有快取物件,每一個都是新new的
}
四,面試題
1、型別轉換問題
@Test
public void test4(){
Double d1 = 1.0;
double d2 = 1.0;
System.out.println(d1==d2);//true 和基本資料型別比較會自動拆箱,比較資料值
}
@Test
public void test2(){
Integer i = 1000;
double j = 1000;
System.out.println(i==j);//true 會先將i自動拆箱為int,然後根據基本資料型別“自動型別轉換”規則,轉為double比較
}
@Test
public void test(){
Integer i = 1000;
int j = 1000;
System.out.println(i==j);//true 會自動拆箱,按照基本資料型別進行比較
}
2、不可變物件
public class TestExam {
public static void main(String[] args) {
int i = 1;
Integer j = new Integer(2);
Circle c = new Circle();
change(i,j,c);
System.out.println("i = " + i);//1
System.out.println("j = " + j);//2
System.out.println("c.radius = " + c.radius);//10.0
}
/*
* 方法的引數傳遞機制:
* (1)基本資料型別:形參的修改完全不影響實參
* (2)引用資料型別:通過形參修改物件的屬性值,會影響實參的屬性值
* 這類Integer等包裝類物件是“不可變”物件,即一旦修改,就是新物件,和實參就無關了
*/
public static void change(int a ,Integer b,Circle c ){
a += 10;
// b += 10;//等價於 b = new Integer(b+10);
c.radius += 10;
/*c = new Circle();
c.radius+=10;*/
}
}
class Circle{
double radius;
}
相關文章
- Redis 的高效能快取機制的三類問題:快取擊穿、快取雪崩 和 快取穿透Redis快取穿透
- 快取的問題快取
- vue中methods中的方法閉包快取問題Vue快取
- 包裝類的使用
- 快取頭Cache-Control的含義和使用快取
- CDN加速快取的定義與作用快取
- Laravel 8 dingo/api 清理快取404問題LaravelGoAPI快取
- 內部類中的成員的定義和使用
- Mybatis 一級快取和引發的問題MyBatis快取
- 程式碼解決快取穿透和快取雪崩問題快取穿透
- 面向1-類和物件-方法、new的定義和使用物件
- 快取 Laravel 模型的小問題快取Laravel模型
- JQuery中ajax的使用與快取問題的解決方法jQuery快取
- 類的定義
- Fresco的封裝和使用說明以及獲取快取中的Bitmap物件封裝快取物件
- 快取問題(一) 快取穿透、快取雪崩、快取併發 核心概念快取穿透
- 使用雙快取解決 Canvas clearRect 引起的閃屏問題快取Canvas
- 變數的定義和使用變數
- 如何定義良好的API?API
- 快取問題(四) 快取穿透、快取雪崩、快取併發 解決案例快取穿透
- 高併發快取面臨的問題快取
- yii別名的定義和別名的獲取以及別名的使用
- Springboot mini - Solon詳解(八)- Solon的快取框架使用和定製Spring Boot快取框架
- 包裝類的作用
- npm安裝全域性包的問題NPM
- javaSE-day04--ArrayList基本用方法、類內定義方法和方法過載、靜態方法static(類的方法)、工具方法(static)的定義和使用Java
- 聊一聊Integer的快取機制問題快取
- 前端使用 gulp 解決多專案快取問題前端快取
- Redis快取穿透、快取雪崩、redis併發問題分析Redis快取穿透
- 如何優雅的設計和使用快取?快取
- Shell中函式的定義和使用函式
- Java中的包裝類Java
- Redis 面試常見問題———快取雪崩、快取擊穿以及快取穿透Redis面試快取穿透
- [20191204]sqlplus特殊定義導致的問題.txtSQL
- 同時使用執行緒本地變數以及物件快取的問題執行緒變數物件快取
- 專案中遇到的RediS快取問題及面試問題總結Redis快取面試
- c#抽象類的定義C#抽象
- 使用 nvm 後,npm 安裝全域性包問題NPM