1. 程式人生 > >java的常見的疑惑與陷阱

java的常見的疑惑與陷阱

1.不一樣的數字的寬型別和窄型別
2.令人崩潰的字串常量池和subString
3.不正常的finally和null
4.equals()也不容易等問題
一、常規問題採用常規的方式處理
二、不確定問題可以增加一些特殊/特定的條件(比如while迴圈中增加一些強制退出機制)

for(Entry<String,String> e:TSession.getCookiesPool().entrySet())
  clienetCookieList.append(e.getKey()+""+e.getValue()+"</br>");

三、變數名稱永遠不要用l
四、數字結尾永遠不要用l,表示long使用L

Long num =0x11111111L;

五、byte與int進行比較時,會進行有符號擴充套件
六、窄型別與寬型別比較時特別需要注意符號擴充套件

b==(byte)0x99
(b&0xFF)==0x99

七、複合賦值表達自動地將它們所執行的計算的結果轉型為其左側變數的型別
八、賦值操作資料越界導致編譯錯誤
九、複合賦值只能是基本型別,基本型別的包裝型別以及String,String的複合操作左側必須是String型別
十、使用原則:寬型別向低型別賦值一定不要複合操作

X=x=1與x+=1相同。
x=x+1最低,因為它的執行過程如下:
(1)讀取右x的地址。
(2)x+1.
(3)讀取左x的地址。
(4)將右值傳給左邊的x(編譯器並不認為左右x的地址相同)。
x+=1其次,其執行過程如下:
(1)讀取右x的地址。
(2)x+1.
(3)將得到的值傳給x(因為x的地址已經讀出)。
x++效率最高,其執行過程如下:
(1)讀取右x的地址。
(2)x自增1。

十一、不要指望
十二、不要指望常量池、儘量不要用intern()
十三、不要往常量池扔過多的東西,會導致持久化OOM
十四、如果只是普通的比較、匹配、傳參、臨時變數等、可以直接使用subString()
十五、如果需要成為常駐記憶體物件,需要包裝下new String(s.subString(from,to))
十六、永遠不要用命令為java.lang下的類名、包名不能命名為java/javax/java.lang/java.util/javax.sql等開頭、永遠不能類命名完全一致而實現不一致、儘可能的避免相同名稱,儘量不使用預設包。
十七、非常正常輸出、永遠不要用Label特性(多虧沒有goto


十八、finally裡面不允許有 return/break/continue/throw等改變正常退出的邏輯
十九、Set/HashSet換成List/ArrayList或者Map/HashMap
二十、equals()和hashCode()總是成對出現、equals有 自反性、對稱性、傳遞性、一致性、非空性
二十一、override針對例項方法
二十二、hidden針對靜態方法、屬性、內部類
二十三、override父類方法不能被呼叫,除非在子類內部使用super
二十四、hidden父類屬性、靜態方法等可以通過強制型別轉換被呼叫
二十五、研究遮蔽(shadow)和遮掩(obscure)
二十六、集合:List/Set/Map/ConcurrentMap、鎖:synchronized/volatile/lock、執行緒池:ThreadPool/Timer/Future
二十七、ArrayLsit特性:容量可變集合、隨機訪問、可克隆、可序列化。原理:陣列、1.5倍擴容、modCount特性、注意點 靜態引用防止記憶體洩漏:clear()/trimToSize()、迴圈注意併發修改、帶索引迭代:list.listIterator()、迴圈刪除方式
二十八、HashMap特性:任意key編碼、快速定位元素、自動擴充容量、HashMap實現 hashCode()、 indexFor()、resize()/rehash() 注意點:靜態引用防止記憶體洩漏:clear()/capacity、迴圈併發修改、迴圈使用entrySet()
二十九、指令重排序與volatile、原子操作與CAS、可重入鎖與讀寫鎖、條件變數與執行緒掛起、喚醒
三十、JUC體系結構、COncurrentHashMap的原理、徘徊BlockingQueue、執行緒池的最佳實踐
三十一、SRP、OCP、DIP、ISP、LSP
參考:淘寶 @逾輪