java基礎-02資料型別
阿新 • • 發佈:2018-12-18
基本型別
整數
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));
參考
- Java 基本資料型別 http://www.runoob.com/java/java-basic-datatypes.html
- 二進位制(原碼、反碼、補碼) http://www.cnblogs.com/fuhaots2009/p/3476502.html
- Java中儲存金額用什麼資料型別 https://blog.csdn.net/z956281507/article/details/79188081
- 關於JAVA中string直接初始化賦值和new的區別 https://www.cnblogs.com/mayj/p/7093526.html
- Java 效能優化之 String 篇 https://www.ibm.com/developerworks/cn/java/j-lo-optmizestring/
- java陣列 http://www.runoob.com/java/java-array.html
- 為什麼如此獲取 Java 陣列的長度 https://blog.csdn.net/x_iya/article/details/79229355
- Java基礎——列舉詳解 https://www.cnblogs.com/kailejun/p/6624471.html
- 深入理解Java列舉型別(enum) https://blog.csdn.net/javazejian/article/details/71333103