Java易犯错误(转)

来源:互联网 发布:电信云计算发展措施 编辑:程序博客网 时间:2024/06/04 20:34

 1、将数组转换为数组列表

       错误:List<String> list =Arrays.asList(arr); 

       正确:ArrayList<String> list =new ArrayList<String>(Arrays.asList(arr));

       解释:Arrays.asList()方法返回一个受指定数组支持的固定大小的列表,这不是java.util.ArrayList类,java.util.Arrays.ArrayList类有set()、 get()、 contains()方法,但是没有任何加元素的方法,因此它的大小是固定的。ArrayList的构造函数能够接受一个集合类型,这也是java.util.Arrays.ArrayList的超级类型。

      2、检查一个数组包含一个值

     最好方法:Arrays.asList(arr).contains(targetValue);//首先把数组转换为ArrayList,然后调用contains()方法。

  其次方法:for(String s:arr){

               if(targetValue.equals(s)){

                   return true;

               }

           }

           return false;

  不好方法:HashSet<String> set =new HashSet(Arrays.asList(arr));//首先将数组转换为ArrayList,                                                                 //然后再转换为HashSet

           return set.contains(targetValue);

  解释:最后一种方法代码可以工作,但是没有必要首先转换列表到Set,转换一个列表到一个Set需要额外的时间。

    3、在一个循环中从一个列表里删除一个元素

     错误做法:ArrayList<String> list =new ArrayList<String>(Arrays.asList("a","b","c","d"));

                  for(int i=0;i<list.size();i++){

                         list.remove(i);

                   }

                  解释:这种做法最后的结果是list中还有[b,d],因为当一个元素被删除时,列表收缩大小并且指针改变了,所以想要在循环内利用指针删除多个元素是无法正常进行的。

    错误做法:ArrayList<String> list =new ArrayList<String>(Arrays.asList("a","b","c","d"));

                      for(String s:list){

                             if(s.equals("a")){

                                     list.remove(s);

                              }

                         }

                    这种做法会报ConcurrentModificationException异常。

     正确做法:

  • ArrayList<String> list = new ArrayList<String>(Arrays.asList("a""b""c""d"));  
  • Iterator<String> iter = list.iterator();  
  • while (iter.hasNext()) {  
  •     String s = iter.next();  
  •    
  •     if (s.equals("a")) {  
  •         iter.remove();  
  •     }  

  •        next()必须在.remove()之前被调用。在foreach循环中,编译器将在删除元素操作之后调用.next(),这也是导致ConcurrentModificationException异常的原因。

         4、ArrayList VS LinkedList

             如果你不知道ArrayList和LinkedList之间的区别时,你可能会经常的选用ArrayList,因为它看起来看熟悉。然而它们之间有巨大的性能不同。简单的来说,如果有大量的添加/删除操作,并且没有很多的随机存取操作时,LinkedList应该是你的首选。

  • 0 0