JavaSE——常用類、類型轉換

JavaSE——常用類、類型轉換

聲明:本欄目所使用的素材都是凱哥學堂VIP學員所寫,學員有權匿名,對文章有最終解釋權;凱哥學堂旨在促進VIP學員互相學習的基礎上公開筆記。

不可變字符串String可以讓它可變,只是不可變是為了能進行程序上的優化。並不是真的不可變,反射機制可以讓它變。

可變字符串StringBuffer和StringBuilder它們兩個其實是一家人,只是有一部分不一樣。

JavaSE——常用類、類型轉換

JavaSE——常用類、類型轉換

JavaSE——常用類、類型轉換

它們的繼承結構是一樣的,所繼承的父類都是同一個。接口也是一樣的。構造器也沒什麼不同,結構都是一樣的。不同的是 StringBuffer的每個方法上都有synchronized關鍵字——同步關鍵字,StringBuilder沒有同步關鍵字。

可變字符串,可以往裡追加,也可以用insert往裡插入,還有delete刪除,這些都要對原本的字符串進行修改。

如果有多個任務一起使用StringBuilder修改數據,那這裡面的數據就肯定會遭到破壞。所以StringBuilder沒有預料到這個問題。大家共同使用一個可變字符串的時候就會造成可變字符串的混亂。

在這方面StringBuffer裡面的所有方法都是同步的,也就是說一次只允許一個任務進去操作,其他的不允許操作。必須要等這個操作完下一個才能進去。

StringBuffer一次只允許一個任務進去訪問,必須要等這個操作完下一個才能進去,不允許多任務訪問。而StringBuilder就允許多任務訪問。這就是它們的不同之處。

加上同步關鍵字就是加上了訪問權利,必須排隊訪問才行。這就是StringBuffer的安全操作。

如果一個線程操作字符串,就用StringBuilder

如果多線程操作字符串,就用StringBuffer

StringBuffer是同步安全,StringBuilder是非同步安全、非線程安全。今後StringBuffer用得多。

封裝數據類

JavaSE——常用類、類型轉換

在jdk1.5以前,封裝數據類我們稱為工具類——對數據類型的幫助:類型轉換 在jdk1.5及以後封裝數據類型也可以當作數據類型使用

( 1.4代碼規範

JavaSE——常用類、類型轉換

Integer是int類型,不能當作int去使用呢。因為i是一個類,而100屬於基本數據類型int,基本數據類型不能給一個對象變量

JavaSE——常用類、類型轉換

但是String字符串就可以。因為String字符串是在很早的jdk版本上就進行了優化,就是一個對象給了s。

基本數據類型不能給i。因為在jdk1.4的時候,做到一些相應的包裝。所以只能new一下int,這是一種辦法。

JavaSE——常用類、類型轉換

還有一個辦法就是可以通過Integer裡的valueOf()方法,它也可以幫你優化一下,但是這個方法需要在1.5才能用,1.5才有這個方法。

JavaSE——常用類、類型轉換

1.4要想用Integer就必須得new。封裝數據類型就是一個工具類,沒有辦法直接接收基本數據類型的給值。要想拿它來寄存數值,必須new一下才可以把100存放進去。 )

( 10代碼規範 1.5以後,做一些改變,把所有的封裝數據類型都看作基本數據類型去對待。

看作int類型,直接可以等於100。

JavaSE——常用類、類型轉換

這種寫法在後臺編譯之後的寫法是這樣子的:

JavaSE——常用類、類型轉換

) 在jdk1.5以前,是不可以這樣賦值的;在jdk1.5以後就可以直接賦值。

JavaSE——常用類、類型轉換

這個在數據類型中就叫做自動裝箱。

自動裝箱——用封裝數據類型接收基本類型數據,它會自動裝箱。

基本數據類型int i2,i是對象類型,對象是肯定給不了基本數據類型的,就算用強制類型轉換,也給不了。

JavaSE——常用類、類型轉換

那為什麼這樣子就可以呢?因為這裡面有個自動拆箱的功能。

自動拆箱,真正來說,它調用的是裡面的一個intValue()方法,自動拆箱,拆給了它。

JavaSE——常用類、類型轉換

自動拆箱——基本數據類型接收封裝數據類型對象,會自動調用封裝數據類型的方法進行拆箱操作

只有它有自動裝箱和自動拆箱。

在Java1.5以後,它推薦大家今後不要用基本數據類型,使用封裝數據類型。但其實封裝數據類型佔用的內存要比基本數據類型大,我們不太推薦這樣去使用。如果萬事萬物皆對象的話,那就應該用封裝數據類型。但用封裝數據類型做計算的時候,應該調用它裡面的方法去計算。如果還是用最基本的運算符去進行運算的話,還會牽扯到自動拆箱的功能。

它裡面還有一個優化功能:

JavaSE——常用類、類型轉換

JavaSE——常用類、類型轉換

按照原理來說,這兩個應該是不同的對象,但是結果發現這兩個對象是一樣的。那就說明,它的內存是一致的。

用等於號比較對象,除了基本數據類型,所有的都是按地址比較。

JavaSE——常用類、類型轉換

JavaSE——常用類、類型轉換

JavaSE——常用類、類型轉換

JavaSE——常用類、類型轉換

JavaSE——常用類、類型轉換

它這裡面調用的是valueOf方法

JavaSE——常用類、類型轉換

這個方法裡面寫了一個判斷。傳進來的 i 是否大於等於-128,小於等於127。如果是在這個範圍內,就從這個池裡取出一個Integer的對象出來。如果不是在這個池裡,就直接new一個Integer對象出來。100是池裡取出來的對象,130不在這個範圍內所以就是new出來的一個對象。

JavaSE——常用類、類型轉換

這兩個是從池裡面拿出來的對象,所以內存是一致的。

JavaSE——常用類、類型轉換

而它們兩個在池裡面沒有取到對象,因為沒有在這個範圍內,所以new出來的兩個對象,內存就不相等,打印出了false

JavaSE——常用類、類型轉換

它如果和基本數據類型混在一起就會自動拆箱。自動調intValue()方法轉換成 int 基本數據類型,轉換成基本數據類型再和130做比較。因為基本數據類型的判斷是可以用等於號去判斷。所以它自動拆箱,拆出130,130等於130。

注意:封裝數據類型比較,應該使用equals,因為它們是對象

類型轉換

字符串轉int

JavaSE——常用類、類型轉換

所有的封裝數據類型都有方法可以將字符串變成它們對應的基本數據類型

JavaSE——常用類、類型轉換

valueOf轉出來的是Integer對象。這是專門用來自動裝箱的。

JavaSE——常用類、類型轉換

給不了字符串

JavaSE——常用類、類型轉換

轉到二進制能加密,能做很多相應的操作。

Integer可以將十六進制、八進制、二進制轉成十進制,也可以將十進制轉成二進制、八進制、十六進制,以及三十二進制。這就是Integer工具類的好處。

二進制轉十進制

JavaSE——常用類、類型轉換

(不超過32位,因為int存儲的最大位數就是32位)

八進制轉十進制

JavaSE——常用類、類型轉換

十六進制轉十進制

JavaSE——常用類、類型轉換

在傳輸數據的時候,很大的數值它牽扯的字符串有點長,就可以直接把它壓縮成十六進制。一個數值壓縮成十六進制,字符串就變短了。減少了佔位,減少了空間存儲。

所以進制轉換的好處也是壓縮了存儲空間。傳輸的時候,傳輸數據也小了。

還有一種就是將這個文本轉成二進制,然後再分析裡面的相應信息。

JavaSE——常用類、類型轉換

需要把這10個設備的狀態情況發送給服務器,通過一個主機發出去。

JavaSE——常用類、類型轉換

這10個設備的狀態組建成一個字符串

JavaSE——常用類、類型轉換

這個字符串太長了,影響網絡傳輸,去掉序號,只留下表示狀態的數字,按順序第一個就是第一個設備。再去掉逗號,還有10的字符串長度。如果今後設備多起來,字符串就會越來越長,這樣描述狀態就不太好。

JavaSE——常用類、類型轉換

8位 一個字節

3個字節描述了12個設備的狀態

存儲狀態可以用位存儲,節約空間。

所以進制轉換是很有必要的,在這裡用到位進行描述,然後轉成字節,再解析就行了。

例題

JavaSE——常用類、類型轉換

JavaSE——常用類、類型轉換

JavaSE——常用類、類型轉換

截取,每8個轉成1個字節

JavaSE——常用類、類型轉換

JavaSE——常用類、類型轉換

轉成字節

需要找到Byte類型去轉換字節

JavaSE——常用類、類型轉換

JavaSE——常用類、類型轉換

JavaSE——常用類、類型轉換

字符串轉字節,二進制轉

通過這種方式可以節約存儲空間。以前是用文本存儲的,浪費空間。用字節存儲,一個字節8位。這就是狀態描述的一種做法。 不管是什麼進制轉換,都是有很大的用處的。第一是縮短了存儲,第二就是可以進行相應的加密。

MD5加密

加密後形成的密文不可解析,不能還原

比方說你的密碼存儲在服務器上,不可能明文密碼給人家看。有人維護服務器的時候一看就知道了你的密碼,這就很不保險。保險的辦法就是把你的密碼用MD5加密,他就算看見你的MD5密文,他也還原不出你的密碼。

登錄驗證的時候,需要再把你輸入的密碼加密成MD5,看一下兩個密文是否一致。如果兩個密文是一致的,那密碼就是正確的;如果兩個密文不是一致的,那密碼就不正確。

金融系統裡的那些密碼都是要拿MD5加密的,而且是MD5嵌套加密法。就算是一個數據維護員也看不到客戶的密碼,拿到的是密文,密文是翻譯不出密碼的。防止技術人員盜用人家的密碼。

MD5能加密不能解密


分享到:


相關文章: