認識Java的整形數據結構

来源:https://www.cnblogs.com/huaweiyun/archive/2022/09/21/16716258.html
-Advertisement-
Play Games

摘要:java中一切都是對象,為什麼int不用創建對象實例化,而可以直接使用? 本文分享自華為雲社區《【Java】對基本類型-整型數據結構的認識》,作者: huahua.Dr 。 整型數據類型有兩個:基本類型和引用類型(包裝類) 整數型基本類型:byte,int,short,long 其引用類型:B ...


摘要:java中一切都是對象,為什麼int不用創建對象實例化,而可以直接使用?

本文分享自華為雲社區《【Java】對基本類型-整型數據結構的認識》,作者: huahua.Dr 。

整型數據類型有兩個:基本類型和引用類型(包裝類)

整數型基本類型:byte,int,short,long

其引用類型:Byte,Integer,Short,Long

他們之前主要的區別在於:

  1. 存儲占用的空間不同,分別是1,2,4,8個位元組(每個位元組占用8bit),
  2. java裡面整數型預設使用的int數據類型,即如果直接寫整數字面量時,它表示的就是int類型,
  3. 整數型數據類型之間可以相互轉換,以int為預設中間類型,定義了一個整數值4,可以直接賦值給int,
  4. 也可以直接賦值給short和byte(只要數值範圍不超過byte和short的存儲範圍,可以自動向下轉型為byte或者short;如果超過則需要強轉但超過的高位數會丟失),也可以直接賦值給long,不需要強轉,會自動向上轉型。
  5. long數據類型可以直接使用L或l聲明
  6. 他們之間可以直接轉,只要數值範圍大於等於它的數值範圍,都可以直接轉;如果小於它的數值範圍就需要強轉,但強轉會導致數值丟失,編譯並不會報錯。

其他的基本相同;因此我們以int類型來展開詳細說明。

java中一切都是對象,為什麼int不用創建對象實例化,而可以直接使用?

單純是為了編程方便,引入基本類型。

既然引入了基本對象,那也不能破壞java是一個操作對象的語言吧?

所以後面引入了包裝類(wrapper class),為每種基本類型都引入了其對應的包裝類型,int基本類型的包裝類型就是Integer對象。

基本類型引入了包裝類型就能將,int基本類型就能像操作對象一樣去操作了嗎?

是的,還Java1.55引入了一個機制:自動拆箱和自動裝箱,使得基本類型和其對應的包裝類型可以相互轉換,原始基本類型可以自動轉換成對應的包裝對象。

基本類型和包裝類型是何時進行相互轉化,如何相互轉換?

自動拆箱與裝箱機制,可以在java變數賦值或者方法調用傳值與返回值或者容器存儲數據時直接使用基本類型或者對應的包裝類型;在java 1.5版本之前,使用容器集合(Collection)存儲數據時,只能存儲引用類型,需要存儲基本類型,則需要先將其轉成其對應的包裝類型才可以。

自動裝箱就是java自動的將基本類型數值轉換成其對應的包裝類型,自動裝箱時編譯器會自動調用其包裝類的valueOf()方法將基本類型數值轉成對象。

自動拆箱就是java自動將包裝類型轉換成其對應的基本類型,自動拆箱時編譯器會自動調用其包裝類的xxxValue()方法:如intValue()\doubleValue()\longValue()等將對象轉成基本類型數值。

當基本數據數值與包裝類型進行運算時,會觸發自動拆箱。

例子:

//before autoboxing
Integer iObject = Integer.valueOf(3);
Int iPrimitive = iObject.intValue()
//after java5
Integer iObject = 3; //autobxing - primitive to wrapper conversion
int iPrimitive = iObject; //unboxing - object to primitive conversion
public static Integer show(Integer iParam){
 System.out.println("autoboxing example - method invocation i: " + iParam);
   return iParam;
}
//autoboxing and unboxing in method invocation
show(3); //autoboxing
int result = show(3); //unboxing because return type of method is Integer

那自動拆箱和裝箱那麼方便,它有什麼缺點嗎?

由於編譯器的介入,增加了操作步驟和工作量,如果頻繁自動拆箱和裝箱,會影響程式性能:

Integer sum = 0;
 for(int i=1000; i<5000; i++){
   sum+=i;
}

上面的代碼sum+=i可以看成sum = sum + i,但是+這個操作符不適用於Integer對象,首先sum進行自動拆箱操作,進行數值相加操作,最後發生自動裝箱操作轉換成Integer對象。其內部變化如下:

int result = sum.intValue() + i;
Integer sum = new Integer(result);

由於我們這裡聲明的sum為Integer類型,在上面的迴圈中會創建將近4000個無用的中間 Integer對象,在這樣龐大的迴圈中,會降低程式的性能並且加重了GC垃圾回收的工作量。因此在我們編程時,需要註意到這一點,正確地聲明變數類型,避免因為自動裝箱引起的性能問題。

還有一個問題:如果int與Integer混用,Integer自動拆箱成int時,會調用Integer.intValue()方法進行拆箱,如果Integer賦值為null,M那麼此時就會出現空指針異常。

如果一個類中有兩個重載方法,一個重載方法的參數是int基本類型,一個是Integer引用類型,那麼調用該方法時,會自動拆箱或裝箱嗎,實際會調用到那個方法?

Java1.5之前肯定是會根據實際參數是基本類型還是引用類型來選擇對應的方法;但是java1.5之後,有了自動拆箱和裝箱機制之後,也是不會觸發該機制的。也是根據實際參數類型來選擇對應的方法調用。下麵我們用實際代碼來說明一下:

public class Test {
    public static void main(String[] args) throws FileNotFoundException {
        Test test = new Test();
        int para1 = 12;
        Integer para2 = 12;
 test.test(12);
 test.test(para2);
    }
    public void test(int para1) {
 System.out.println("我的參數是int基本類型,值:"+para1);
    }
    public void test(Integer para2) {
 System.out.println("我的參數是Integer類型,值:"+para2);
    }
}

輸出:

我的參數是int基本類型,值:12

我的參數是Integer類型,值:12

那麼基本類型int與包裝類型Integer,數值進行比較是否相等會出現什麼情況?

情況有三種:==比較的是地址,對象Object的equals方法比較的也是地址,只不過包裝類型重寫了Object方法,比較的數值。

  1. int與int比較是否相等,使用==進行兩個數值相等的int比較,結果是true
  2. Integer與Integer比較是否相等,-128到127的Integer兩個數值相等的對象使用==比較結果是true,應為JVM為了省記憶體會將該範圍的數值緩存起來,共用一個Integer對象;該範圍以外的==比較結果是false;如果都是重新new 的兩個數值相等的Integer對象,==也是false,需要使用Integer對象的equals方法,比較才是true,
  3. int與Integer比較是否相等,Integer會自動拆箱,返回的結果是true.
 // Example 1: == comparison pure primitive – no autoboxing
        int i1 = 1;
        int i2 = 1;
 System.out.println("i1==i2 : " + (i1 == i2)); // true
        // Example 2: equality operator mixing object and primitive
        Integer num1 = 1; // autoboxing
        int num2 = 1;
 System.out.println("num1 == num2 : " + (num1 == num2)); // true
        // Example 3: special case - arises due to autoboxing in Java
        Integer obj1 = 1; // autoboxing will call Integer.valueOf()
        Integer obj2 = 1; // same call to Integer.valueOf() will return same
        // cached Object
 System.out.println("obj1 == obj2 : " + (obj1 == obj2)); // true
        // Example 4: equality operator - pure object comparison
        Integer one = new Integer(1); // no autoboxing
        Integer anotherOne = new Integer(1);
 System.out.println("one == anotherOne : " + (one == anotherOne)); // false
        int num3 = 129;
        Integer obj3 = 129;
 System.out.println("num3==obj3:"+(num3==obj3));// true

 

點擊關註,第一時間瞭解華為雲新鮮技術~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 案例 學習網址:https://seaborn.pydata.org/examples/errorband_lineplots.html import seaborn as sns import pandas as pd sns.set_theme(style="darkgrid") # 導入數據 ...
  • 前言 工欲善其事,必先利其器。本篇文章我們介紹下 Terraform,為後續創建各種雲資源做準備,比如Kubernetes 關鍵詞:IaC, Infrastructure as Code, Terraform, 基礎架構即代碼,Terraform 例子, Terraform 入門,Terraform ...
  • 顧名思義,子流程是一個包含其他活動、網關、事件等的活動,這些活動本身形成了一個流程,該流程是更大流程的一部分。 使用子流程確實有一些限制: 一個子流程只能有一個none類型的啟動事件,不允許有其他類型的啟動事件。一個子流程必須至少有一個結束事件。(請註意,BPMN 2.0 規範允許在子流程中省略開始 ...
  • Docker安裝和卸載 一,已安裝Docker,卸載Docker 1.方法一 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-l ...
  • Django_模型ORM Django中內嵌了ORM框架,不需要直接編寫SQL語句進行資料庫操作,而是通過定義模型類,操作模型類來完成對資料庫中表的增刪改查和創建等操作。 O是object,也就類對象的意思。 R是relation,翻譯成中文是關係,也就是關係資料庫中數據表的意思。 M是mappin ...
  • 17.1遠程資源授權準備 17.1.1認證和訪問流程圖 參考:http://www.zyiz.net/tech/detail-141309.html 17.1.2為用戶指定角色 可以使用ROLE_USER和ROLE_ADMIN 兩種角色 17.1.3添加認證服務和資源服務 17.1.4配置客戶端的認 ...
  • 零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES 特效 零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> O ...
  • “為什麼加索引能提升查詢效率”! 我們都認為“加索引”提升查詢效率是理所應當的 竟然還有理由? 該怎麼回答呢? 大家好,我是Mic,一個工作了14年的Java程式員 下麵分析一下這個問題的考察點 考察目標 這是一道原理性的問題,考察求職者對於Mysql中索引的實現原理的理解程度。 一般情況下,考察3 ...
一周排行
    -Advertisement-
    Play Games
  • 一:背景 1.講故事 在分析的眾多dump中,經常會遇到各種奇葩的問題,僅通過dump這種快照形式還是有很多問題搞不定,而通過 perfview 這種粒度又太粗,很難找到問題之所在,真的很頭疼,比如本篇的 短命線程 問題,參考圖如下: 我們在 t2 時刻抓取的dump對查看 短命線程 毫無幫助,我根 ...
  • 在日常後端Api開發中,我們跟前端的溝通中,通常需要協商好入參的數據類型,和參數是通過什麼方式存在於請求中的,是表單(form)、請求體(body)、地址欄參數(query)、還是說通過請求頭(header)。 當協商好後,我們的介面又需要怎麼去接收這些數據呢?很多小伙伴可能上手就是直接寫一個實體, ...
  • 許多情況下我們需要用到攝像頭獲取圖像,進而處理圖像,這篇博文介紹利用pyqt5、OpenCV實現用電腦上連接的攝像頭拍照並保存照片。為了使用和後續開發方便,這裡利用pyqt5設計了個相機界面,後面將介紹如何實現,要點包括界面設計、邏輯實現及完整代碼。 ...
  • 思路分析 註冊頁面需要對用戶提交的數據進行校驗,並且需要對用戶輸入錯誤的地方進行提示! 所有我們需要使用forms組件搭建註冊頁面! 平時我們書寫form是組件的時候是在views.py裡面書寫的, 但是為了接耦合,我們需要將forms組件都單獨寫在一個地方,需要用的時候導入就行! 例如,在項目文件 ...
  • 思路分析 登錄頁面,我們還是採用ajax的方式提交用戶數據 唯一需要學習的是如何製作圖片驗證碼! 具體的登錄頁面效果圖如下: 如何製作圖片驗證碼 推導步驟1:在img標簽的src屬性里放上驗證碼的請求路徑 補充1.img的src屬性: 1.圖片路徑 2.url 3.圖片的二進位數據 補充2:字體樣式 ...
  • 哈嘍,兄弟們! 最近有許多小伙伴都在吐槽打工好難。 每天都是執行許多重覆的任務 例如閱讀新聞、發郵件、查看天氣、打開書簽、清理文件夾等等, 使用自動化腳本,就無需手動一次又一次地完成這些任務, 非常方便啊有木有?! 而在某種程度上,Python 就是自動化的代名詞。 今天就來和大家一起學習一下, 用 ...
  • 作者:IT王小二 博客:https://itwxe.com 前面小二介紹過使用Typora+PicGo+LskyPro打造舒適寫作環境,那時候需要使用水印功能,但是小二在升級LskyPro2.x版本發現有很多不如人意的東西,遂棄用LskyPro使用MinIO結合代碼實現自己需要的圖床功能,也適合以後 ...
  • OpenAI Gym是一款用於研發和比較強化學習演算法的工具包,本文主要介紹Gym模擬環境的功能和工具包的使用方法,並詳細介紹其中的經典控制問題中的倒立擺(CartPole-v0/1)問題。最後針對倒立擺問題如何建立控制模型並採用爬山演算法優化進行了介紹,並給出了相應的完整python代碼示例和解釋。要... ...
  • python爬蟲瀏覽器偽裝 #導入urllib.request模塊 import urllib.request #設置請求頭 headers=("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, l ...
  • 前端代碼搭建 主要利用的是bootstrap3中js插件里的模態框版塊 <li><a href="" data-toggle="modal" data-target=".bs-example-modal-lg">修改密碼</a></li> <div class="modal fade bs-exam ...