java cron工具類_Java工具類之:包裝類

我們都知道,JDK 其實給我們提供了很多很多 Java 開發者已經寫好的現成的類,他們其實都可以理解成工具類,比如我們常見的集合類,日期相關的類,數學相關的類等等,有了這些工具類,你會發現它能很大程度的幫你節省時間,能很方便的實現你的需求。當然,沒有這些包,你也能實現你的需求,但是你需要時間,今天我們主要是來學習一下包裝類。

27b1435de3052affdba6477c573f7f8d.png

一、包裝類介紹

1、為什么需要包裝類?

我們知道 Java 語言是一個面向對象的編程語言,但是 Java 中的基本數據類型卻不是面向對象的,但是我們在實際使用中經常需要將基本數據類型轉換成對象,便于操作,比如,集合的操作中,這時,我們就需要將基本類型數據轉化成對象,所以就出現了包裝類。

2、包裝類是什么呢?

包裝類,顧名思義就是將什么經過包裝的類,那么是將什么包裝起來的呢,顯然這里是將基本類型包裝起來的類。包裝類的作用就是將基本類型轉成對象,將基本類型作為對象來處理。

Java 中我們知道,基本數據類型有8個,所以對應的包裝類也是8個,包裝類就是基本類型名稱首字母大寫。但Integer 和 Character 例外,它們顯示全稱,如下面表格所示:

基本數據類型對應包裝類byteByteshortShortintIntegerlongLongfloatFloatdoubleDoublecharCharacterbooleanBoolean

27b1435de3052affdba6477c573f7f8d.png

二、包裝類的繼承關系

通過閱讀 Java8 的 API 官方文檔或者看源代碼我們可以得知8個包裝類的繼承關系如下:

1c5b8d4634d99be6b25d0cd09058590b.png

通過以上的繼承關系圖,我們其實可以這樣記憶,包裝類里面有6個與數字相關的都是繼承自 Number 類,而其余兩個不是與數字相關的都是默認繼承 Object 類。通過看 API 官方文檔,我們還可以得知這8個包裝類都實現了Serializable , Comparable 接口。比如下圖的 Integer 類

public final class Integer extends Number implements Comparable<Integer> {}

27b1435de3052affdba6477c573f7f8d.png

三、包裝類的使用方法(基本操作)

接下來關于包裝類的講解我就講Integer包裝類,其他的都依此類推,用法和操作都是差不多的,只是名字不一樣而已。

1、包裝類的構造方法

8個包裝類都有帶自己對應類型參數的構造方法,其中8個包裝類中除了Character還有構造方法重載,參數是String類型的。

Integer one = new Integer(666);Integer two = new Integer("666");

2、包裝類的自動拆裝箱

在了解自動拆裝箱之前,我們得先知道什么是拆箱和裝箱。其實拆裝箱主要應對基本類型與包裝類型的相互轉換問題。

  • **裝箱:**將基本類型轉換成包裝類型的過程叫做裝箱。
  • **拆箱:**將包裝類型轉換成基本類型的過程叫做拆箱。

其實,在 JDK1.5 版本之前,是沒有自動拆裝箱的,開發人員要手動進行裝拆箱:

//手動裝箱,也就是將基本類型10轉換為引用類型
Integer integer = new Integer(10);
//或者
Integer integer1 = Integer.valueOf(10);
//手動拆箱,也就是將引用類型轉換為基本類型
int num = integer.intValue();

而在在 JDK1.5 版本之后,為了減少開發人員的工作,提供了自動裝箱與自動拆箱的功能。實現了自動拆箱和自動裝箱,如下方代碼所示:

//自動裝箱
Integer one = 1;
//自動拆箱
int two = one + 10;

其實以上兩種方式本質上是一樣得,只不過一個是自動實現了,一個是手動實現了。至于自動拆裝箱具體怎么實現的我這里不做深入研究。

27b1435de3052affdba6477c573f7f8d.png

四、包裝類的緩存機制

我們首先來看看以下代碼,例1:

public static void main(String[] args) {Integer i1 = 100; Integer i2 = 100; Integer i3 = new Integer(100);Integer i4 = new Integer(100);System.out.println(i1 == i2);
//true  System.out.println(i1 == i3);
//false  System.out.println(i3 == i4);
//false  System.out.println(i1.equals(i2));
//true  System.out.println(i1.equals(i3));
//true  System.out.println(i3.equals(i4));
//true
}

當我們修改了值為200的時候,例2:

public static void main(String[] args) {  
Integer i1 = 200; Integer i2 = 200; Integer i3 = new Integer(200); Integer i4 = new Integer(200);  
System.out.println(i1 == i2);
//false  System.out.println(i1 == i3);
//false  System.out.println(i3 == i4);
//false  System.out.println(i1.equals(i2));
//true  System.out.println(i1.equals(i3));
//true  System.out.println(i3.equals(i4));
//true
}

通過上面兩端代碼,我們發現修改了值,第5行代碼的執行結果竟然發生了改變,為什么呢?首先,我們需要明確第1行和第2行代碼實際上是實現了自動裝箱的過程,也就是自動實現了 Integer.valueOf 方法,其次,==比較的是地址,而 equals 比較的是值(這里的 eauals 重寫了,所以比較的是具體的值),所以顯然最后五行代碼的執行結果沒有什么疑惑的。既然==比較的是地址,例1的第5行代碼為什么會是true呢,這就需要我們去了解包裝類的緩存機制。

其實看Integer類的源碼我們可以發現在第780行有一個私有的靜態內部類,如下:

private static class IntegerCache {  static final int low = -128;   static final int high;  static final Integer cache[];static {  // high value may be configured by property    int h = 127;    String integerCacheHighPropValue =   sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");  if (integerCacheHighPropValue != null) {  try {             int i = parseInt(integerCacheHighPropValue);   i = Math.max(i, 127);         // Maximum array size is Integer.MAX_VALUE    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);         } 
catch( NumberFormatException nfe) {  // If the property cannot be parsed into an int, ignore it.      }     }      high = h;cache = new Integer[(high - low) + 1];     int j = low;     for(int k = 0; k < cache.length; k++)       cache[k] = new Integer(j++);// range [-128, 127] must be interned (JLS7 5.1.7)      assert IntegerCache.high >= 127;   }private IntegerCache() {
}
}

我們知道,靜態的內部類是在整個 Integer 加載的時候就已經加載完成了,以上代碼初始化了一個 Integer 類型的叫 cache 的數組,取值范圍是[-128, 127]。緩存機制的作用就是提前實例化相應范圍數值的包裝類對象,只要創建處于緩存范圍的對象,就使用已實例好的對象。從而避免重復創建多個相同的包裝類對象,提高了使用效率。如果我們用的對象范圍在[-128, 127]之內,就直接去靜態區找對應的對象,如果用的對象的范圍超過了這個范圍,會幫我們創建一個新的 Integer 對象,其實下面的源代碼就是這個意思:

public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high)   return IntegerCache.cache[i + (-IntegerCache.low)];  return new Integer(i);
}

所以 例1 代碼里,i1 和i2 是100,值的范圍在[-128, 127],所以直接區靜態區找,所以i1和i2指向的地址是同一個,所以 i1==i2;而在例2的代碼里,i1 和i2 是200,值的范圍不在在[-128, 127],所以分別創建了一個新的對象,放在了堆內存里,各自指向了不同的地址,所以地址都不同了,自然 i1 不等于 i2。

通過分析源碼我們可以發現,只有 double 和 float 的自動裝箱代碼沒有使用緩存,每次都是 new 新的對象,其它的6種基本類型都使用了緩存策略。使用緩存策略是因為,緩存的這些對象都是經常使用到的(如字符、-128至127之間的數字),防止每次自動裝箱都創建一次對象的實例。

27b1435de3052affdba6477c573f7f8d.png

五、包裝類和基本數據類型的區別

  • 默認值不同

包裝類的默認值是null,而基本數據類型是對應的默認值(比如整型默認值是0,浮點型默認值是0.0)

  • 存儲區域不同

基本數據類型是把值保存在棧內存里,包裝類是把對象放在堆中,然后通過對象的引用來調用他們

  • 傳遞方式不同

基本數據類型變量空間里面存儲的是值,傳遞的也是值,一個改變,另外一個不變,而包裝類屬于引用數據類型,變量空間存儲的是地址(引用),傳遞的也是引用,一個變,另外一個跟著變。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/385950.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385950.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385950.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql數據庫安裝,真香!

Spring Security觀后感——手繪思維腦(供參考) 手繪的思維導圖&#xff0c;是我自己根據自身的情況讀完這套阿里出品的Spring Security王者晉級文檔之后所繪的&#xff0c;相當于是一個知識的總結與梳理&#xff0c;我將其分為“核心組件”與“工作原理/認證流程”。 Spring Se…

python列表代碼_8種高級的Python列表使用技巧,都給你整理好啦(附實操代碼)...

Python中的列表是我們很常見的數據結構之一&#xff0c;也是很強大的數據結構之一!Python列表功能非常豐富&#xff0c;并且具有很多隱藏的技巧沒有被發現。一、使用Python過濾列表1.使用Filter()函數filter()函數采用兩個參數&#xff1a;函數和可迭代項。 在這種情況下&#…

mysql數據庫實用教程答案

前言 數據庫相關的面試題早已成為了一線互聯網大廠面試的家常菜&#xff0c;如果你對數據庫不太熟悉&#xff0c;我勸你不要輕易面試大廠。那么&#xff0c;為什么數據庫成了大廠面試的家常菜呢&#xff1f;主要原因當然還是海量數據。 無論對于剛入行的小白還是有幾年Java開…

在idea中新建的text文件_開發屬于自己的第一款 IDEA 插件!

往期熱門文章&#xff1a;1、《往期精選優秀博文都在這里了&#xff01;》2、又一個程序員跑路刪庫跑路被抓了&#xff0c;導致服務器癱瘓 36 個小時!3、恕我直言&#xff0c;有了這款 IDEA 插件&#xff0c;你可能只需要寫 30% 的代碼。。。4、Java8 的 Stream API 的確牛X&am…

mysql數據庫開發的36條軍規

前言 一般的小項目&#xff0c;比如幾百人左右訪問的項目&#xff0c;訪問量幾萬的項目&#xff0c;如果想用緩存&#xff0c;單機實例完全夠用。小黃圖就是用的阿里云256MB配置的Redis緩存&#xff0c;日幾千的訪問量是妥妥夠用的了。Redis號稱可以支撐10wqps&#xff0c;當然…

mysql 替換非中文_mysql中的正則操作 匹配手機號,匹配中文,替換

mysql中的正則操作 匹配手機號&#xff0c;匹配中文&#xff0c;替換正則匹配hy_user表內tel字段的電話號碼&#xff1a;SELECT * FROM hy_user WHERE tel REGEXP "[1][35678][0-9]{9}"SELECT tel FROM hy_user WHERE tel REGEXP "[1][35678][0-9]{9}"SELE…

mysql數據庫引擎怎么看,值得收藏!

什么是Service Mesh 作為Service Mesh技術探索和實踐的先行者&#xff0c;全球第一個真正的Service Mesh項目Linkerd負責人、Buoyant公司創始人兼CEO William Morgan第一次完整地闡述了Service Mesh。按照William Morgan的定義&#xff0c;Service Mesh是一個致力于解決服務間…

mysql error -1_【Mysql】SQLException:?Got?error?-1?from?storage?engine?問題解決!

錯誤信息&#xff1a;Caused by: java.sql.BatchUpdateException: Got error -1 from storageengineatcom.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.atcom.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.atorg.apache.spark.sql.…

Mysql 查詢blob數據很慢_blob存入數據庫很慢

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云數據庫專家保駕護航&#xff0c;為用戶…

mysql數據庫文件位置

01 前言 辛苦奮斗兩個月&#xff0c;秋招終于圓滿收官&#xff0c;拿到了頭條、字節、菜鳥、騰訊、網易的offer&#xff0c;這要多虧了意外得到的這份資料文檔&#xff0c;這么多面試全都靠它了&#xff0c;哈哈~~有好東西還是要分享出來給大家&#xff0c;一起學習呀 Java核心…

mysql的altertable_mysqlaltertable修改表命令詳細介紹

MySQL ALTER語法如下&#xff1a;ALTER [IGNORE] TABLE tbl_name alter_spec [, alter_spec ...]alter_specification:ADD [COLUMN] create_definition [FIRST | AFTER column_name ]or ADD INDEX [index_name] (index_col_name,...)or ADD PRIMARY KEY (index_col_name,...)or…

mysql數據庫連接失敗,挑戰大廠重燃激情!

一、阿里 &#xff08;會員中臺&#xff09; 1. Java 重寫hashcode()是否需要重寫equals()&#xff0c;不重寫會有什么后果 2. 并發 自旋鎖和阻塞鎖的區別公平鎖和非公平鎖的區別jdk中哪種數據結構或工具可以實現當多個線程到達某個狀態時執行一段代碼柵欄和閉鎖的區別如何…

mysql 鏈式查詢_MySQL的鏈接查詢

內連接 inner join ....on...../join ....on... &#xff1a;將兩個表中同時符合on條件的記錄查詢出來 inner可以省略select *from person inner join card on person.cardidcard.cardid;外連接 分為左連接、右連接&#xff0c;完全連接左連接&#xff1a;left join ....on…

大廠必備!不斷提升自己創造溢價的能力

前言: 金九銀十過了金三銀四還會遠嘛&#xff0c;本文后面分享面試題給正準備跳槽&#xff0c;準備找工作的你&#xff0c;這次面試字節跳動也是做了很多的準備&#xff0c;還好順利拿到了offer&#xff0c;特分享一下這次的4面技術面真題&#xff0c;可能有些記不全了&#x…

MySQL安裝板多少錢_MySQL安裝板怎么安裝

展開全部1首先&#xff0c;你需要個安裝包&#xff0c;自個去下0如何在官網下載MySQL 數據庫2第一步中&#xff0c;選擇32313133353236313431303231363533e58685e5aeb931333365666165I accept license term,然后Next3默認選第一項Developer Default ,然后Next4這一步中&#xf…

大廠必備!阿里、字節跳動、京東、騰訊、小米等名企高頻面試

一、前言 k8s全稱kubernetes&#xff0c;是目前大熱的一個可移植容器的編排管理工具&#xff0c;像AWS、Azure、Google、阿里云、騰訊云等主流的公有云提供的都是基于k8s的容器服務&#xff0c;很多其他廠商也在努力跟進中&#xff0c;所以說“kubernetes”是目前容器行業中最…

mysql myisam 鎖機制_MySQL--MyISAM之鎖機制

一、概述MySQL有三種鎖的級別&#xff1a;頁級、表級、行級。MyISAM存儲引擎采用的是表級鎖(table-level locking)&#xff1b;MySQL這3種鎖的特性可大致歸納如下&#xff1a;表級鎖&#xff1a;開銷小&#xff0c;加鎖快&#xff1b;不會出現死鎖&#xff1b;鎖定粒度大&#…

大廠架構師經驗分享!成功跳槽字節跳動

前言 毫不夸張地說&#xff0c;JVM是現代軟件工程最成功的案例之一。因為它自帶GC&#xff0c;又有無數可以微調的參數&#xff0c;且運行極其穩定可靠&#xff0c;所以&#xff0c;許多廠商的核心業務系統&#xff0c;才敢放心地用Java編寫&#xff0c;運行在JVM之上。 近幾…

java停車場管理系統程序設計代碼_社區養老服務管理系統,java程序設計

登錄界面菜單功能界面1菜單功能界面2菜單功能界面3社區養老服務管理系統設計與實現springspringMVCmybatis框架對象(javaBean,pojo)設計&#xff1a;服務工單javaBean創建語句如下&#xff1a;package project.model;import org.springframework.format.annotation.DateTimeFor…

大廠面試必問!50w字+的Java技術類校招面試題匯總

前言 剛剛過去的雙十一&#xff0c;讓“高性能”“高可用”“億級”這3個詞變成了技術熱點詞匯&#xff0c;也讓很多人再次萌發成為「架構師」的想法。先問大家一個問題&#xff1a;你覺得把代碼熟練、完成需求加上點勤奮&#xff0c;就能成為架構師么&#xff1f;如果你這么認…