Java隨談(六)我們真的理解 Java 里的整型嗎?

来源:https://www.cnblogs.com/kwanwoo/archive/2022/06/07/16352760.html
-Advertisement-
Play Games

整型是我們日常生活中最常用到的基礎數據類型,看這篇文章之前,我想問: 我們真的像自己認為的那麼理解 Java 內的整型嗎? 也許看完本篇文章你就有自己的答案。 C 語言 提供瞭如下的整型 學習 Java 的整型之前,讓我們看看它的前輩——C 語言的實現。 讓我們更好地瞭解它的設計。 數據類型 占用字 ...


整型是我們日常生活中最常用到的基礎數據類型,看這篇文章之前,我想問:

我們真的像自己認為的那麼理解 Java 內的整型嗎?

也許看完本篇文章你就有自己的答案。

C 語言 提供瞭如下的整型

學習 Java 的整型之前,讓我們看看它的前輩——C 語言的實現。

讓我們更好地瞭解它的設計。

數據類型 占用位元組 取值範圍
signed char 1 byte(8 bit) -2^7, 2^7-1
signed short 2 byte(16 bit) -2^15, 2^15-1
signed int 4 byte(32 bit) -2^31, 2^31-1
signed long 4 byte(32 bit) -2^31, 2^31-1
signed long long 8 byte(64 bit) -2^63, 2^63-1
unsigned char 1 byte(8 bit) 0, 2^8-1
unsigned short 2 byte(16 bit) 0, 2^16-1
unsigned int 4 byte(32 bit) 0, 2^32-1
unsigned long 4 byte(32 bit) 0, 2^32-1
unsigned long long 8 byte(64 bit) 0, 2^64-1

Java 提供瞭如下整型

Java 則簡單了很多。

數據類型 占用位元組 取值範圍
byte 1 byte(8 bit) -2^7, 2^7-1
short 2 byte(16 bit) -2^15, 2^15-1
int 4 byte(32 bit) -2^31, 2^31-1
long 8 byte(64 bit) -2^63, 2^63-1

Java 和 C 整型的區別

  1. C的整型大小與操作系統的位數直接相關, 需要通過 sizeof 運算符先算出預設位數。 Java統一了位數。

  2. C的整型存在 unsigned 和 signed 的區別,而 Java 只有 signed。

    優勢:更簡單,不會遇到 unsigned 和 signed 整型進行運算的隱式轉換問題。

    劣勢:如果碰到 unsigned 的整型,會用存儲容量更大的來存儲。

    例子

    • unsigned byte 在 Java 中存儲為 short
    • unsigned short 在 Java 中存儲為 int
    • unsigned int 在 Java 中存儲為 long
    • unsigned long 在 Java 中存儲為 BigDecimal

    註: java 8 新增了 unsigned 相關的API,可以通過API計算。
    或採用 Guava 的 unsigned整數實現。 例如(com.google.common.primitives.UnsignedInteger)

  3. C 語言存在的整型溢出問題, 而 java.lang.Math包 提供了 xxxExact() 方法。

java 的裝箱問題

原始數據類型 占用位元組 包裝類 占用位元組
byte 1 byte(8 bit) Byte 16 byte(128 bit)
short 2 byte(16 bit) Short 16 byte(128 bit)
int 4 byte(32 bit) Integer 16 byte(128 bit)
long 8 byte(64 bit) Long 16 byte(128 bit)

包裝類的劣勢

  1. 在數據密集型操作中,記憶體消耗會對性能產生巨大影響
  2. 基礎類型存在預設值,而包裝類可能存在 null,引起空指針異常
  3. 基礎類型可以通過 == 判斷大小,包裝類型判斷大小需要用 equals() 方法

包裝類的優勢

  1. 包裝類會緩存實例,減小記憶體消耗。
    比如: Integer 會緩存 -128, 127內的實例
  2. 支持新特性,比如泛型,lambda表達式。
  3. 包裝類提供了對象操作,封裝了一些實用的方法
    比如:
    • Integer 繼承了 Number 類, 可以和其他的 Number 子類進行轉化
    • Integer 實現了 Comparable 介面
    • Integer 存在 unsigned API (java8)
    • Integer 提供了轉化為二、八、十六進位的 API
    • Integer 提供了構造方法,併在其中校驗了入參是否合法
    • Integer 提供了四則運算等算數API

Java 並不完美,它可以更好

從現在往回追溯,Java 的 Integer 事實上源於一個妥協。由於 java 號稱完全面向對象,而在最初的版本中卻存在 byte, short, int, long, char, boolean, float, double 這八種原始數據類型(primitive data types)。

在 Java 中我們無法寫出類似下麵的代碼

    3.toString();

而在一些更加純粹的面向對象語言,則可以實現上述代碼。
例如 Scala

    3.toString();

引用

  1. Java Notes For Professionals.pdf
  2. Java 語言規範

感謝

希望對你有所幫助!


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

-Advertisement-
Play Games
更多相關文章
  • 今天,分享一個實際業務中能夠用得上的動畫技巧。 巧用逐幀動畫,配合補間動畫實現一個無限迴圈的輪播效果,像是這樣: 看到上述示意圖,有同學不禁會發問,這不是個非常簡單的位移動畫麽? 我們來簡單分析分析,從錶面上看,確實好像只有元素的 transform: translate() 在位移,但是註意,這裡 ...
  • 前端周刊:2022-10 期 前端開發 現在 vue3+vite2 成熟了嗎,可以用在生產環境嗎? Vue3 確實還是有問題 百度統計支持單頁應用啦 單頁應用設置 首個徹底解決緩存和資料庫一致性問題的方案 業務開發中能遇到的問題多數都是工程問題而不是技術問題,前後端都適用 微信公眾號/小程式獲取當前 ...
  • 一、ThreadLocal原理分析 1、概念 ThreadLocal類並不是用來解決多線程環境下的共用變數問題,而是用來提供線程內部的共用變數。在多線程環境 下,可以保證各個線程之間的變數互相隔離、相互獨立。 2、核心原理 即:實際上是ThreadLocal的靜態內部類ThreadLocalMap為 ...
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
  • """python的拆包和封包之 *號在函數形參和實參的區別1. 在函數形參定義時添加*就是封包過程,封包預設是以元組形式進行封包2. 在函數實參調用過程添加*就是拆包過程,拆包過程中會報列表或者元組拆成單個元素"""subject = ["math", "chinese", 'english', ...
  • 剛剛看到一篇博客,說 stdbind 無法綁定正確的重載函數。這裡的問題並不是 stdbind 能力不足,而是將函數名傳遞給 std::bind 時編譯器無法取到這個函數的地址(也就是符號,編譯器會先解析成符號,鏈接器再替換為地址),因為有多個重載函數都是這個名字。核心問題是無法通過函數名取到想要的 ...
  • Spring Ioc源碼分析系列--自動註入迴圈依賴的處理 前言 前面的文章Spring Ioc源碼分析系列--Bean實例化過程(二)在講解到Spring創建bean出現迴圈依賴的時候並沒有深入去分析了,而是留到了這一篇去分析。為什麼要另起一篇,首先迴圈依賴是個很經典的問題,也是面試屢屢被問到的問 ...
  • 作者:lex-wu 來源:www.cnblogs.com/lex-wu/p/14610110.html 前言 最初是覺得我們打工人,在歷史的浪潮中,我們都被推著上岸。電子產品和移動互聯網,把我們的生活節奏大大提速了,所以很多人都忘記了生活和工作中的關係。 所以在深圳這個城市的各個街道上,都能看到忙忙 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...