1. 程式人生 > >java基礎-02資料型別

java基礎-02資料型別

基本型別

整數

byte

  • byte 資料型別是8位、有符號的,以二進位制補碼錶示的整數
  • 最小值是 -128(-2^7)
  • 最大值是 127(2^7-1)
  • 預設值是 0
  • byte 型別用在大型陣列中節約空間,主要代替整數,因為 byte 變數佔用的空間只有 int 型別的四分之一
  • 例子:byte a = 100,byte b = -50

short

  • short 資料型別是 16 位、有符號的以二進位制補碼錶示的整數
  • 最小值是 -32768(-2^15)
  • 最大值是 32767(2^15 - 1)
  • Short 資料型別也可以像 byte 那樣節省空間。一個short變數是int型變數所佔空間的二分之一
  • 預設值是 0
  • 例子:short s = 1000,short r = -20000。

int

  • int 資料型別是32位、有符號的以二進位制補碼錶示的整數
  • 最小值是 -2,147,483,648(-2^31)
  • 最大值是 2,147,483,647(2^31 - 1)
  • 一般地整型變數預設為 int 型別
  • 預設值是 0
  • 例子:int a = 100000, int b = -200000

long

  • long 資料型別是 64 位、有符號的以二進位制補碼錶示的整數
  • 最小值是 -9,223,372,036,854,775,808(-2^63)
  • 最大值是 9,223,372,036,854,775,807(2^63 -1)
  • 這種型別主要使用在需要比較大整數的系統上
  • 預設值是 0L
  • 例子: long a = 100000L,Long b = -200000L
  • "L"理論上不分大小寫,但是若寫成"l"容易與數字"1"混淆,不容易分辯。所以最好大寫。

小數

float

  • float 資料型別是單精度、32位、符合IEEE 754標準的浮點數
  • float 在儲存大型浮點陣列的時候可節省記憶體空間
  • 預設值是 0.0f
  • 浮點數不能用來表示精確的值,如貨幣(用BigDecimal)
  • 例子:float f1 = 234.5f。

double

  • double 資料型別是雙精度、64 位、符合IEEE 754標準的浮點數
  • 浮點數的預設型別為double型別
  • double型別同樣不能表示精確的值,如貨幣(用BigDecimal)
  • 預設值是 0.0d
  • 例子:double d1 = 123.4

其它

char

  • char型別是一個單一的 16 位 Unicode 字元,可以看做無符號整數。
  • 最小值是 \u0000(即為0)
  • 最大值是 \uffff(即為65,535 , 2^16 -1)
  • char 資料型別可以儲存任何字元
  • 例子:char letter = 'A'

boolean

  • boolean資料型別表示1個位元位的資訊
  • 只有兩個取值:true 和 false
  • 這種型別只作為一種標誌來記錄 true/false 情況
  • 預設值是 false
  • 例子:boolean one = true

引用型別

  • 在Java中,引用型別的變數非常類似於C/C++的指標。引用型別指向一個物件,指向物件的變數是引用變數。這些變數在宣告時被指定為一個特定的型別,比如 Employee、Puppy 等。變數一旦聲明後,型別就不能被改變了。
  • 物件、陣列都是引用資料型別。
  • 所有引用型別的預設值都是null。
  • 一個引用變數可以用來引用任何與之相容的型別。

字串

  • String 類是不可改變的,如果需要對字串做很多修改,那麼應該選擇使用 StringBuffer & StringBuilder 類。
  • 直接賦值初始化,如果常量池(雜湊表,key是字串值,value是物件地址)存在,返回記憶體地址,否則建立一個新字串物件,這叫做 字串駐留,比如String str1 = "ABC"; 這種構造效率高。
  • 使用new 初始化,每次都會建立新字串物件,String str2 = new String("ABC"); 判斷字串值是否相等,使用equals
  • string 的hashcode()計算方式
string的雜湊計算公式為 s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
取31為權:主要是因為31是一個奇質數,所以31*i=32*i-i=(i<<5)-i,這種位移與減法結合的計算相比一般的運算快很多。

陣列

宣告陣列
String [] arrStr = {"aa","bb"}; // 推薦這種宣告方式: 型別[] 變數
String arrStr2[] = {"aa","bb"}; // 型別 變數[] 是c++風格的。

System.out.println(Arrays.toString(arrStr) ); // 輸出陣列元素
System.out.println( Arrays.toString(arrStr2));

Arrays工具類:

Arrays.toString(arrar):返回陣列所有元素
Arrays.fill(array, 5):使用5填充所有的陣列元素
Arrays.sort(array1):對整個陣列排序
Arrays.equals(array, array1):比較陣列array和array1的值是否相同
Arrays.binarySearch(array, key):通過二分查詢,key是否在array中

為什麼獲取陣列的長度用 .length (成員變數的形式),而獲取String的長度用 .length() (成員方法的形式)?”
因為陣列的長度存在物件頭中,陣列本身是沒有length成員變數的。

類和物件

  • 類:類是一個模板,它描述一類物件的行為和狀態。
  • 物件:物件是類的一個例項(物件不是找個女朋友),有狀態和行為。
  • 一個原始檔中只能有一個public類
  • 一個原始檔可以有多個非public類
  • 原始檔的名稱應該和public類的類名保持一致。例如:原始檔中public類的類名是Employee,那麼原始檔應該命名為Employee.java。
  • 如果一個類定義在某個包中,那麼package語句應該在原始檔的首行。
  • 如果原始檔包含import語句,那麼應該放在package語句和類定義之間。如果沒有package語句,那麼import語句應該在原始檔中最前面。
  • import語句和package語句對原始檔中定義的所有類都有效。在同一原始檔中,不能給不同的類不同的包宣告。

列舉型別

列舉的定義和使用

//定義列舉型別,使用關鍵字enum
enum Day {
    MONDAY, TUESDAY, WEDNESDAY,
    THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

// 使用列舉
Day day =Day.MONDAY;

列舉的實現原理

  • 生成一個類Day,該類繼承自Enum
  • 列舉中的每一個例項,成為類Day的例項

//反編譯Day.class
final class Day extends Enum
{
    //私有建構函式
    private Day(String s, int i)
    {
        super(s, i);
    }
     //前面定義的7種列舉例項
    public static final Day MONDAY;
    public static final Day TUESDAY;
    public static final Day WEDNESDAY;
    public static final Day THURSDAY;
    public static final Day FRIDAY;
    public static final Day SATURDAY;
    public static final Day SUNDAY;
    private static final Day $VALUES[];

    static 
    {    
        //例項化列舉例項
        MONDAY = new Day("MONDAY", 0);
        TUESDAY = new Day("TUESDAY", 1);
        WEDNESDAY = new Day("WEDNESDAY", 2);
        THURSDAY = new Day("THURSDAY", 3);
        FRIDAY = new Day("FRIDAY", 4);
        SATURDAY = new Day("SATURDAY", 5);
        SUNDAY = new Day("SUNDAY", 6);
        $VALUES = (new Day[] {
            MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
        });
    }
}

補充

二進位制中的原碼、反碼、補碼

對於有符號數而言:

  • 二進位制的最高位是符號位:0表示正數,1表示負數
  • 正數的原碼、反碼、補碼都一樣;

  • 負數的反碼 = 它的原碼符號位不變,其他位取反(0 ->1 ; 1->0 );
  • 負數的補碼 = 它的反碼 +1;

  • 0的反碼、補碼都是0;
  • 在計算機運算的時候,都是以補碼的方式來運算的;

使用BigDecimal表示金額

我們可以使用BigDecimal來表示金額,或者是通過將金額的單位變小用整數來表示金額。

// 建議優先使用String構造方法。不要使用double型別的建構函式,否則還是會轉為多精度的小數
BigDecimal ba = new BigDecimal("0.03"); // 直接用string
BigDecimal bb = new BigDecimal(Double.toString(0.02)); // double轉為string
System.out.printf("%s-%s = %s \n",ba.toString(),bb.toString() , ba.subtract(bb));

參考