原文鏈接:Java包裝類之實體類不要使用基本類型
2020-01-12 11:14:32:756 星期日 🌤
今天來記錄一下,在項目中因爲基本類型,所產生的bug。**U•ェ•*U**
包裝類:8種基本類型的包裝類
應用場景:數據庫建立實體映射多用包裝類
這兩句話是重點:就是建立實體類禁止使用基本數據量類型!!!而用對應的包裝類,
爲什麼呢,看以下場景。
/**
* 8中基本類型的對應包裝類’
* byte short int long double float boolean char
* Byte Short Integer Long Double Float Boolean Character
* 區別:(舉例int,其餘相同)
* 1、int默認爲0,integer默認爲null
* 2、int是java的基本數據類型,integer是int的包裝類
* 3、integer必須new,int直接使用
*/
/**
* 場景一:
* 創建對應數據庫的實體類字段
* 1、創建一個類型(type),對應數據庫的一個字段
* 2、注意:此存在嚴重問題,基本類型都默認有值。如int 默認爲0
* 3、那在進行數據庫新增的時候,如果不填,則會默認爲0。
* 4、會產生嚴重的bug,應該改爲包裝類的引用類型
*/
//錯誤示範
private int type;//代表類型
//正確,設置爲integer類型
private Integer typeT;
所以,多用包裝類進行賦值。
補充:
/**
* 場景二:
* 自動裝箱And自動拆箱
*/
private void testBox() {
//原本轉換方式
int t = 10;
Integer ct = new Integer(t);
int tt = ct.intValue();
int i = 10;
//自動裝
Integer c = i;
//自動拆
int ic = c;
}
筆試題題如下?爲什麼一個爲true,一個爲false???
/**
* 自動裝拆箱
*/
public static void main(String[] args) {
Integer integer0 = 127;
Integer integer1 = 127;
System.out.println(integer0 == integer1);//等於true
Integer integer2 = 128;
Integer integer3 = 128;
System.out.println(integer2 == integer3);//等於false
/** 源碼
* public static Integer valueOf(int i) {
* if (i >= Integer.IntegerCache.low && i <= Integer.IntegerCache.high)
* return Integer.IntegerCache.cache[i + (-Integer.IntegerCache.low)];
* return new Integer(i);
* }
* 通過上我們發現,如果他的int值在最高和最低之間,他直接返回cache內的數據
* 否則, new Integer(i);
* 那麼最高值:?=high 127 ,最低值:?=low -128,
* 所以:在-128至127內,他們引用的是緩存內的數據,地址相同,所以爲true。超過此則爲false
*
* private static class IntegerCache {
* static final int low = -128;
* static final int high;
* static final Integer cache[];
*
* static {
* // high value may be configured by property
* int h = 127;
* String integerCacheHighPropValue =
* sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
* if (integerCacheHighPropValue != null) {
* try {
* int i = parseInt(integerCacheHighPropValue);
* i = Math.max(i, 127);
* // Maximum array size is Integer.MAX_VALUE
* h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
* } catch( NumberFormatException nfe) {
* // If the property cannot be parsed into an int, ignore it.
* }
* }
* high = h;
*
* cache = new Integer[(high - low) + 1];
* int j = low;
* for(int k = 0; k < cache.length; k++)
* cache[k] = new Integer(j++);
*
* // range [-128, 127] must be interned (JLS7 5.1.7)
* assert IntegerCache.high >= 127;
* }
*
* private IntegerCache() {}
* }
*
*/
}
註解記錄完畢,這些在日常開發中還是很需要我們注意的。