找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

[ JAVA开发技术 ] 【守望者 j2se】java程序员常犯的10个错误

2014-10-11 20:17| 发布者: zhouy | 查看: 1206 | 收藏

摘要: 本文对java开发常犯的错误做了一个总结,希望帮助大家更好的学习java.1. 把Array转化成ArrayList把Array转化成ArrayList,程序员经常用以下方法: ListString list = Arrays.asList(arr); Arrays.asList()实际上返回一 ...

本文对java开发常犯的错误做了一个总结,希望帮助大家更好的学习java.

1. 把Array转化成ArrayList

把Array转化成ArrayList,程序员经常用以下方法: List<String> list = Arrays.asList(arr); Arrays.asList()
实际上返回一个ArrayList,但是这个ArrayList是Arrays的一个内部私有类,而不是java.util.ArrayList类。这个私有类java.util.Arrays.ArrayList有set(), get(), contains()方法,但是不能够添加新的元素。它的大小是固定的。如果你想要一个java.util.ArrayList,正确的方法是:
ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arr));java.util.ArrayList的构造函数可以接受一个集合类型。java.util.Arrays.ArrayList也继承了集合类型,所以可以作用参数使用。 


2.检查数组是否包含一个值

开发人员经常做的是:
Set<String> set = new HashSet<String>(Arrays.asList(arr)); 
return set.contains(targetValue); 
这个代码是工作的,但没有没有效率。把列表转换成set没有必要,需要额外的时间。正确的方法是:Arrays.asList(arr).contains(targetValue); 或者,一个简单的loop:
for(String s: arr){   
     if(s.equals(targetValue))       
         return true;}
return false;第一种比第二种更具有可读性。


3. 在循环中删除一个列表元素

考虑下面的代码,迭代过程中删除元素:ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));
for (int i = 0; i < list.size(); i++) {   
     list.remove(i);}System.out.println(list); 
这段代码的输出是:[b,d].这个方法有一个严重的问题。当元素被移除,该列表的大小缩减,元素索引也随之发生了变化。所以,如果你想通过使用索引来删除一个循环内的多个元素,就会导致错误的结果。你可能猜到可以使用iterator来删除循环中的元素。在Java中的foreach循环的工作原理就像一个iterator。 但是在这里也会发生错误。请看下面的代码:
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d")); for (String s : list) {  
    if (s.equals("a"))                
list.remove(s);

上面的foreach loop代码会抛出一个异常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();       
}}
通过分析ArrayList.iterator()的原代码,我们可以发现next()方法必须要在remove()方法前被调用。在foreach loop中,编译器产生的代码会先调用next()方法,从而产生异常ConcurrentModificationException。


4. Hashtable 与 HashMap

按照算法惯例,Hashtable是数据结构的名称。但在Java中,数据结构的名称是HashMap。Hashtable是同步的版本。所以很多时候你并不需要Hashtable,而是HashMap.


5.使用原始类型Collection

在Java中,原始类型和无界通配符类型很容易混在一起。以Set为例,Set是原始类型,而Set<?>是无界通配符类型。考虑下面的代码,它使用原始类型的List作为参数:
public static void add(List list, Object o){     
   list.add(o);
}
public static void main(String[] args){      
  List<String> list = new ArrayList<String>();      
  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 ...使用原始类型的Collection是危险的,因为原始类型的Collection跳过类型检查。另外值得一提的是Set, Set<?>, Set<Object>之间存在着巨大的差异。
  

6. 访问级别

很多时候,开发者使用public修饰字段。这样做的好处是很容易通过直接引用来获取字段的值,但是这是一个非常糟糕的设计。经验法则是“给成员的访问级别尽可能低".


7.ArrayList 与 LinkedList

当开发人员不知道ArrayList和LinkedList的区别的时候,他们经常使用的是ArrayList,可能因为它看起来面熟。但是ArrayList和LinkedList之间有巨大的性能差异。 简单来说如果有大量的添加/删除操作,而没有很多随机存取操作,LinkedList的应该是首选。


8.可变性与不变性

不可变对象有很多优点,如简单性,安全性等。但是它需要为每个不同的值创造一个单独的对象,对象太多可能会导致垃圾回收的成本高。所以可变和不可变之间进行选择时应该有一个平衡。 一般情况下,使用可变对象,以避免产生过多的中间对象。一个经典的例子是串联了大量的字符串。如果使用的是不可变的字符串String,会产生很多可以垃圾回收的对象。这样既浪费时间也浪费CPU的运算能力,使用可变对象是正确的解决方案(如
StringBuilder)。
String result="";for(String s: arr){       
   result = result + s;
}
另外一些情况,可变对象刚更加合适可取。例如排序(Collections.sort())。如果Collection是不可变的,排序方法每次将会返回一个新的Collection,这样会极其浪费资源。


9. 父类和子类的构造函数
  
以上这段代码出现编译错误,因为默认的父类构造函数未定义。在Java中,如果一个类没有定义构造函数,编译器会默认插入一个默认的无参数构造函数。如果程序员定义构造函数,编译器将不插入默认的无参数构造函数。上面的代码由于自定义了有参数的构造函数,编译器不再插入无参数的构造函数。子类的构造函数,无论是有参数或无参数,都将调用父类无参构造函数。当子类需要父类的无参数构造函数的时候,就发生了错误。 解决这个问题,可以1)增加一个父类构造函数
public Super(){  
  System.out.println("Super");
2)删除自定义的父类构造函数.  3)添加super(value)到子类构造函数。


10. "" 与 Constructor?

字符串可以通过两种方式创建:
//1. use double quotes
String x = "abc";//
2. use constructor
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 

推荐阅读

【守望者  j2se】ConcurrentHashMap原理分析
【守望者 j2se】ConcurrentHashMap原
集合是编程中最常用的数据结构。而谈到并发,几乎总是离不开集合这类高级数据
【守望者  j2se】双向链表模拟
【守望者 j2se】双向链表模拟
我们熟悉了java单向链表的模拟,现在我就必须开始双向链表的模拟的.1.基础结构
【守望者 高并发】现有高并发WEB服务器 lighttpd Apache Nginx比较
【守望者 高并发】现有高并发WEB服务器
lighttpd网络服务器基于的Lighttpd的网络服务器具有这样的特点:占用内存资源
【守望者 高并发】C10K/C500K与I/O框架
【守望者 高并发】C10K/C500K与I/O框架
C10K、C/500K问题C10K 的意思是10000并发请求,C500K意思是500 000并发请求,
【守望者  j2se】虚拟机各部分内存溢出情况
【守望者 j2se】虚拟机各部分内存溢出
通过简单的小例子程序,演示java虚拟机各部分内存溢出情况:(1).java堆溢出:
【守望者  JMM】理解volatile内存语义
【守望者 JMM】理解volatile内存语义
理解volatile变量对写多线程程序还是很有帮助的,这样就会避免一上来就是syn这
【守望者 高并发】使用CAS实现高效并发处理
【守望者 高并发】使用CAS实现高效并发
守望者:在并发处理应用中,一般使用锁的方式来解决竞争问题,但锁的效率比较
【守望者  j2se】吃透 java I/O 工作机制-1
【守望者 j2se】吃透 java I/O 工作机
I/O 问题可以说是当今互联网 Web 应用中所面临的主要问题之一,因为当前在这
【守望者 大数据】Mahout学习路线图
【守望者 大数据】Mahout学习路线图
Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, Z
【守望者 j2se】ConcurrentMap之putIfAbsent(key,value)用法讨论
【守望者 j2se】ConcurrentMap之putIfA
先看一段代码:public class Locale { private final static MapString, Lo
【守望者  javascript】判断IE浏览器世界上最短的代码
【守望者 javascript】判断IE浏览器世
最短的IE判定var ie=!-分析以前最短的IE判定借助于IE不支持垂直制表符的特性
【守望者 大数据】机器学习已成为大数据的基石
【守望者 大数据】机器学习已成为大数
机器学习(Machine Learning, ML)是一门多领域交叉学科,涉及概率论、统计学、
【守望者  j2se】多线程与并发知识点总结
【守望者 j2se】多线程与并发知识点总
对于多线程和并发编程这个比较大的技术模块,我们会整理一些帖子方便知识点的
【守望者  j2se】二叉树模拟
【守望者 j2se】二叉树模拟
接着我们就要写一个比较复杂的数据结构的,但是这个数据结构是很重要的,假如
【守望者 SRS  】SRS 源代码分析笔记(0.9.194)-分析服务器对端口的监听 ...
【守望者 SRS 】SRS 源代码分析笔记(
第一部分 分析服务器对端口的监听 端口监听与初始化(一)全局变量_srs_confi

行业聚焦  面试交流  职位推荐  开发视频   技术交流  腾讯微博  新浪微博

友情链接:课课家教育  阿里云  鲜果  W3Cfuns前端网  中国企业家  环球企业家  投资界  传媒梦工场  MSN中文网  Android开发者社区  cnbeta  投资中国网  又拍云存储  美通说传播  IT茶馆  网商在线  商业评论网  TechOrange  IT时代周刊  3W创新传媒  开源中国社区  二维工坊  Iconfans  推酷  智能电视网  FreeBuf黑客与极客  财经网  DoNews  凤凰财经  新财富  eoe移动开发者社区  i黑马  网易科技  新浪科技  搜狐IT  创业家  创业邦  腾讯财经  福布斯中文网  天下网商  TechWeb  雷锋网  新浪创业  和讯科技  品途O2O  极客公园  艾瑞网  抽屉新热榜  卖家网  人民网通信频道  拉勾网  创新派  简单云主机  

手机版|黑名单|守望者在线 在线教育 linux 高级程序设计 C/C++ 大数据 ( 蜀ICP备14029946号

成都守望者科技有限公司 © 2013-2016 All Rights Reserved