OOP規(guī)約
1.避免使用類對(duì)象調(diào)用靜態(tài)方法,要用類名嘟點(diǎn)的方式調(diào)用
2.所有覆寫的方法都要加@Override注解
3.最好不用可變參數(shù)這種方式去編程
4.不要使用過時(shí)的類和方法
5.外部正在調(diào)用或者二方庫依賴的接口畔裕,不允許修改方法簽名酣衷,避免對(duì)接口調(diào)用方產(chǎn)
生影響商虐。接口過時(shí)必須加@Deprecated 注解菊卷,并清晰地說明采用的新接口或者新服務(wù)是什
么囱淋;沒接觸過
6.Object的equal方法盡量不要用缀壤,要用常量或者已知確定不會(huì)為空的數(shù)字嘟點(diǎn)然后調(diào)用equals方法樊拓;昨天遇到了這個(gè)問題;
7.所有整型包裝類比較都要用equals方法 不要用==前面已經(jīng)說過了記住兩套 整型包裝類用equals比較诉位;在-128到127之間 可以==是true 超過這個(gè)范圍就未必了骑脱。記住記住苍糠;7-15中 有具體解釋
8.浮點(diǎn)數(shù)之間的等值判斷叁丧,基本數(shù)據(jù)類型不用== ,包裝類不用equals
推薦使用兩種方式第一,可以設(shè)置一個(gè)極小值 當(dāng)他們的比值小于這個(gè)數(shù)的時(shí)候就認(rèn)為相等
第二種 我能理解的就是使用BigDecimal這個(gè)類 拥娄,具體用到了再學(xué)吧
9.DO類對(duì)象的屬性要和數(shù)據(jù)庫中的屬性相同蚊锹;數(shù)據(jù)庫中 的 bigint必須和類中的Long對(duì)應(yīng);
10.為了防止精度丟失禁止使用BigDecimal的構(gòu)造方法將double傳進(jìn)去稚瘾,最好是傳入的參數(shù)類型為String牡昆;要不就BigDecimal bd = new BigDecimal(“1.22323”)或者
BigDecimal bd = BigDecimal.valueOf(1.232123)這個(gè)也可以,valueOf內(nèi)部是toString方法摊欠,就是把double的后面的零截取了轉(zhuǎn)換為一個(gè)String返回丢烘;
11.所有POJO類型和RPC類都需要使用包裝數(shù)據(jù)類型,記住就行了些椒,應(yīng)為查詢數(shù)據(jù)庫的時(shí)候有可能返回null播瞳,如果使用基本數(shù)據(jù)類接收 就會(huì)出現(xiàn)NPE;
12.序列化類新增屬性時(shí)免糕,請(qǐng)不要修改 serialVersionUID 字段赢乓,避免反序列失敗;如果
完全不兼容升級(jí),避免反序列化混亂石窑,那么請(qǐng)修改 serialVersionUID 值牌芋。不懂以后遇到再說
13.構(gòu)造方法中不要加入業(yè)務(wù)邏輯,需要添加業(yè)務(wù)邏輯的時(shí)候定一個(gè)init()方法松逊;
14.POJO 類必須寫 toString 方法躺屁。使用 IDE 中的工具:source> generate toString時(shí),如果繼承了另一個(gè) POJO 類棺棵,注意在前面加一下 super.toString楼咳。說明:在方法執(zhí)行拋出異常時(shí),可以直接調(diào)用 POJO 的 toString()方法打印其屬性值烛恤,便于排查問題母怜。
15.POJO類中不能同時(shí)有isxxx()和getxx()方法;
16.使用索引訪問用 String 的 split 方法得到的數(shù)組時(shí)缚柏,需做最后一個(gè)分隔符后有無內(nèi)
容的檢查苹熏,否則會(huì)有拋 IndexOutOfBoundsException 的風(fēng)險(xiǎn)。
17.循環(huán)體內(nèi)的字符串連接應(yīng)該使用StringBuilder類的append方法進(jìn)行拼接币喧,如果用循環(huán)+的方式進(jìn)行拼接轨域,那么每次+的時(shí)候都會(huì)從內(nèi)部產(chǎn)生一次StringBuilder,造成了內(nèi)存的浪費(fèi)
18.final 可以聲明類杀餐、成員變量干发、方法、以及本地變量史翘,下列情況使用 final 關(guān)鍵字:
他說可以也沒說必須
1) 不允許被繼承的類枉长,如:String 類冀续。//內(nèi)部已經(jīng)定好了干嘛要在這里再說一遍;
2) 不允許修改引用的域?qū)ο蟆?/這個(gè)好理解不允許修改必峰,還不加上
3) 不允許被覆寫的方法洪唐,如:POJO 類的 setter 方法。//沒遇到過啊自動(dòng)生成了
4) 不允許運(yùn)行過程中重新賦值的局部變量吼蚁。//常量凭需??肝匆?反正常量定義了也不能改
5) 避免上下文重復(fù)使用一個(gè)變量粒蜈,使用 final 可以強(qiáng)制重新定義一個(gè)變量,方便更好地進(jìn)行重構(gòu)术唬。
19.類成員與方法訪問控制從嚴(yán):
1) 如果不允許外部直接通過 new 來創(chuàng)建對(duì)象薪伏,那么構(gòu)造方法必須是 private。
2) 工具類不允許有 public 或 default 構(gòu)造方法粗仓。
3) 類非 static 成員變量并且與子類共享,必須是 protected设捐。
4) 類非 static 成員變量并且僅在本類使用借浊,必須是 private。
5) 類 static 成員變量如果僅在本類使用萝招,必須是 private蚂斤。
6) 若是 static 成員變量,考慮是否為 final槐沼。
7) 類成員方法只供類內(nèi)部調(diào)用曙蒸,必須是 private。
8) 類成員方法只對(duì)繼承類公開岗钩,那么限制為 protected纽窟。
集合處理
1.equals和hashcode方法:只要覆寫了equals必須覆寫hashcode;set存儲(chǔ)對(duì)象必須覆寫這兩個(gè)方法兼吓;自定義的map寫需要覆寫這兩個(gè)方法臂港;
2.ArrayList 的 subList 結(jié)果不可強(qiáng)轉(zhuǎn)成 ArrayList,否則會(huì)拋出 ClassCastException 異常视搏,subList 返回的是 ArrayList 的內(nèi)部類 SubList审孽,并不是 ArrayList 而是 ArrayList 的一個(gè)視圖,對(duì)于 SubList 子列表的所有操作最終會(huì)反映到原列表上浑娜。在subList場(chǎng)景中佑力,高度注意對(duì)原集合元素的增加或刪除,均會(huì)導(dǎo)致子列表的遍
歷筋遭、增加打颤、刪除產(chǎn)生 ConcurrentModificationException 異常暴拄。
集合這種list視圖還是第一次聽說
3.使用Map的方法keySet()/values()/entrySet()返回集合對(duì)象時(shí),不可以對(duì)其進(jìn)行添加元素操作瘸洛,否則會(huì)拋出 UnsupportedOperationException 異常
4.使用集合轉(zhuǎn)數(shù)組的方法揍移,必須使用集合的toArray(T[]array),傳入的是類型完全一致反肋、長度為 0 的空數(shù)組那伐。
List list = new ArrayList<>(2);
list.add("guan");
list.add("bao");
String[] array = list.toArray(new String[0]);
5.使用工具類Arrays.asList()把數(shù)組轉(zhuǎn)換成集合時(shí),不能使用其修改集合相關(guān)的方法石蔗,它的 add/remove/clear 方法會(huì)拋出 UnsupportedOperationException 異常罕邀。說明:asList 的返回對(duì)象是一個(gè) Arrays 內(nèi)部類,并沒有實(shí)現(xiàn)集合的修改方法养距。Arrays.asList 體現(xiàn)的是適配器模式诉探,只是轉(zhuǎn)換接口,后臺(tái)的數(shù)據(jù)仍是數(shù)組棍厌。
public static void main(String[] args) {
String[] s =new String[] {"a","b","c","d"};
List list = Arrays.asList(s);
list.stream().forEach(i-> System.out.println(i));
list.set(0,"f");
//? ? ? ? list.add("f");? 這里就如文中所說的一樣會(huì)拋出異常肾胯;
? ? ? ? list.stream().forEach(i-> System.out.println(i));
s[0] ="a";
list.stream().forEach(i-> System.out.println(i));
}//這里可以看到只要set改變了值之后就會(huì)改變,然后數(shù)組改回來之后又編程了abcd耘纱;
6.泛型通配符<?extendsT>來接收返回的數(shù)據(jù)敬肚,此寫法的泛型集合不能使用add方法,而<? super T>不能使用 get 方法束析,作為接口調(diào)用賦值時(shí)易出錯(cuò)艳馒。說明:擴(kuò)展說一下 PECS(Producer Extends Consumer Super)原則:第一、頻繁往外讀取內(nèi)容的员寇,適合用<? extends T>弄慰。第二、經(jīng)常往里插入的蝶锋,適合用<? super T>
簡單來說就是 <? extends C> 上界為 C 類型范圍粗略理解為 [C,+∞)陆爽,不允許添加除 null 的元素,獲取的元素類型是 C 牲览;
<? super C> 下界為 C 類型范圍粗略理解為 (-∞,C]墓陈,允許添加 C 以及 C 的子類類型的元素,獲取的元素類型是 Object
add():編譯器只知道類型是 C 或 C 的子類第献,所以有可能是 C D E F 其中一個(gè)類型贡必,為保證類型安全不能添加除了 null 以外的任何元素,即使是 C 本身也不行
get():既然編譯器不知道此時(shí)集合中的元素是 C D E F 的哪一個(gè)庸毫,返回類型只能是他們共同父類 C 類型仔拟。
add():編譯器只知道類型是 C 或者 C 的父類,所以有可能是 A B C 其中一個(gè)類型飒赃。編譯器知道下界是 C 利花,根據(jù)類型向上兼容所以可以添加的元素是 C 以及 C 的子類(單車可以代表車)科侈。
get():既然編譯器不確定集合類型是 A B C 的哪一種,返回類型只能是他們的共同父類 Object 炒事。
特點(diǎn):<? extends C> 的 add() 被限制臀栈,<? super C> 的 get() 被限制
7.在無泛型限制定義的集合賦值給泛型限制的集合時(shí),在使用集合元素時(shí)挠乳,需要進(jìn)行instanceof 判斷权薯,避免拋出 ClassCastException 異常。
8.不要在 foreach 循環(huán)里進(jìn)行元素的 remove/add 操作睡扬。remove 元素請(qǐng)使用Iterator 方式盟蚣,如果并發(fā)操作,需要對(duì) Iterator 對(duì)象加鎖卖怜。面試的時(shí)候遇到過一次
9.高度注意 Map 類集合 K/V 能不能存儲(chǔ) null 值的情況屎开,如下表格:
集合類KeyValueSuper說明
Hashtable不允許為 null不允許為 nullDictionary線程安全
ConcurrentHashMap不允許為 null不允許為 nullAbstractMap鎖分段技術(shù)(JDK8:CAS)
TreeMap不允許為 null允許為 nullAbstractMap線程不安全
HashMap允許為 null允許為 nullAbstractMap線程不安全
反例:由于 HashMap 的干擾,很多人認(rèn)為 ConcurrentHashMap 是可以置入 null 值马靠,而事實(shí)上奄抽,存儲(chǔ)null 值時(shí)會(huì)拋出 NPE 異常。