一、枚舉類型用法總結java
代碼以下:測試
1 public class EnumTest { 2 3 public static void main(String[] args) { 4 Size s=Size.SMALL; 5 Size t=Size.LARGE; 6 //s和t引用同一個對象? 7 System.out.println(s==t); // 8 //是原始數據類型嗎? 9 System.out.println(s.getClass().isPrimitive()); 10 //從字符串中轉換 11 Size u=Size.valueOf("SMALL"); 12 System.out.println(s==u); //true 13 //列出它的全部值 14 for(Size value:Size.values()){ 15 System.out.println(value); 16 } 17 } 18 19 } 20 enum Size{SMALL,MEDIUM,LARGE};
運行結果以下:spa
首先,對於枚舉類型,枚舉的各元素爲不一樣對象,位於內存中的不一樣位置,且枚舉類型不屬於原始數據類型,字符串能夠轉換成枚舉類型。當遍歷枚舉類型中的全部值時,打印的是枚舉類型中列舉的各項。3d
對於枚舉類型的變量,使用「==」和「equals()」方法是等價的。code
二、原碼、補碼、反碼的概念及應用對象
首先,原碼、補碼和反碼實在二進制的基礎上實現的,下面也將基於二進制數字描述這三個概念及其應用blog
原碼:如,十進制數字7的原碼爲00000111,十進制數字-7的原碼爲10000111;第一位數字表明符號,若是是0則爲正,若是是1則爲負內存
反碼:如,十進制數字7的反碼爲00000111,十進制數字-7的反碼爲11111000;正數的反碼是其自己,負數的反碼是其符號位不變,其他各位取反ci
補碼:如,十進制數字7的補碼爲00000111,十進制數字-7的補碼爲11111001;正數的補碼是其自己,負數的補碼是其反碼+1字符串
計算機中存儲的都是數的補碼,正數的原碼、反碼、補碼都是相同的;而負數的原碼、反碼、補碼是不同的,補碼=原碼取反+1(符號位不變)。因此,負數是按照它的補碼輸出的。
關於二進制數運算測試:
代碼以下:
1 public class doubletest { 2 public static void main(String[] args) { 3 int num1=7; 4 int num2=-7; 5 int num3=5; 6 int num4=-5; 7 String b1 = Integer.toBinaryString(num1); 8 String b2 = Integer.toBinaryString(num2); 9 String b3 = Integer.toBinaryString(num3); 10 String b4 = Integer.toBinaryString(num4); 11 System.out.println("十進制:"+num1+" 二進制:"+b1); 12 System.out.println("十進制:"+num2+" 二進制:"+b2); 13 System.out.println("進行運算:"); 14 System.out.println("一、左移2位\n\t7:十進制:"+(num1<<2)+" 二進制:"+Integer.toBinaryString(num1<<2)+"\n\t-7:十進制:"+ 15 +(num2<<2)+" 二進制:"+Integer.toBinaryString(num2<<2)); 16 System.out.println("二、右移2位\n\t7:十進制:"+(num1>>2)+" 二進制:"+Integer.toBinaryString(num1>>2)+"\n\t-7:十進制:"+ 17 +(num2>>2)+" 二進制:"+Integer.toBinaryString(num2>>2)); 18 System.out.println("三、&運算\n\t7的二進制:"+b1+" 5的二進制:"+b3+"\n\t7&5二進制"+ 19 Integer.toBinaryString(7&5)+" 十進制:"+(7&5)); 20 System.out.println("四、|運算\n\t7的二進制:"+b1+" -5的二進制:"+b4+"\n\t7|-5二進制"+ 21 Integer.toBinaryString(7|-5)+" 十進制:"+(7|-5)); 22 System.out.println("五、^運算\n\t-7的二進制:"+b2+" 5的二進制:"+b3+"\n\t-7^5二進制"+ 23 Integer.toBinaryString(-7^5)+" 十進制:"+(-7^5)); 24 System.out.println("六、~運算\n\t7的二進制:"+b1+" 5的二進制:"+b3+" -7的二進制"+ 25 b2+" -5的二進制"+b4+"\n\t~7的二進制:"+Integer.toBinaryString(~7)+ 26 " ~5的二進制:"+Integer.toBinaryString(~5)+" ~-7的二進制:"+Integer.toBinaryString(~-7)+ 27 " ~-5的二進制:"+Integer.toBinaryString(~-5)); 28 } 29 }
測試結果:
可見,<<運算是將二進制數字所有左移n位,後面補0,>>運算是將二進制數字所有右移n位,正數前面補0,負數補1;
&運算是將二進制數字各位相比較,兩數全爲1才得1,不然得0
|運算是將二進制數字各位相比較,兩數有一個是1則爲1,都是0才得0
^運算是將二進制數字各位相比較,兩數相同則爲0,兩數不一樣則爲1
~運算即將二進制各位取反,0變1,1變0
三、double類型運算精確問題
測試代碼:
1 public class doubletest { 2 public static void main(String[] args) { 3 System.out.println("0.05+0.01="+(0.05+0.01)); 4 System.out.println("1.0-0.42="+(1.0-0.42)); 5 System.out.println("4.015*100="+(4.015*100)); 6 System.out.println("123.3/100="+(123.3/100)); 7 } 8 }
測試結果:
爲何double類型的數值進行運算的時候得不到「數學上精確的結果」?
該問題的本質仍是來源於二進制與十進制之間的轉化,double類型的數值佔用64bit,即64個二進制數,除去最高位表示正負符號的位,在最低位上必定會與實際數據存在偏差(除非實際數據剛好是2的n次方),好比要用4bit來表示小數3.26,從高到低位依次對應2的1,0,-1,-2次冪,根據最上面的分析,應當在二進制數11.01(對應十進制的3.25)和11.10(對應十進制的3.5)之間選擇。簡單來講就是咱們給出的數值,在大多數狀況下須要比64bit更多的位數才能準確表示出來(甚至是須要無窮多位),而double類型的數值只有64bit,後面捨去的位數必定會帶來偏差,沒法獲得「數學上精確」的結果。
而在java中,爲解決double類型數值運算封裝了一個BigDecimal類,該類能夠解決double類型運算不精確的問題。
關於BigDecimal類的構造器及方法介紹可見如下連接:https://www.jianshu.com/p/c81edc59546c
四、字符串鏈接測試:
代碼以下:
1 public class test { 2 public static void main(String[] args) { 3 int X=100; 4 int Y=200; 5 System.out.println("X+Y="+X+Y); 6 System.out.println(X+Y+"=X+Y"); 7 } 8 }
測試結果以下:
能夠看出當字符串前有+時,會先進行前面的運算,再判斷後面是字符串,即X+Y+"=X+Y"至關於(X+Y)+"=X+Y",而當字符串在前是,會把+後面每一個變量都轉化爲字符串型在進行字符串的鏈接