包裝類的定義,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;
}
相關文章
- Java面試題之包裝類快取機制Java面試題快取
- 快取的問題快取
- 再學Java 之 Integer 包裝類快取Java快取
- jdon框架的aop和快取問題框架快取
- vue中methods中的方法閉包快取問題Vue快取
- 快取同步的問題快取
- CDN加速快取的定義與作用快取
- Mybatis 一級快取和引發的問題MyBatis快取
- 內部類中的成員的定義和使用
- Laravel 8 dingo/api 清理快取404問題LaravelGoAPI快取
- 程式碼解決快取穿透和快取雪崩問題快取穿透
- session定義使用和丟失問題小結Session
- 快取頭Cache-Control的含義和使用快取
- 面向1-類和物件-方法、new的定義和使用物件
- Entrust 在使用 Redis 做快取引擎的時候,快取不更新的問題RustRedis快取
- 快取 Laravel 模型的小問題快取Laravel模型
- 關於JdonFramework的快取問題Framework快取
- JQuery中ajax的使用與快取問題的解決方法jQuery快取
- oracle預定義的包使用小記Oracle
- beego快取問題Go快取
- SOAP快取問題快取
- jquery ajax請教的快取問題jQuery快取
- nginx DNS 解析快取的更新問題NginxDNS快取
- Hibernate中的Session快取問題Session快取
- 關於 Hibernate快取的問題快取
- 請教關於快取的問題快取
- Fresco的封裝和使用說明以及獲取快取中的Bitmap物件封裝快取物件
- Redis分散式快取安裝和使用Redis分散式快取
- 快取問題(一) 快取穿透、快取雪崩、快取併發 核心概念快取穿透
- hibernate的查詢快取和二級快取的配合使用快取
- Poechant 練習 Java API - 包裝類JavaAPI
- 使用雙快取解決 Canvas clearRect 引起的閃屏問題快取Canvas
- IE瀏覽器中ajax使用快取資料的問題瀏覽器快取
- 使用全表掃描快取大表的相關問題快取
- 快取問題(四) 快取穿透、快取雪崩、快取併發 解決案例快取穿透
- 如何定義良好的API?API
- 談談關於前端的快取的問題前端快取
- 變數的定義和使用變數