java里的八大基礎(chǔ)數(shù)據(jù)類型:
分別是:
long(64)
[-9,223,372,036,854,775,808~ 9,223,372,036,854,775,807]
默認值:0L
int(32)
[-2,147,483,648-2,147,483,647] 20億左右
默認值: 0
short(16)
[-32768~32767]
默認值: 0
byte(8)
[-128~127]
默認值: 0
float(32)
默認值:0.0f
ps:不能表示精確的值
double(64)
默認值 :0.0d
boolean(64)
默認值:false
char(16)
char類型是一個單一的 16 位 Unicode 字符
關(guān)于被封裝的基本類型
他們在java里都被封裝成了不同的包裝類
區(qū)別在于 一個是數(shù)據(jù)基本類型,而包裝類是一個對象。
對于類我們的使用應(yīng)該是這樣的
Integer i= new Integer(1);
但是在jdk1.5引入了自動裝箱與拆箱(注解1)
然后就可以
Integer i=1;
但是實際執(zhí)行的是Integer i = Integer.valueOf(1);
可以看下這段代碼
Integer a=1000;
Integer b=1000;
Integer c=100;
Integer d=100;
System.out.println(a==b);
System.out.println(c==d);
執(zhí)行輸出會是什么呢?
false
true
我們來看下源碼
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
說白了,就是當新建一個Integer類型的對象,如果其值再-128到127之內(nèi),就會將這個值緩存起來 用的時候也是用的同一個緩存對象,所以用==去判斷的時候,因為是同一個地址的同一個對象,所以肯定是==的。就不會去新new一個了。但是用equal方法去比較的時候,因為比較的是值,所以就都會返回true了。
public boolean equals(Object obj) {
//先判斷該對象是不是 Integer的實例
if (obj instanceof Integer) {
//進行值的比較
return value == ((Integer)obj).intValue();
}
return false;
}
這部分的源碼有些是相同的,所以這里只記錄下學(xué)習(xí)的結(jié)果,不將全部過程記錄下來。

在所有的數(shù)值類型里都繼承了Number類且實現(xiàn)了Comparable接口【注解2】。
在Number里 最主要都是定義了可以六種數(shù)值的獲取格式。
注解21:自動裝箱與拆箱
自動裝箱:
Integer i=1;
系統(tǒng)執(zhí)行:Integer i = Integer.valueOf(1);
自動拆箱:
int a=i;
系統(tǒng)執(zhí)行:int t = i.intValue();
注解2:關(guān)于Comparale 接口
主要說明下Comparale里面的方法,里面只有一個方法:
public int compareTo(T o);
其實這個的主要作用是暴露這個接口給外部可以重新定義排序的方法
class Grade implements Comparable<Grade> {
private Integer grade;
private String name;
public Grade(String name,Integer grade ) {
this.grade = grade;
this.name = name;
}
public Integer getGrade() {
return grade;
}
public void setGrade(Integer grade) {
this.grade = grade;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//重新定義排序
@Override
public int compareTo(Grade o){
if(o.getGrade()>this.getGrade()){
return 1;
} else if( o.getGrade()<this.getGrade()) {
return -1;
} else {
return 0;
}
}
}
public static void main(String[] args){
int[] test1={1,2,4,3,6,5};
Arrays.sort(test1);
for (Integer t:test1){
System.out.println(t.intValue());
}
Grade[] grades={
new Grade("aa",39),
new Grade("bb",42),
new Grade("cc",13),
new Grade("ee",73),
new Grade("ff",11),
};
Arrays.sort(grades);
for (Grade t:grades){
System.out.println(t.getName()+t.getGrade());
}
輸出結(jié)果為
ee73
bb42
aa39
cc13
ff11
我們就可以根據(jù)我們在Grade類里的重寫實現(xiàn) compareTo方法得到我們想要的排序
注解3:如何解決float,double存在精度丟失的問題
double result = 1.0 - 0.9;
結(jié)果為0.09999999999999998
因為浮點數(shù)值采用的是二進制表示,二級制中無法精確表示1/10。當不允許有任何四舍五入的誤差的時候應(yīng)該使用BigDecimal類。