[轉載] Java內存管理-你真的理解Java中的數據類型嗎(十)

參考鏈接: Java中的字符串類String 1

做一個積極的人?

?編碼、改bug、提升自己?

?我有一個樂園,面向編程,春暖花開!?

?

?

?推薦閱讀?

?第一季?

?0、Java的線程安全、單例模式、JVM內存結構等知識梳理 1、Java內存管理-程序運行過程(一) 2、Java內存管理-初始JVM和JVM啟動流程(二) 3、Java內存管理-JVM內存模型以及JDK7和JDK8內存模型對比總結(三) 4、Java內存管理-掌握虛擬機類加載機制(四) 5、Java內存管理-掌握虛擬機類加載器(五) 6、Java內存管理-類加載器的核心源碼和設計模式(六) 7、Java內存管理-掌握自定義類加載器的實現(七) 第一季總結:由淺入深JAVA內存管理 Core Story?

?

?

?第二季?

?8、Java內存管理-愚人節new一個對象送給你(八) 【福利】JVM系列學習資源無套路贈送 9、Java內存管理-”一文掌握虛擬機創建對象的秘密”(九) 10、Java內存管理-你真的理解Java中的數據類型嗎(十) 11、Java內存管理-Stackoverflow問答-Java是傳值還是傳引用?(十一) 12、Java內存管理-探索Java中字符串String(十二)?

?

?

?實戰?

?一文學會Java死鎖和CPU 100% 問題的排查技巧?

?

分享一位老師的人工智能教程。零基礎!通俗易懂!風趣幽默! 大家可以看看是否對自己有幫助,點擊這里查看【人工智能教程】。接下來進入正文。?

勿在流沙筑高臺,出來混遲早要還的。?

作為Java程序員,Java 的數據類型這個是一定要知道的! 但是不管是那種數據類型最終存儲都要到內存中,本文由淺入深對數據類型進行介紹和講解,相信讀完本文你一定會有收獲的,會對Java數據類型有更深的了解和認識!?

本文地圖?

?

一、什么是位、字節、字符、字符集?

位(bit):計算機內部存儲數據的最小單位,音譯為比特,每個二進制數字0或者1就是1個位!?

字節(Byte):計算機**存儲容量(數據處理)**的基本單位,音譯拜特,8個位構成一個字節;即:1 byte (字節)= 8 bit(位)。?

一個字節能夠存放的數字范圍用二進制表示為00000000011111111,也就是8個bit(比特),8個比特轉換為無符號的10進制數字范圍是0255,轉換為有符號數據一般為-128~127。?

?

字節說明:對于存儲容量,我們是比較熟悉的,計算機存儲容量大小以字節數來度量,1024進位制:?

1024B=1K(千)B (1024個字節等于 1KB)

1024KB=1M(兆)B

1024MB=1G(吉)B

1024GB=1T(太)B

還有PB、EB、ZB、YB 、NB、DB等

?

?

字符:字符是一種符號,同以上說的存儲單位不是一回事。指計算機中使用的字母、數字、字和符號,包括:1、2、3、A、B、C、~!·#¥%……—*()——+等等。字符一般在不同的編碼(字符集)下面占用的字節數不同!也即占用存儲空間不同!?

編碼:編碼就是一個編號(數字)到字符的一種映射關系(集合),常見的有 ASCII、ISO-8859-1、GB2312、GBK、UTF-8、UTF-16 等。它們都可以被看作為字典,它們規定了轉化的規則,按照這個規則就可以讓計算機正確的表示我們的字符。?

# 簡單舉例舉例:

在 ASCII 編碼中,一個英文字母字符存儲需要1個字節。

在 GB 2312 編碼或 GBK 編碼中,一個漢字字符存儲需要2個字節。

在UTF-8編碼中,一個英文字母字符存儲需要1個字節,一個漢字字符儲存需要3到4個字節。

在UTF-16編碼中,一個英文字母字符或一個漢字字符存儲都需要2個字節(Unicode擴展區的一些漢字存儲需要4個字節)。

在UTF-32編碼中,世界上任何字符的存儲都需要4個字節。

?

?

tips:??

ASCII碼是最熟知字符編碼,編碼范圍為0255,屬于單字節編碼。ASCII碼編碼范圍太小了,Java為了能夠處理多字節語言編碼(比如中文、日文、韓文等)編碼范圍0x0000000x10FFFF,采用國際組織制定的Unicode編碼集。?

因為Unicode編碼并非連續的,所有將Unicode轉換為具體的數值格式是又有多種不同的轉換方式。稱為Unicode Translation Format(UTF)。?

簡單總結一下UTF-8、UTF-16、UTF-32三種轉換方式,都是采用字節作為編碼的基本單位!?

轉換方式特點優點缺點UTF-8變長編碼,1-4字節節省空間轉換麻煩UTF-16固定編碼,2字節轉換相對簡單空間相對節省UTF-32固定編碼,4字節轉換簡單空間最浪費

目前使用UTF-8還是比較多,節省空間還是很大的優勢! 在說明一點Java虛擬機內部使用的UTF-16轉換方式,固定使用兩個字節,所以java中字符char 占用 2個字節!??

?

編碼這一塊的內容其實挺多,如需了解更多深入細節,請自行查閱相關資料!?

二、基本數據類型和引用數據類型?

有學過C語言的伙伴知道在C語言中可以聲明指針類型的變量,但是在Java語言中是看不到使用指針的,那么Java中有沒有指針呢?準確的話是有的,因為在Java底層有些類型是封裝了指針的。在Java中根據底層是否封裝了指針可以將Java的數據類型分為兩類,值類型和引用類型!?

?

2.1、值類型?

值類型: 也稱為基本數據類型和基元數據類型。它的值就是一個數字,一個字符或一個布爾值等。?

沒有封裝指針的變量,它們在Java中有8個,包括byte、char、 short、int 、float 、long 、double、boolean。?

這些基本類型首字母都是小寫,它們并不是類,也沒有屬性和方法。聲明值類型變量,只會在棧中分配一塊內存空間。?

?

這里面還有一個知識點是: 自動類型轉換和強制類型轉換!?

自動類型轉換:?

一般情況下Java中會將占用內存空間較低的類型轉換為較高類型,如 int型的變量和 long型的變量進行計算的時候,會將int型轉換為long型;?

如果兩個變量占用內存空間一樣,但是一個是整型,一個是浮點型,則會將整型轉換為浮點型。如int型變量與float型變量進行計算,會將int型轉換為float型。?

強制類型轉換:?

第一種情況:提升變量的類型級別,以獲取精度更高的計算結果! 比如 兩個整型int變量進行除法運算,為了精度更高,強制轉為long類型!?

第二種情況:需要用占用空間較小的變量類型接受占用空間較大的變量類型。比如 int轉為byte等,但是要注意 轉換過程中產生溢出截斷的情況!?

上面圖中內容中沒有boolean類型變量進行說明,因為boolean類型比較特殊。boolean類型變量只有兩個值,true或者false,它不參與數學運算,也不能與其他類型變量進行轉換(不管自動轉換還是強制轉換),只是用來進行邏輯判斷。?

boolean類型變量的內存空間占用具有一定的不確定性,理論上一個比特就可以保存boolean類型變量的值,當因為內存使用的最小單位是字節,那么變量不可能僅占用1/8個字節。實際中,根據編譯器的不同,**Java會使用1~4字節來保存boolean變量。**字節內容均為0表示false。只要有字節為非0值表示true。?

面試一定要注意 :String 不是基本類型!?

2.2、引用類型?

引用類型: 就是底層封裝指針的數據類型。這部分包含的比較多,比如我們自定義或者系統的類、抽象類、接口,以及數組。它們在內存中分配兩塊空間,首先要在棧上給其引用(句柄)分配一塊內存(不存放具體數值),然后對象的具體信息都存儲在堆內存上(如對象的屬性值等),最后由棧上面的引用指向堆中對象的地址。?

2.3、簡單示例?

示例代碼:?

public class PrettyGirl {

? ? /**

? ? ?* 姑娘姓字名誰

? ? ?*/

? ? String name;

?

? ? /**

? ? ?* 芳齡幾何

? ? ?*/

? ? int age;

?

? ? public static void main(String[] args) {

? ? ? ? //? PrettyGirl是自定義類,是引用類型,分配兩塊內存空間

? ? ? ? PrettyGirl prettyGirl = new PrettyGirl();

?

? ? ? ? // String類是系統類,也是引用類型,分配兩塊內存空間

? ? ? ? String name = new String("Java ok");

?

? ? ? ? // int,float 是值類型,只分配一塊內存空間

? ? ? ? int num = 10;

? ? ? ? float price = 110.10f;

?

? ? ? ? // 對象名.屬性名訪問對象的屬性,訪問包括賦值和取值

? ? ? ? prettyGirl.name = "Alice";

? ? ? ? prettyGirl.age = 25;

?

? ? }

?

}

?

通過類名 對象名 = new 類名()創建對象, 在 PrettyGirl prettyGirl = new PrettyGirl();這行代碼在內存中就創建了兩塊內存空間,第一塊在棧中,名字叫 prettyGirl,它是一個引用地址,并不放具體的數值,第二塊堆中的內存才存放具體的數值,如name,age等信息。?

?

其實數組內部也是封裝引用(指針),即便是基本類型的數組,也是如此! **數組也是引用類型!**比如?

int[] nums = new int[]{1,4,7,3,9};

?

?

說明 :0x001 是我隨便寫的一個值,真實的內存地址并不是這個,這個值只是為了我畫圖方便!?

在多強調一點,在引用類型中,對于類來說,要創建對象其實包括兩步,第一是聲明對象,第二是創建對象!?

public static void main(String[] args) {

? ? // 聲明對象,相當分配指針類型變量,在棧中分配內存

? ? PrettyGirl alice;

? ? // 創建對象,創建具體內存空間,在堆中分配內存

? ? alice = new PrettyGirl();

}

?

聲明對象:就相當于在棧中聲明引用類型的變量,它的內存不存放具體的數值,而只存放另一塊堆中內存的地址!如?

PrettyGirl alice;

?

創建對象:一般使用new關鍵字,如下代碼?

alice = new PrettyGirl();

?

上面這一行代碼做了兩件事情,首先在堆中分配一塊存放具體數值的內存,然后將這個內存的首地址賦給上面聲明的引用變量!?

?

其實很多時候,對象的聲明和創建是放在一行的,如下:?

PrettyGirl mary = new PrettyGirl();

?

三、 八種基本類型的包裝類和常量池?

以下內容摘自:參考資料1 中 8種基本類型的包裝類和常量池部分內容!?

Java 基本類型的包裝類的大部分都實現了常量池技術,即Byte,Short,Integer,Long,Character,Boolean;這5種包裝類默認創建了數值[-128,127]的相應類型的緩存數據,但是超出此范圍仍然會去創建新的對象。?

兩種浮點數類型的包裝類 Float,Double 并沒有實現常量池技術。?

Integer i1 = 33;

Integer i2 = 33;

System.out.println(i1 == i2);// 輸出true

Integer i11 = 333;

Integer i22 = 333;

System.out.println(i11 == i22);// 輸出false

Double i3 = 1.2;

Double i4 = 1.2;

System.out.println(i3 == i4);// 輸出false, 無緩存!

?

Integer 緩存源代碼:?

/**

*此方法將始終緩存-128到127(包括端點)范圍內的值,并可以緩存此范圍之外的其他值。

*/

public static Integer valueOf(int i) {

? ? if (i >= IntegerCache.low && i <= IntegerCache.high)

? ? ? ? return IntegerCache.cache[i + (-IntegerCache.low)];

? ? return new Integer(i);

}

?

對于Integer類型來說,值在-128-127,用==比較是一致的,超過這個區間就不行了。?

應用場景:?

Integer i1=40;Java 在編譯的時候會直接將代碼封裝成Integer i1=Integer.valueOf(40);,從而使用常量池中的對象。Integer i1 = new Integer(40);這種情況下會創建新的對象。?

Integer i1 = 40;

Integer i2 = new Integer(40);

System.out.println(i1==i2);//輸出false

?

最后在貼出阿里巴巴Java手冊中對包裝類使用的建議:?

?

四、本文總結?

本文整體內容相對基礎,但是在java開發中還是非常重要,注重細節和基礎,讓寫出的每一行代碼都是最優的!朝著這個方向努力! 下一篇整理一下值傳遞和引用傳遞! 敬請期待!?

備注: 由于本人能力有限,文中若有錯誤之處,歡迎指正。?

五、參考資料?

1、可能是把Java內存區域講的最清楚的一篇文章?

2、Java語言中一個字符占幾個字節??

?

謝謝你的閱讀,如果您覺得這篇博文對你有幫助,請點贊或者喜歡,讓更多的人看到!祝你每天開心愉快!?

?

?

?Java編程技術樂園:一個分享編程知識的公眾號。跟著老司機一起學習干貨技術知識,每天進步一點點,讓小的積累,帶來大的改變!

?

?

?

?掃描關注,后臺回復【資源】,獲取珍藏干貨! 99.9%的伙伴都很喜歡

?

?

?

?

???

?每天都在變得更好的阿飛云

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

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

相關文章

Linux系統安全加固腳本

閑來無事&#xff0c;整理一個系統安全加固腳本&#xff0c;每個公司的要求不一樣&#xff0c;所以僅供參考&#xff1a; #!/bin/sh echo "00 */1 * * * /usr/sbin/ntpdate 192.168.1.1 >>/var/log/ntpdate.log" > mycrontab crontab mycrontab rm -rf my…

[轉載] 整理下java中stringBuilder和stringBuffer兩個類的區別

參考鏈接&#xff1a; Java中的StringBuffer類 StringBuilder和StringBuffer這兩個類在動態拼接字符串時常用&#xff0c;肯定比String的效率和開銷小&#xff0c;這是因為String的對象不會回收哦。 其實我一直用StringBuilder這個類&#xff0c;因為可以簡寫為sb的變量在程序…

11.13 模10計數器設計

.新建一個工程 Family&#xff1a;FLEX10K Available device&#xff1a;EPF10K20TC144-3 2.設置lpm_counter宏單元參數并連接引腳 連接引腳的時候要注意的是&#xff0c;向量線的連接。 3.時序仿真 檢查無誤后進行下一步 4.載入7448并進行引腳連接 5.分配管腳 再次編譯&#x…

[轉載] java對象在內存中的結構

參考鏈接&#xff1a; 了解Java中的類和對象 今天看到一個不錯的PPT&#xff1a;Build Memory-efficient Java Applications&#xff0c;開篇便提出了一個問題&#xff0c;在Hotspot JVM中&#xff0c;32位機器下&#xff0c;Integer對象的大小是int的幾倍&#xff1f; 我們…

使用valueOf前必須進行校驗

每個枚舉都是java.lang.Enum的子類,都可以訪問Enum類提供的方法,比如hashCode(),name(),valueOf()等..... 其中valueOf()方法會把一個String類型的名稱轉變為枚舉項,也就是枚舉項中查找出字面值與該參數相等的枚舉項,雖然這個方法很簡單,但是JDK卻做了一個對于開發人員來說并不…

[轉載] 【Java】Java基礎知識及其擴展筆記(8千字)

參考鏈接&#xff1a; Java中的StringBuilder類及其示例 Java基礎知識及其擴展筆記 零 l 寫在前面一 l JVM1、【1.1.2.1】java程序運行的一般流程2、【1.1.2.1】JVM一般運行流程3、【1.1.2.1】JIT&#xff08;just in time 即時編譯編譯器&#xff09;4、堆與棧 二 l Java …

多IDC GSLB的部署

之前已經介紹過GSLB的實現原理&#xff0c;這里再向大家講述一下GSLB經常遇到的部署方式&#xff0c;多IDC的部署。很多大型的企業或業務容災要求非常高的客戶都會部署有多個異地的數據中心&#xff0c;以保證其業務的“全天候”不間斷的正常運行&#xff0c;而要整合多個IDC的…

[轉載] Controller報錯:java.lang.NoSuchMethodException: java.util.List.<init>()

參考鏈接&#xff1a; Java8中的java.util.StringJoiner 報錯詳情&#xff1a; java.lang.NoSuchMethodException: java.util.List.<init>() 以及 No primary or default constructor found for interface java.util.List 示例&#xff1a; /** * 此接口會產生以…

[轉載] 算法競賽中的JAVA使用筆記

參考鏈接&#xff1a; Java中StringTokenizer類的示例| 1(構造函數) 算法競賽中的JAVA使用筆記 算法競賽中的JAVA使用筆記 輸入與輸出 基本輸入輸入掛輸出控制臺輸入輸出重定向到文件 大整數與高精度 大整數BigInteger高精度BigDecimal高精度開方 字符串與進制轉換 字符串基本…

信息系統開發平臺OpenExpressApp:【OpenTest】 之 語法及其使用介紹

在OpenTest 之 運行環境準備中介紹了運行自動化測試需要做的一些準備工作&#xff0c;本篇將繼續給大家介紹OpenTest的腳本語法以及使用方法&#xff0c;通過學習后讀者應該能夠開始動手編寫UI自動化測試腳本了。 關鍵字驅動測試 在學習語法之前&#xff0c;需要了解一下關鍵字…

[轉載] java常量池-字符串常量池、class常量池和運行時常量池

參考鏈接&#xff1a; 如何在Java中初始化和比較字符串 原文鏈接&#xff1a;http://tangxman.github.io/2015/07/27/the-difference-of-java-string-pool/ 在java的內存分配中&#xff0c;經常聽到很多關于常量池的描述&#xff0c;我開始看的時候也是看的很模糊&#xff0c…

Oracle 10g 高級安裝圖文教程(二)

第八步&#xff1a;為了簡便起見&#xff08;工作中肯定不安全&#xff09;&#xff0c;選擇“所有的帳戶都是用同一個口令”&#xff0c;并輸入口令&#xff0c;點擊“下一步”&#xff1a;本文轉自 victoryan 51CTO博客&#xff0c;原文鏈接:http://blog.51cto.com/victoryan…

[轉載] StringBuffer和StringBuilder類

參考鏈接&#xff1a; Java中的String vs StringBuilder vs StringBuffer 下述文章資料來源于&#xff1a; W3CSCHOOL離線版的Java教程 Java JDK 6.0開發手冊 Java開發從入門到精通(陳小玉版) StringBuffer和String選擇的異同 StringBuffer在進行字符串處理時&#xff0c;不…

sharepoint 2007功能增強解決方案,資料收集

一、關于QuickFlow&#xff0c;sharepoint可視化工作流增強包 http://www.cnblogs.com/jianyi0115/tag/QuickFlow/default.html?page1 http://quickflow.codeplex.com/ 二、關于SharePoint Permission Extension&#xff0c;視圖、列表字段權限功能增強 http://sppex.codeplex…

[轉載] 面試題:說說Java中接口、類、成員變量、成員方法、構造方法有哪些訪問修飾符和他們的作用范圍

參考鏈接&#xff1a; Java中的訪問修飾符 * 問題&#xff1a;說說Java中接口、類、成員變量、成員方法、構造方法有哪些訪問修飾符和他們的作用范圍 * 答&#xff1a;接口的訪問修飾符只有public 1個 * 類的訪問修飾符有public和默認(就是不寫的)2個 * 成員方法的訪問修…

使用IHttpHandler做權限控制[ASP.NET | IHttpHandler | AjaxPro | UserHostName]

正文 Web.Config配置如下: <add verb"POST,GET"path"/page/*.aspx,/page/*/*.aspx,/page/*/*/*.aspx,/page/*/*/*/*.aspx,/page/*/*/*/*/*.aspx"type"WebLibrary.PowerManage.HttpHanderPowerControls"/> 整個IHttpHandler實現代碼如下: /…

[轉載] Java 中字符串轉整型和整型轉字符串

參考鏈接&#xff1a; Java中的字符串到整數– parseInt() Java 中字符串轉整型和整型轉字符串 1.字符串轉整型Java代碼&#xff0c;字符串為純數字的情況下&#xff0c;調用Integer的靜態方法parseInt或者valueOfJava代碼&#xff0c;如果單個字符或字符串&#xff0c;需要切…

Gram matrix 格拉姆矩陣

2019獨角獸企業重金招聘Python工程師標準>>> Gram matrix 度量各個維度自己的特性以及各個維度之間的關系。 來自&#xff1a;https://www.zhihu.com/question/49805962?fromprofile_question_card 由感知機&#xff08;對偶感知機中需要計算樣本點兩兩之間的內積和…

[轉載] 用Java語言實現對十六進制字符串異或運算

參考鏈接&#xff1a; 交換兩個字符串&#xff0c;而無需在Java中使用第三個用戶定義的變量 前言&#xff1a;好久沒有寫博客&#xff0c;最近一年感覺真是好忙&#xff0c;各種做不完的工作。相信很多上班族都會有這種感覺。最近對NFC進行寫卡操作&#xff0c;需要計算一個校…

MySQL日常應用操作記錄

1.知道一個字段名&#xff0c;怎樣查到它在數據庫里的哪張表里&#xff1f; USE Information_schema;SELECT TABLE_NAME FROM COLUMNS WHERE COLUMN_NAME字段名稱; MySQL中查看庫表字段信息都在information_schemal中&#xff0c;獲取數據字典等信息都要通過這個視圖。 如&…