程序员基本功05表达式中的陷阱
你盡管去做,其他的交給天意:讀書筆記讀書筆記
1、Java字符串的特點(diǎn)
當(dāng)程序使用字符串、基本類型包裝類實(shí)例是,盡量使用字符串直接量、基本類型值的直接量,避免通過new String()、new Integer()形式來創(chuàng)建字符串、基本類型包裝類實(shí)例。對于Java程序中的字符串直接量,JVM會使用一個(gè)字符串池來保護(hù)它們,當(dāng)程序再次使用該字符串時(shí),無需創(chuàng)建一個(gè)新的字符串。JVM在編譯時(shí)就可以確定字符串的值可以讓該字符串指向字符串池中對應(yīng)的字符串;如果程序中使用了變量或調(diào)用看方法,那就只能等到運(yùn)行時(shí)才能確定字符串的值,也就無法在編譯時(shí)確定字符串變量,從而無法使用JVM字符串池。如果字符串連接運(yùn)算中所有變量執(zhí)行了“宏替換”,那么JVM可以在編譯時(shí)就確定字符串表達(dá)式的值。
2、String、StringBuilder和StringBuffer
當(dāng)一個(gè)string對象創(chuàng)建完成后,該string類包含的字符序列就被固定下來了,以后永遠(yuǎn)不能變。因此如果程序需要一個(gè)字符序列會發(fā)生改變的字符串,考慮使用stringBuilder或StringBuffer。StringBuilder與StringBuffer的唯一區(qū)別是,StringBuffer是線程安全的,但效率會降低。在沒有多線程的情況下,首先使用StringBuilder。??
如果程序比較的是倆個(gè)字符串是否相同,用(==)就行了【比較倆個(gè)字符串引用變量是否指向同一個(gè)字符串對象】;但如果要判斷倆個(gè)字符串所包含的字符序列是否相同,則應(yīng)該用String重寫過的equals方法進(jìn)行比較。
3、表達(dá)式類型自動提升的陷阱
Java是一門強(qiáng)類型語言,強(qiáng)類型語言的倆個(gè)基本特征:所有變量不許聲明,然后才能使用,聲明變量時(shí)必須指定該變量的數(shù)據(jù)類型;一旦某個(gè)變量的數(shù)據(jù)類型確定下來了,那這個(gè)變量將永遠(yuǎn)只能接受該類型的值。
當(dāng)一個(gè)算術(shù)表達(dá)式中包含多個(gè)基本類型變量,整個(gè)算術(shù)表達(dá)式的數(shù)據(jù)類型將自動提升:byte、short和char將自動提升為int——》long——》float——》double。?
4、復(fù)合賦值運(yùn)算符隱含的類型轉(zhuǎn)換
復(fù)合賦值運(yùn)算包含一個(gè)隱式類型轉(zhuǎn)換:a+=5等價(jià)于a=(a的類型)(a+5),其于a=a+5不一樣。
復(fù)合運(yùn)算有:+=、-=、*=、%=、<<=、>>=、>>>=、&=、
如果把+=當(dāng)成字符串連接符使用,則+=運(yùn)算符左邊的變量只能是String類型,不能是String的父類類型,如(object或CharSequence)。
5、輸入法導(dǎo)致的陷阱
基本上,如果在編譯時(shí)提示“非法字符串:\xxxxxx”的錯(cuò)誤提示,可斷定程序中國包含“全角字符”,逐個(gè)刪除就行
6、必須使用合法的注釋字符
\u后面的4個(gè)字符必須是0-F。
7、慎用字符的Unicode轉(zhuǎn)義形式
\u000a是換行符,慎用
8、泛型中原始類型變量的賦值
當(dāng)程序把一個(gè)原始類型的變量賦給一個(gè)帶泛型信息的變量時(shí),總是可以編譯----只是會提示一些警告信息;如果只是簡單的輸出每個(gè)集合元素,并不涉及集合元素類型,程序不會出現(xiàn)異常 ;否則,程序要么編譯異常,要么運(yùn)行異常。
當(dāng)程序試圖訪問帶泛型聲明的集合的元素集合時(shí),編譯器總是把集合元素當(dāng)成泛型類型處理----它并不關(guān)心集合元素實(shí)際類型
當(dāng)程序試圖訪問帶泛型聲明的集合的集合元素時(shí),JVM會遍歷每個(gè)集合元素自動只從強(qiáng)制轉(zhuǎn)型,如果集合元素的實(shí)際類型與集合所帶的泛型信息不匹配,運(yùn)行時(shí)將引發(fā)ClassCastException。
9、原始類型帶來的擦除
當(dāng)把一個(gè)具有泛型信息的對象賦給另一個(gè)沒有泛型信息的變量時(shí),所有尖括號之間的類型信息都將被丟棄。
10、Java不支持泛型數(shù)組
11、正則表達(dá)式中(.)匹配任意字符
split(string regex)、replaceAll(string regex,String replacement)、replaceFirst(String regex,String replacment)
“\\.”代表轉(zhuǎn)義,“\\\\”標(biāo)識雙斜桿
12、不要調(diào)用線程對象的run方法
3種方法創(chuàng)建、啟動多線程:
繼承Thread類來創(chuàng)建線程類、重寫run()方法作為線程執(zhí)行體;
實(shí)現(xiàn)Runnable接口來創(chuàng)建線程類,重寫run()方法作為線程執(zhí)行體
實(shí)現(xiàn)Callable接口來創(chuàng)建線程類,重寫call()方法作為線程執(zhí)行體。
第一種方式效果最差:線程繼承了Thread類,無法繼承其他父類;因?yàn)槊織l線程都是一個(gè)Thread子類實(shí)例,因此多個(gè)線程之間共享數(shù)據(jù)比較麻煩。
13、靜態(tài)同步方法的同步監(jiān)視器是類
Java提供synchronized關(guān)鍵字用于修飾方法,使用synchronized修飾的方法被稱為同步方法。當(dāng)然,還可以修飾普通代碼塊,被修飾的代碼塊稱為同步代碼塊。java規(guī)定,任何線程進(jìn)入同步方法、同步代碼塊之前,必須先獲取同步方法、同步代碼塊對應(yīng)的同步監(jiān)視器。
14、多線程執(zhí)行環(huán)境的線程安全問題
不考慮多線程環(huán)境的情況下,很多類代碼都是正確的,但一旦將它們放在多線程環(huán)境下,這個(gè)類就變得很脆弱,這種類稱為線程不安全,在多線程環(huán)境下,使用線程不安全的類是危險(xiǎn)的。
使用synchronized關(guān)鍵字修飾方法,通過同步方法可以得到線程安全類。
總結(jié)
以上是生活随笔為你收集整理的程序员基本功05表达式中的陷阱的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员基本功04JAVA的内存回收
- 下一篇: 程序员基本功11树和二叉树