乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Java程序員們最常犯的10個錯誤

       Mis林桑 2017-03-16
      本文由 ImportNew - 林林 翻譯自 programcreek。歡迎加入翻譯小組。轉(zhuǎn)載請見文末要求。

      1.將數(shù)組轉(zhuǎn)化為列表

      將數(shù)組轉(zhuǎn)化為一個列表時(shí),程序員們經(jīng)常這樣做:

      1
      List list = Arrays.asList(arr);

      Arrays.asList()會返回一個ArrayList對象,ArrayList類是Arrays的一個私有靜態(tài)類,而不是java.util.ArrayList類,java.util.Arrays.ArrayList類有set()、get()、contains()方法,但是沒有增加元素的方法,所以它的大小是固定的,想要創(chuàng)建一個真正的ArrayList類,你應(yīng)該這樣做:

      1
      ArrayList arrayList = new ArrayList(Arrays.asList(arr));

      ArrayList的構(gòu)造方法可以接受一個集合類型,剛好它也是java.util.Arrays.ArrayList的超類。

      2.判斷一個數(shù)組是否包含一個值

      程序員們經(jīng)常這樣做:

      1
      2
      Set set = new HashSet(Arrays.asList(arr));
      return set.contains(targetValue);

      這段代碼起作用,但是沒有必要把一個數(shù)組轉(zhuǎn)化成列表,轉(zhuǎn)化為列表需要額外的時(shí)間。它可以像下面那樣簡單:

      1
      Arrays.asList(arr).contains(targetValue);

      或者是:

      1
      2
      3
      4
      5
      6
      for(String s:arr){
          if(s.equals(targetValue)){
              return true;
          }
      }
      return false;

      第一種方法比第二種更容易讀

      3.在一個循環(huán)中刪除一個列表中的元素

      思考下面這一段在循環(huán)中刪除多個元素的的代碼

      1
      2
      3
      4
      5
      ArrayList list = new ArrayList(Arrays.asList('a','b','c','d'));
      for(int i=0;i
          list.remove(i);
      }
      System.out.println(list);

      輸出結(jié)果是:

      1
      [b,d]

      在這個方法中有一個嚴(yán)重的錯誤。當(dāng)一個元素被刪除時(shí),列表的大小縮小并且下標(biāo)變化,所以當(dāng)你想要在一個循環(huán)中用下標(biāo)刪除多個元素的時(shí)候,它并不會正常的生效。

      你也許知道在循環(huán)中正確的刪除多個元素的方法是使用迭代,并且你知道java中的foreach循環(huán)看起來像一個迭代器,但實(shí)際上并不是。考慮一下下面的代碼:

      1
      2
      3
      4
      5
      6
      ArrayList list = new ArrayList(Arrays.asList('a','b','c','d'));
      for(String s:list){
          if(s.equals('a')){
              list.remove(s);
          }
      }

      它會拋出一個ConcurrentModificationException異常。
      相反下面的顯示正常:

      1
      2
      3
      4
      5
      6
      7
      8
      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)用。在一個foreach循環(huán)中,編譯器會使.next()在刪除元素之后被調(diào)用,因此就會拋出ConcurrentModificationException異常,你也許希望看一下ArrayList.iterator()的源代碼。

      4.Hashtable與HashMap的對比

      就算法而言,哈希表是數(shù)據(jù)結(jié)構(gòu)的一個名字。但是在java中,這個數(shù)據(jù)結(jié)構(gòu)的名字是HashMap。Hashtable與HashMap的一個重要不同點(diǎn)是Hashtable是同步的。所以你經(jīng)常不需要Hashtable,相反HashMap經(jīng)常會用到。

      HashMap vs. TreeMap vs. Hashtable vs. LinkedHashMap

      Top 10 questions about Map

      5.在集合中使用原始類型

      在Java中原始類型與無界通配符類型很容易混合在一起,拿Set來說,Set是一個原始類型,而Set是無界的通配符類型。
      考慮下面使用原始類型List作為參數(shù)的代碼:

      1
      2
      3
      4
      5
      6
      7
      public static void add(List list,Object o){
          list.add(o);
      }
      pulbic static void main(String[] args){
          List list = new ArrayList();
          add(list,10);
          String s = list.get(0);

      這段代碼會拋出一個異常:

      1
      2
      Exception in thread 'main' java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
          at ...

      使用原生類型集合是危險(xiǎn)的,這是因?yàn)樵愋图咸^了泛型類型檢查,并且不是安全的,在Set、Set和Set中有很大的不同,具體請看Raw type vs. Unbounded wildcardType Erasure。

      6.訪問級別

      程序員們經(jīng)常使用public作為類字段的修飾符,可以很簡單的通過引用得到值,但這是一個壞的設(shè)計(jì),按照經(jīng)驗(yàn),分配給成員變量的訪問級別應(yīng)該盡可能的低。

      public, default, protected, and private

      7.ArrayList與LinkedList的對比

      當(dāng)程序員們不知道ArrayList與LinkedList的區(qū)別時(shí),他們經(jīng)常使用ArrayList,因?yàn)樗雌饋肀容^熟悉。然而,它們之前有巨大的性能差別。簡而言之,如果有大量的增加刪除操作并且沒有很多的隨機(jī)訪問元素的操作,應(yīng)該首先LinkedList。如果你剛接觸它們,請查看 ArrayList vs. LinkedList來獲得更多關(guān)于它們性能的信息。

      8.可變與不可變

      不可變對象有許多的優(yōu)點(diǎn),比如簡單,安全等等。但是對于每一個不同的值都需要一個獨(dú)立的對象,太多的對象可能會造成大量的垃圾回收。當(dāng)選擇可變與不可變時(shí)應(yīng)該有一個平衡。
      一般的,可變對象用來避免產(chǎn)生大量的中間對象。一個典型的例子是連接大量的字符串。如果你用一個不可變的字符串,你會產(chǎn)生很多需要進(jìn)行垃圾回收的對象。這很浪費(fèi)CPU的時(shí)間,使用可變對象是正確的解決方案(比如StringBuilder)。

      1
      2
      3
      4
      String result='';
      for(String s: arr){
          result = result + s;
      }

      有時(shí)在某些情況下也是需要可變對象的,比如將可變對象作為參數(shù)傳入方法,你不用使用很多語句便可以得到多個結(jié)果。另外一個例子是排序和過濾:當(dāng)然,你可以寫一個方法來接收原始的集合,并且返回一個排好序的集合,但是那樣對于大的集合就太浪費(fèi)了。(來自StackOverFlow的dasblinkenlight’s的答案)

      Why String is Immutable?

      9.父類與子類的構(gòu)造函數(shù)

      這個編譯期錯誤的出現(xiàn)是父類默認(rèn)的構(gòu)造方法未定義,在java中,如果一個類沒有定義構(gòu)造方法,編譯器會默認(rèn)的為這個類添加一個無參的構(gòu)造方法。如果在父類中定義了構(gòu)造方法,在這個例子中是Super(String s),編譯器就不會添加默認(rèn)的無參構(gòu)造方法,這就是上面這個父類的情形。
      子類的構(gòu)造器,不管是無參還有有參,都會調(diào)用父類的無參構(gòu)造器。因?yàn)榫幾g器試圖在子類的兩個構(gòu)造方法中添加super()方法。但是父類默認(rèn)的構(gòu)造方法未定義,編譯器就會報(bào)出這個錯誤信息。
      想要修復(fù)這個問題,可以簡單的通過1)在父類中添加一個Super()構(gòu)造方法,像下面這樣:

      1
      2
      3
      public Super(){
          System.out.println('Super');
      }

      或者2)移除父類自定義的構(gòu)造方法,或者3)在子類的構(gòu)造方法中調(diào)用父類的super(value)方法。

      Constructor of Super and Stub

      10.”'還是構(gòu)造器

      有兩種方式可以創(chuàng)建字符串

      1
      2
      3
      4
      //1.使用字符串
      String x = 'abc';
      //2.使用構(gòu)造器
      String y = new String('abc');

      有什么區(qū)別?
      下面的例子會給出一個快速的答案:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      String a = 'abc';
      String b = 'abc';
      System.out.println(a==b);//true
      System.out.println(a.equals(b));//true
      String c = new String('abc');
      String d = new String('abc');
      System.out.println(c==d);//false
      System.out.println(c.equals(d));//true

      關(guān)于它們內(nèi)存分配的更多信息,請參考Create Java String Using ” ” or Constructor?.

      將來的工作

      這個列表是我基于大量的github上的開源項(xiàng)目,Stack overflow上的問題,還有一些流行的google搜索的分析。沒有明顯示的評估證明它們是前10,但它們絕對是很常見的。如果您不同意任一部分,請留下您的評論。如果您能提出其它一些常見的錯誤,我將會非常感激。

      原文鏈接: programcreek 翻譯: ImportNew.com - 林林
      譯文鏈接: http://www./12074.html
      [ 轉(zhuǎn)載請保留原文出處、譯者和譯文鏈接。]

      關(guān)于作者: 林林

      (新浪微博:@sayn0

      查看林林的更多文章 >>

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多