成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

java常見十大誤區(qū)

yintaolaowanzi / 671人閱讀

摘要:根據(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的方式為

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()方法,但卻沒(méi)有任何可以添加元素的方法。正確的做法可以這樣做

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ì)的,但是沒(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)刪除元素

分析一下下列代碼:

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è)元素后,它的長(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)行刪除也是不行的,如下代碼

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來(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){
    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ì)越過(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

相關(guān)文章

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

    摘要:常見錯(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ā)者...

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

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

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

    摘要:算法描述冒泡排序是一種簡(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è)人博客 原文地址:...

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

    摘要:同時(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é)一下基本配置...

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

    摘要:同時(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é)一下基本配置...

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

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

0條評(píng)論

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