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