摘要:根據(jù)拇指規(guī)則,最佳做法應(yīng)該是盡量減少屬性的訪問(wèn)級(jí)別。通常的,可變對(duì)象可用來(lái)避免產(chǎn)生過(guò)多的對(duì)象。如果類中定義了構(gòu)造函數(shù),那么編譯器將不會(huì)給它插入默認(rèn)構(gòu)造函數(shù)。
1、轉(zhuǎn)化數(shù)組為ArrayList
通常開發(fā)者轉(zhuǎn)化數(shù)組為ArrayList的方式為
Listlist = Arrays.asList(arr);
Arrays.asList()會(huì)返回一個(gè)ArrayList,而這個(gè)ArrayList是Arrays類的靜態(tài)內(nèi)部類,不是java.util.ArrayList。
這個(gè)類有g(shù)et()、set()和contains()方法,但卻沒(méi)有任何可以添加元素的方法。正確的做法可以這樣做
ArrayList2、檢查數(shù)組里面是否包含某個(gè)元素arrayList = new ArrayList (Arrays.asList(arr));
部分開發(fā)者會(huì)這樣實(shí)現(xiàn)
return new HashSet(Arrays.asList(arr)).contains(targetValue);
結(jié)果是對(duì)的,但是沒(méi)有必要轉(zhuǎn)化為Set,這反而會(huì)花費(fèi)更多時(shí)間,可以簡(jiǎn)單這樣實(shí)現(xiàn)
return Arrays.asList(arr).contains(targetValue);
或者
for(String s: arr){ if(s.equals(targetValue)) return true; } return false;
補(bǔ)充:第一種相比第二種可讀性會(huì)高一些。
3、數(shù)組中循環(huán)刪除元素分析一下下列代碼:
ArrayListlist = new ArrayList (Arrays.asList("a", "b", "c", "d")); for (int i = 0; i < list.size(); i++) { list.remove(i); } System.out.println(list);
輸出結(jié)果為:
[b, d]
因?yàn)楫?dāng)數(shù)組刪除一個(gè)元素后,它的長(zhǎng)會(huì)縮小,index相當(dāng)于向后移動(dòng)一位,這是個(gè)嚴(yán)重的問(wèn)題。當(dāng)你想通過(guò)index來(lái)刪除多個(gè)元素時(shí)候,這種方法是不可取的。
你也許知道用迭代器來(lái)刪除是沒(méi)問(wèn)題的,并且java中有一類for語(yǔ)句原理就是使用迭代器。但實(shí)際你想用這類for語(yǔ)句來(lái)代替迭代器進(jìn)行刪除也是不行的,如下代碼
ArrayListlist = new ArrayList (Arrays.asList("a", "b", "c", "d")); for (String s : list) { if (s.equals("a")) list.remove(s); }
將會(huì)拋出ConcurrentModificationException異常。
如下代碼才是正確的
ArrayListlist = new ArrayList (Arrays.asList("a", "b", "c", "d")); Iterator iter = list.iterator(); while (iter.hasNext()) { String s = iter.next(); if (s.equals("a")) { iter.remove(); } }
next()必須在remove()之前被調(diào)用。而在for循環(huán)中,編譯器會(huì)在元素被remove之后調(diào)用next(),因此就會(huì)拋出ConcurrentModificationException異常。
4、hashtable和hashmapjava中有兩類,HashTable和HashMap,兩者的數(shù)據(jù)結(jié)構(gòu)是一致的(哈希表),然后兩者的區(qū)別是:HashTable是同步的。
所以HashTable是線程安全的,HashMap不是線程安全的。
提示:也可以使用ConcurrentHashMap來(lái)保證線程安全,ConcurrentHashMap使用分段鎖(segment)的原理,效率上會(huì)高一些。
5、集合中原生態(tài)類型(raw type)的使用在java中,開發(fā)者通常把原生態(tài)類型(raw type)通常和無(wú)界通配符類型(unbounded wildcard type)弄混。拿Set來(lái)舉例子,Set是原生態(tài)類型,而Set>是無(wú)界通配符類型。
如下代碼使用了原生態(tài)類型
public static void add(List list, Object o){ list.add(o); } public static void main(String[] args){ Listlist = new ArrayList (); add(list, 10); String s = list.get(0); }
代碼將會(huì)拋出異常
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String at ...
原生態(tài)類型會(huì)越過(guò)泛型的校驗(yàn),是不安全的。
6、訪問(wèn)級(jí)別有的開發(fā)者將類某些屬性直接定義為public,這很容易通過(guò)外部訪問(wèn),但絕對(duì)是很差的設(shè)計(jì)。根據(jù)拇指規(guī)則,最佳做法應(yīng)該是盡量減少屬性的訪問(wèn)級(jí)別。
7、LinkList vs ArrayList很多開發(fā)者都習(xí)慣使用ArrayList,可能ArrayList相對(duì)來(lái)說(shuō)比較熟悉的緣故,其實(shí)ArrayList和LinkList還是存在很大的區(qū)別。簡(jiǎn)而言之,LinkList應(yīng)該在有大量增刪操作且無(wú)隨機(jī)訪問(wèn)操作時(shí)候使用。
8、可變(mutable) vs 不可變(immutable)不可變對(duì)象有很多優(yōu)點(diǎn),比如簡(jiǎn)單、安全等。但對(duì)于多個(gè)值則需要多個(gè)不同的對(duì)象來(lái)表示,對(duì)象過(guò)多時(shí),會(huì)消耗很多的GC資源。
通常的,可變對(duì)象可用來(lái)避免產(chǎn)生過(guò)多的對(duì)象。如下代碼中使用了不可變對(duì)象,那么執(zhí)行過(guò)程中將會(huì)產(chǎn)生很多的String,消耗很多時(shí)間和cpu性能。如果換成可變對(duì)象(StringBuilder等),將會(huì)好很多。
String result=""; for(String s: arr){ result = result + s; }9、父子類的構(gòu)造函數(shù)
class Super { String s; public Super(String s) { super(); this.s = s; } } class Sub extends Super { public Sub(String s) { } public Sub() { } }
上述代碼會(huì)出錯(cuò),是因?yàn)楦割惸J(rèn)構(gòu)造函數(shù)沒(méi)有定義。在java中,如果一個(gè)類沒(méi)有定義構(gòu)造函數(shù),則編譯器會(huì)給它構(gòu)造默認(rèn)的無(wú)參構(gòu)造函數(shù)。如果類中定義了構(gòu)造函數(shù),那么編譯器將不會(huì)給它插入默認(rèn)構(gòu)造函數(shù)。這個(gè)正是上述父類的遇到的情況。
在子類中的兩個(gè)構(gòu)造函數(shù)中,編譯器試圖插入父類的默認(rèn)構(gòu)造函數(shù)super(); ,然而并未找到,因此編譯出錯(cuò)。
10、"" or Constructor字符串可以通過(guò)兩種方式建立
//1. 直接引用 String x = "abc"; //2. 使用構(gòu)造函數(shù) String y = new String("abc");
兩者卻別可通過(guò)如下代碼闡明
String a = "abcd"; String b = "abcd"; System.out.println(a == b); // True System.out.println(a.equals(b)); // True String c = new String("abcd"); String d = new String("abcd"); System.out.println(c == d); // False System.out.println(c.equals(d)); // True
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70885.html
摘要:常見錯(cuò)誤五多線程處理不當(dāng)不管是桌面應(yīng)用還是應(yīng)用,無(wú)論是還是,多線程都是很難破解的。當(dāng)然,理想情況下,你也希望完全避免多線程錯(cuò)誤。同樣,不存在那種一刀切的方法,但這有一些調(diào)試和防止多線程錯(cuò)誤的實(shí)際考慮因素避免全局狀態(tài)首先,牢記全局狀態(tài)問(wèn)題。 Spring 可以說(shuō)是最流行的 Java 框架之一,也是一只需要馴服的強(qiáng)大野獸。雖然它的基本概念相當(dāng)容易掌握,但成為一名強(qiáng)大的 Spring 開發(fā)者...
摘要:月日,發(fā)布文章,介紹了年游戲項(xiàng)目的十大編程語(yǔ)言。無(wú)疑是游戲項(xiàng)目的最佳編程語(yǔ)言之一。是和等游戲引擎所使用的主要編程語(yǔ)言。對(duì)于游戲開發(fā)者來(lái)說(shuō),是最友好最靈活的編程語(yǔ)言之一。作為游戲項(xiàng)目的最佳視頻游戲編程語(yǔ)言之一,正在贏得屬于自己的一份榮耀。 ...
摘要:算法描述冒泡排序是一種簡(jiǎn)單的排序算法。算法描述和實(shí)現(xiàn)一般來(lái)說(shuō),插入排序都采用在數(shù)組上實(shí)現(xiàn)。平均情況希爾排序年發(fā)明第一個(gè)突破的排序算法是簡(jiǎn)單插入排序的改進(jìn)版它與插入排序的不同之處在于,它會(huì)優(yōu)先比較距離較遠(yuǎn)的元素。 前言 讀者自行嘗試可以想看源碼戳這,博主在github建了個(gè)庫(kù),讀者可以Clone下來(lái)本地嘗試。此博文配合源碼體驗(yàn)更棒哦~~~ 個(gè)人博客:Damonare的個(gè)人博客 原文地址:...
摘要:同時(shí)由于跨域了,就想利用的反向代理去處理一下跨域,但是在解決問(wèn)題的同時(shí),發(fā)現(xiàn)網(wǎng)上有些方案的確是存在一些問(wèn)題,在這里總結(jié)一下基本配置,也聊一下常見的配置問(wèn)題。 最近公司前后端分離,前端獨(dú)立提供頁(yè)面和靜態(tài)服務(wù)很自然的就想到了用nginx去做靜態(tài)服務(wù)器。同時(shí)由于跨域了,就想利用nginx的反向代理去處理一下跨域,但是在解決問(wèn)題的同時(shí),發(fā)現(xiàn)網(wǎng)上有些方案的確是存在一些問(wèn)題,在這里總結(jié)一下基本配置...
摘要:同時(shí)由于跨域了,就想利用的反向代理去處理一下跨域,但是在解決問(wèn)題的同時(shí),發(fā)現(xiàn)網(wǎng)上有些方案的確是存在一些問(wèn)題,在這里總結(jié)一下基本配置,也聊一下常見的配置問(wèn)題。 最近公司前后端分離,前端獨(dú)立提供頁(yè)面和靜態(tài)服務(wù)很自然的就想到了用nginx去做靜態(tài)服務(wù)器。同時(shí)由于跨域了,就想利用nginx的反向代理去處理一下跨域,但是在解決問(wèn)題的同時(shí),發(fā)現(xiàn)網(wǎng)上有些方案的確是存在一些問(wèn)題,在這里總結(jié)一下基本配置...
閱讀 2035·2023-04-26 01:56
閱讀 3143·2021-11-18 10:02
閱讀 3099·2021-09-09 11:35
閱讀 1341·2021-09-03 10:28
閱讀 3453·2019-08-29 18:36
閱讀 2882·2019-08-29 17:14
閱讀 861·2019-08-29 16:10
閱讀 1641·2019-08-26 13:45