java中的基本類型包含以下幾個:
byte弄砍、short、int输涕、long输枯、float、double占贫、char、boolean
整型
其中byte先口、short型奥、int、long都是表示整數(shù)的碉京,只不過他們的取值范圍不一樣
byte的取值范圍為-128~127厢汹,占用1個字節(jié)(-2的7次方到2的7次方-1)
short的取值范圍為-32768~32767,占用2個字節(jié)(-2的15次方到2的15次方-1)
int的取值范圍為(-2147483648~2147483647)谐宙,占用4個字節(jié)(-2的31次方到2的31次方-1)
long的取值范圍為(-9223372036854774808~9223372036854774807)烫葬,占用8個字節(jié)(-2的63次方到2的63次方-1)
可以看到byte和short的取值范圍比較小,而long的取值范圍太大,占用的空間多搭综,基本上int可以滿足我們的日常的計算了垢箕,而且int也是使用的最多的整型類型了。
在通常情況下兑巾,如果java中出現(xiàn)了一個整數(shù)數(shù)字比如35条获,那么這個數(shù)字就是int型的,如果我們希望它是byte型的蒋歌,可以在數(shù)據(jù)后加上大寫的B:35B帅掘,表示它是byte型的,同樣的35S表示short型堂油,35L表示long型的修档,表示int我們可以什么都不用加,但是如果要表示long型的府框,就一定要在數(shù)據(jù)后面加“L”吱窝。
浮點型
float和double是表示浮點型的數(shù)據(jù)類型,他們之間的區(qū)別在于他們的精確度不同
float 3.402823e+38 ~ 1.401298e-45(e+38表示是乘以10的38次方寓免,同樣癣诱,e-45表示乘以10的負45次方)占用4個字節(jié)
double 1.797693e+308~ 4.9000000e-324 占用8個字節(jié)
double型比float型存儲范圍更大,精度更高袜香,所以通常的浮點型的數(shù)據(jù)在不聲明的情況下都是double型的撕予,如果要表示一個數(shù)據(jù)是float型的,可以在數(shù)據(jù)后面加上“F”蜈首。
浮點型的數(shù)據(jù)是不能完全精確的实抡,所以有的時候在計算的時候可能會在小數(shù)點最后幾位出現(xiàn)浮動,這是正常的欢策。
boolean型(布爾型)
這個類型只有兩個值吆寨,true和false(真和非真)
char型(文本型)
用于存放字符的數(shù)據(jù)類型,占用2個字節(jié)踩寇,采用unicode編碼啄清,它的前128字節(jié)編碼與ASCII兼容
字符的存儲范圍在\u0000~\uFFFF,在定義字符型的數(shù)據(jù)時候要注意加' '俺孙,比如 '1'表示字符'1'而不是數(shù)值1
其中最常用的是 int 辣卒、double、float睛榄。一般用不到long和double荣茫,主要是這兩個數(shù)字的精度都非常高,一般的項目是用不到這些大數(shù)字的场靴。前一段時間facebook被爆出用戶id超出最大值啡莉,原因就是facebook的用戶id采用mysql的自增數(shù)字港准,int型,最大值為2147483648咧欣,也就是21億多浅缸,facebook的注冊用戶已經(jīng)超過這個量了,當初設(shè)計時肯定沒想到會超過這么大的數(shù)该押,以后整體調(diào)整程序疗杉,改為long型了,這下估計一百年也不會超過了蚕礼。
基本類型包裝器類型
boolean->Boolean
char->Character
int->Integer
byte->Byte
short->Short
long->Long
float->Float
double->Double
常見的類型之間的轉(zhuǎn)變都非常簡單烟具,這地方只想說一下什么時候用原生類型,什么時候用包裝類型奠蹬。
這一塊因為每個人的理解都不一樣朝聋,我只是描述一下我的理解,沒有對錯之分囤躁。
在Hibernate的實體對象中冀痕,要求每個字段都得是包裝類型,因為要涉及對象的equals比較狸演,原生類型是沒有這些方法的言蛇,所以必須得是包裝類型。
普通的model/VO/POJO/DTO中宵距,如果這個字段有可能為空或null腊尚,那這個字段就定義為包裝類型,如果這個字段肯定是數(shù)值類型不可能為null满哪,比如自增的主鍵id婿斥,則可以為原生類型。
這一塊要強調(diào)一下哨鸭,不能任何地方都用包裝類型民宿,因為如果數(shù)值為包裝類型,進行兩個數(shù)值的比較時會出現(xiàn)錯誤像鸡,舉例如下
參見com.critc.BasicTypeTest
:
/**
* Created by 孔垂云 on 2017/4/15.
* java 基本類型和包裝類型的區(qū)別
* java里面Integer在-128-127之間活鹰,兩個Integer對象是可以直接相等的,如果不在這個范圍內(nèi)只估,需要用equals來進行比較
*/
public class BasicTypeTest{
public static void main(String[] args) {
int a1=127,b1=127,a2=128,b2=128;
System.out.println(a1==b1);
System.out.println(a2==b2);
Integer a3=127,b3=127,a4=128,b4=128;
System.out.println(a3==b3);
System.out.println(a4==b4);//兩個值不能直接進行==比較
System.out.println(a3.equals(b3));
System.out.println(a4.equals(b4));
}
}
BigDecimal
涉及數(shù)據(jù)類型志群,還涉及一個一般項目用不到的類型,BigDecimal仅乓,這個不能稱之為數(shù)據(jù)類型,應(yīng)該叫對象蓬戚,用于銀行類金額計算的夸楣。
參見com.critc.BigDecimalTest
public static void main(String[] args) {
System.out.println(2.06 + 2.01);
BigDecimal a1=new BigDecimal(2.06);
BigDecimal b1=new BigDecimal(2.01);
System.out.println(a1.add(b1));//錯誤
BigDecimal a2=new BigDecimal(String.valueOf(2.06));
BigDecimal b2=new BigDecimal(String.valueOf(2.01));
System.out.println(a2.add(b2));
//精度計算
BigDecimal c2=a2.add(b2).setScale(1,BigDecimal.ROUND_CEILING);
System.out.println(c2);
}
主要講兩點
- 定義BigDecimal的時候,最好用 new BigDecimal(字符串),用字符串來定義豫喧,如果是int或float或double都轉(zhuǎn)成string
- 計算精度時一定要區(qū)分精度的類型石洗,是向上取,還是向下取紧显。因為銀行計算的精度默認都是元后面6位小數(shù)讲衫,而且都是舍棄后面的所有小數(shù),不是傳統(tǒng)的四舍五入孵班。
銀行的規(guī)則一定要清楚涉兽,多出來的錢都是銀行的,哪怕精確到小數(shù)點后面六位篙程。