JavaSE——經常使用類、類型轉換

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

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

可變字符串StringBuffer和StringBuilder它們兩個實際上是一家人,只是有一部分不同。網絡

image

image

image

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

可變字符串,能夠往裏追加,也能夠用insert往裏插入,還有delete刪除,這些都要對本來的字符串進行修改。工具

若是有多個任務一塊兒使用StringBuilder修改數據,那這裏面的數據就確定會遭到破壞。因此StringBuilder沒有預料到這個問題。你們共同使用一個可變字符串的時候就會形成可變字符串的混亂。學習

在這方面StringBuffer裏面的全部方法都是同步的,也就是說一次只容許一個任務進去操做,其餘的不容許操做。必需要等這個操做完下一個才能進去。優化

StringBuffer一次只容許一個任務進去訪問,必需要等這個操做完下一個才能進去,不容許多任務訪問。而StringBuilder就容許多任務訪問。這就是它們的不一樣之處。ui

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

若是一個線程操做字符串,就用StringBuilder
若是多線程操做字符串,就用StringBuffer線程

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

封裝數據類

image

在jdk1.5之前,封裝數據類咱們稱爲工具類——對數據類型的幫助:類型轉換 在jdk1.5及之後封裝數據類型也能夠看成數據類型使用

( 1.4代碼規範

image

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

image

可是String字符串就能夠。由於String字符串是在很早的jdk版本上就進行了優化,就是一個對象給了s。

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

image

還有一個辦法就是能夠經過Integer裏的valueOf()方法,它也能夠幫你優化一下,可是這個方法須要在1.5才能用,1.5纔有這個方法。

image

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

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

看做int類型,直接能夠等於100。

image

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

image

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

image

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

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

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

image

那爲何這樣子就能夠呢?由於這裏面有個自動拆箱的功能。

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

image

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

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

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

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

image

image

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

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

image

image

image

image

image

它這裏面調用的是valueOf方法

image

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

image

這兩個是從池裏面拿出來的對象,因此內存是一致的。

image

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

image

它若是和基本數據類型混在一塊兒就會自動拆箱。自動調intValue()方法轉換成 int 基本數據類型,轉換成基本數據類型再和130作比較。由於基本數據類型的判斷是能夠用等於號去判斷。因此它自動拆箱,拆出130,130等於130。

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

類型轉換

字符串轉int

image

全部的封裝數據類型都有方法能夠將字符串變成它們對應的基本數據類型

image

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

image

給不了字符串

image

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

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

二進制轉十進制

image

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

八進制轉十進制

image

十六進制轉十進制

image

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

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

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

image

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

image

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

image

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

image

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

存儲狀態能夠用位存儲,節約空間。

因此進制轉換是頗有必要的,在這裏用到位進行描述,而後轉成字節,再解析就好了。

例題

image

image

image

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

image

image

轉成字節
須要找到Byte類型去轉換字節

image

image

image

字符串轉字節,二進制轉

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

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

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

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

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

MD5能加密不能解密

相關文章
相關標籤/搜索