1.Long類型的空比較,不是null,而是0L
錯誤的寫法
正確的寫法
2.equals 與 == 的使用問題
== :
????在基本數據類型之間比較的是數值大小
????在對象之間比較的是內存地址是否一致
equals :
????在封裝的數據類型(Integer,Short,Long,Float,Double),String中,比較的是數值大小,因為在這些對象中equals方法已經被重寫
????在對象之間的比較依然是內存地址是否一致
但是需要注意的是:
數值類型只要在-128~127的范圍內的都是存儲在緩存中;
字符串類型只要不是new出來的,直接法創建的字符串也都是存儲在緩存中;String str = "AAA";
存儲在緩存中的類型意味著值只有一個,不同的只是對值的引用。
例子:
Long long1 = 3L;? // -128~127
Long long2 = 3L;
long1 == long2? ?true
結論:
Boolean(無緩存)
Byte (全緩存)
Short(-128~127之間存在緩存中)
Integer(-128~127之間存在緩存中)
Long(-128~127之間存在緩存中)
Folat(無緩存)
Double(無緩存)
String(直接發創建出來的均存在緩存中)
Character(無緩存)
2.toString()的使用錯誤
Object對象.toString()? 獲得的是字段的類型和物理地址
String對象.toString()? ?獲得的是字段存儲的值
錯誤的寫法
改正之后的寫法
3.String? ?StringBuffer? ?StringBuilder的用法和區別
String? ?不可變字符串對象,每一次對String對象的改變都是產生一個新的String對象,String對象對字符串的增加或者刪減操作,在JVM運行時也是轉化為StringBuffer進行操作的,因此String操作字符串的速度會比StringBuffer慢;
StringBuffer? ?可變字符串對象,線程安全,適用在多線程下;
StringBuilder? 可變字符串對象,線程不安全,適用在單線程下,絕大多數對字符串的操作都是單線程的情況下,所以在5.0版本之后新增StringBuilder來替代單線程下對String對操作;
運行速度:
StringBuilder > StringBuffer > String
使用情況總結:
String:適用于少量的字符串操作的情況
StringBuilder:適用于單線程下在字符緩沖區進行大量操作的情況
StringBuffer:適用多線程下在字符緩沖區進行大量操作的情況