亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

java常見十大誤區(qū)

yintaolaowanzi / 715人閱讀

摘要:根據(jù)拇指規(guī)則,最佳做法應(yīng)該是盡量減少屬性的訪問級(jí)別。通常的,可變對(duì)象可用來避免產(chǎn)生過多的對(duì)象。如果類中定義了構(gòu)造函數(shù),那么編譯器將不會(huì)給它插入默認(rèn)構(gòu)造函數(shù)。

1、轉(zhuǎn)化數(shù)組為ArrayList

通常開發(fā)者轉(zhuǎn)化數(shù)組為ArrayList的方式為

List list = Arrays.asList(arr);

Arrays.asList()會(huì)返回一個(gè)ArrayList,而這個(gè)ArrayList是Arrays類的靜態(tài)內(nèi)部類,不是java.util.ArrayList。

這個(gè)類有g(shù)et()、set()和contains()方法,但卻沒有任何可以添加元素的方法。正確的做法可以這樣做

ArrayList arrayList = new ArrayList(Arrays.asList(arr));
2、檢查數(shù)組里面是否包含某個(gè)元素

部分開發(fā)者會(huì)這樣實(shí)現(xiàn)

return new HashSet(Arrays.asList(arr)).contains(targetValue);

結(jié)果是對(duì)的,但是沒有必要轉(zhuǎn)化為Set,這反而會(huì)花費(fèi)更多時(shí)間,可以簡單這樣實(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)刪除元素

分析一下下列代碼:

ArrayList list = 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è)元素后,它的長會(huì)縮小,index相當(dāng)于向后移動(dòng)一位,這是個(gè)嚴(yán)重的問題。當(dāng)你想通過index來刪除多個(gè)元素時(shí)候,這種方法是不可取的。

你也許知道用迭代器來刪除是沒問題的,并且java中有一類for語句原理就是使用迭代器。但實(shí)際你想用這類for語句來代替迭代器進(jìn)行刪除也是不行的,如下代碼

ArrayList list = new ArrayList(Arrays.asList("a", "b", "c", "d"));
 
for (String s : list) {
    if (s.equals("a"))
        list.remove(s);
}

將會(huì)拋出ConcurrentModificationException異常。

如下代碼才是正確的

ArrayList list = 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和hashmap

java中有兩類,HashTable和HashMap,兩者的數(shù)據(jù)結(jié)構(gòu)是一致的(哈希表),然后兩者的區(qū)別是:HashTable是同步的。

所以HashTable是線程安全的,HashMap不是線程安全的。

提示:也可以使用ConcurrentHashMap來保證線程安全,ConcurrentHashMap使用分段鎖(segment)的原理,效率上會(huì)高一些。

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){
    List list = 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ì)越過泛型的校驗(yàn),是不安全的。

6、訪問級(jí)別

有的開發(fā)者將類某些屬性直接定義為public,這很容易通過外部訪問,但絕對(duì)是很差的設(shè)計(jì)。根據(jù)拇指規(guī)則,最佳做法應(yīng)該是盡量減少屬性的訪問級(jí)別。

7、LinkList vs ArrayList

很多開發(fā)者都習(xí)慣使用ArrayList,可能ArrayList相對(duì)來說比較熟悉的緣故,其實(shí)ArrayList和LinkList還是存在很大的區(qū)別。簡而言之,LinkList應(yīng)該在有大量增刪操作且無隨機(jī)訪問操作時(shí)候使用。

8、可變(mutable) vs 不可變(immutable)

不可變對(duì)象有很多優(yōu)點(diǎn),比如簡單、安全等。但對(duì)于多個(gè)值則需要多個(gè)不同的對(duì)象來表示,對(duì)象過多時(shí),會(huì)消耗很多的GC資源。

通常的,可變對(duì)象可用來避免產(chǎn)生過多的對(duì)象。如下代碼中使用了不可變對(duì)象,那么執(zhí)行過程中將會(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ù)沒有定義。在java中,如果一個(gè)類沒有定義構(gòu)造函數(shù),則編譯器會(huì)給它構(gòu)造默認(rèn)的無參構(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

字符串可以通過兩種方式建立

//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://www.ezyhdfw.cn/yun/70885.html

相關(guān)文章

  • 使用 Spring Framework 時(shí)常犯的十大錯(cuò)誤

    摘要:常見錯(cuò)誤五多線程處理不當(dāng)不管是桌面應(yīng)用還是應(yīng)用,無論是還是,多線程都是很難破解的。當(dāng)然,理想情況下,你也希望完全避免多線程錯(cuò)誤。同樣,不存在那種一刀切的方法,但這有一些調(diào)試和防止多線程錯(cuò)誤的實(shí)際考慮因素避免全局狀態(tài)首先,牢記全局狀態(tài)問題。 Spring 可以說是最流行的 Java 框架之一,也是一只需要馴服的強(qiáng)大野獸。雖然它的基本概念相當(dāng)容易掌握,但成為一名強(qiáng)大的 Spring 開發(fā)者...

    luckyw 評(píng)論0 收藏0
  • 2021年游戲項(xiàng)目的十大編程語言:C++、Java、C#均上榜

    摘要:月日,發(fā)布文章,介紹了年游戲項(xiàng)目的十大編程語言。無疑是游戲項(xiàng)目的最佳編程語言之一。是和等游戲引擎所使用的主要編程語言。對(duì)于游戲開發(fā)者來說,是最友好最靈活的編程語言之一。作為游戲項(xiàng)目的最佳視頻游戲編程語言之一,正在贏得屬于自己的一份榮耀。 ...

    不知名網(wǎng)友 評(píng)論0 收藏0
  • 十大經(jīng)典排序算法總結(jié)(Javascript描述)

    摘要:算法描述冒泡排序是一種簡單的排序算法。算法描述和實(shí)現(xiàn)一般來說,插入排序都采用在數(shù)組上實(shí)現(xiàn)。平均情況希爾排序年發(fā)明第一個(gè)突破的排序算法是簡單插入排序的改進(jìn)版它與插入排序的不同之處在于,它會(huì)優(yōu)先比較距離較遠(yuǎn)的元素。 前言 讀者自行嘗試可以想看源碼戳這,博主在github建了個(gè)庫,讀者可以Clone下來本地嘗試。此博文配合源碼體驗(yàn)更棒哦~~~ 個(gè)人博客:Damonare的個(gè)人博客 原文地址:...

    Binguner 評(píng)論0 收藏0
  • Nginx反向代理跨域基本配置與常見誤區(qū)

    摘要:同時(shí)由于跨域了,就想利用的反向代理去處理一下跨域,但是在解決問題的同時(shí),發(fā)現(xiàn)網(wǎng)上有些方案的確是存在一些問題,在這里總結(jié)一下基本配置,也聊一下常見的配置問題。 最近公司前后端分離,前端獨(dú)立提供頁面和靜態(tài)服務(wù)很自然的就想到了用nginx去做靜態(tài)服務(wù)器。同時(shí)由于跨域了,就想利用nginx的反向代理去處理一下跨域,但是在解決問題的同時(shí),發(fā)現(xiàn)網(wǎng)上有些方案的確是存在一些問題,在這里總結(jié)一下基本配置...

    lindroid 評(píng)論0 收藏0
  • Nginx反向代理跨域基本配置與常見誤區(qū)

    摘要:同時(shí)由于跨域了,就想利用的反向代理去處理一下跨域,但是在解決問題的同時(shí),發(fā)現(xiàn)網(wǎng)上有些方案的確是存在一些問題,在這里總結(jié)一下基本配置,也聊一下常見的配置問題。 最近公司前后端分離,前端獨(dú)立提供頁面和靜態(tài)服務(wù)很自然的就想到了用nginx去做靜態(tài)服務(wù)器。同時(shí)由于跨域了,就想利用nginx的反向代理去處理一下跨域,但是在解決問題的同時(shí),發(fā)現(xiàn)網(wǎng)上有些方案的確是存在一些問題,在這里總結(jié)一下基本配置...

    JasonZhang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<