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