Java程序员容易犯的10个错误
1. Array 转 ArrayList
一般开发者喜欢用:
List<String> list = Arrays.asList(arr);
Arrays.asList() 会返回一个ArrayList,这是Arrays里内嵌的一个私有静态类,而并不是java.util.ArrayList类java.util.Arrays.ArrayList 有set(), get(), contains()方法,但并支持添加元素,所以大小是固定的,想要创建一个真正的ArrayList,你应该:
ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arr));
关于这个方法更多的解释,请参见我之前的一篇文章
2.检测一个Array是否包含一个元素
一般开发者喜欢用:
Set<String> set = new HashSet<String>(Arrays.asList(arr)); return set.contains(targetValue);
这段代码能够工作,但并没有先转将list转为set,list转为set需要额外时间,可以用下面更简单的:
Arrays.asList(arr).contains(targetValue);
或者
for(String s: arr){ if(s.equals(targetValue)) return true; } return false;
第一种方法比第二种的可读性更好。
3. 在一个循环中移除list中的元素
考虑下下面这种方法:
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]
但这种方法有一个严重的问题,当一个元素被移除的时候,list的大小就缩减了,索引也发生了改变。所以如果想要在一个循环中使用索引移除多个元素,这是不可行的。
或许你又想用迭代器的方式解决这个问题,但实际上也不可行,考虑下下面的代码:
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(); } }
4. Hashtable vs HashMap
在算法中,哈希表是数据结构的名称。但在Java中,数据结构的名字是HashMap中。其中一个Hashtable和HashMap的之间的主要区别是,Hashtable是同步的。所以,很多时候,你并不需要哈希表,HashMap就够用了。
5.使用原始类型的集合
在Java中,原始类型和无界通配符类型很容易混在一起。以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 ...
使用原始类型集合是很危险的一件事,因为它跳过了类属性检测并且是不安全的。Set, Set<?>, and Set
6.访问权限
很多开发者使用public修饰类的字段,这样很容易获取字段值,但这是一个糟糕的设计。经验法则是给用户尽可能低的访问权限。
7.ArrayList vs. LinkedList
大部分的开发者并不知道ArrayList和LinkedList 的区别,所以经常使用ArrayList,这个看起来更熟悉。但是,在这两者之间,有一个很大的性能差异。
简单来说,在有很多插入和删除操作时,同时有很少或者几乎没有随机访问的操作情况下,推荐使用LinkedList。其次,再使用ArrayList。
8.Mutable vs. Immutable(可变 VS 不可变)
不可变对象有很多优势这样简单,安全,等等。但它对于每一个不同的变量,需要一个单独的对象。太多的对象可能会导致高成本的垃圾收集。所以在选择可变和不可变的时应该有个权衡。
一般来说,使用可变对象,以避免产生过多的中间对象。一个经典的例子就是连接大量的字符串。如果使用不可变的String,你会产生很多立马要被垃圾收集回收的对象,这很消耗时间和精力。如果使用一个不可变的,类似StringBuffer。
String result=""; for(String s: arr){ result = result + s; }
可变对象还有其他的例子:函数传参的过程中,可以传入可变对象,这样可以得到多个结果。
9.父类和子类的构建
编译出错的原因主要是默认的Super类的构造函数并没有被定义。在Java中,如果一个类没有实现构造函数,编译器默认会给这个类插入一个无参构造函数。如果在父类中已经有了构造函数,那么编译器将不会再插入默认无参构造函数。
子类的构造函数,要么是带参的要么是无参的,都会调用父类的无参构造。因为编译器想在子类中,加入super(),但是父类的无参构造函数并不存在。所以,编译器会报错。
为了解决这个问题,有两种解决办法,第一,在Super类中,加入无参构造:
public Super(){ System.out.println("Super"); }
第二种方式,移除自定义的父类构造函数
第三种方式,子类的构造函数中加入super(value)
10.”" or Constructor?
创建一个String 有两种方式:
//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
Java程序员容易犯的10个错误的更多相关文章
- Java程序员常犯的10个错误
本文总结了Java程序员常犯的10个错误. #1. 把Array转化成ArrayList 把Array转化成ArrayList,程序员经常用以下方法: List<String> lis ...
- Java 程序员容易犯的10个SQL错误
Java程序员编程时需要混合面向对象思维和一般命令式编程的方法,能否完美的将两者结合起来完全得依靠编程人员的水准: 技能(任何人都能容易学会命令式编程) 模式(有些人用“模式-模式”,举个例子,模式可 ...
- Python 程序员经常犯的 10 个错误
关于PythonPython是一种解释性.面向对象并具有动态语义的高级程序语言.它内建了高级的数据结构,结合了动态类型和动态绑定的优点,这使得... 关于Python Python是一种解释性.面向对 ...
- 转载一篇文章 python程序员经常犯的10个错误
一位同事推荐的.翻译的不错. http://www.oschina.net/translate/top-10-mistakes-that-python-programmers-make
- 十个JAVA程序员容易犯的错误
十个JAVA程序员容易犯的错误 1. Array 转 ArrayList 一般开发者喜欢用: List<String> list = Arrays.asList(arr); Arrays. ...
- Java程序员应该掌握的10项技能
这篇文章主要介绍了作为Java程序员应该掌握的10项技能,包括java的知识点与相关的技能,对于java的学习有不错的参考借鉴价值,需要的朋友可以参考下 1.语法:必须比较熟悉,在写代码的时候ID ...
- 作为Java程序员应该掌握的10项技能
本文详细罗列了作为Java程序员应该掌握的10项技能.分享给大家供大家参考.具体如下: 1.语法:必须比较熟悉,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息知道是什么样的语法错误并且知 ...
- Java程序员可能犯的3个常见SQL错误
概述:Java程序员不仅要具备扎实的Java编程能力,在日常的工作当中往往还要涉及到其他语言的基础知识,尤其是SQL.那么哪些常见的SQL错误是程序员们容易犯的呢?让我们一起来看看吧! 你可能看到Ja ...
- Java程序员应该了解的10个面向对象设计原则
面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...
随机推荐
- php 链式操作的实现 学习记录
php 面向对象中实现链式操作的关键部分:调用的方法中返回当前对象 ,从而实现链式操作: <?php namespace commom; class db { public function w ...
- Observer 观察者模式
简介 观察者模式(Observer),有时又被称为[发布]publish-[订阅]Subscribe模式.模型-视图(View)模式.源-收听者(Listener)模式或从属者模式.在此种 ...
- JAVA集合差异
接口 简述 实现 操作特性 成员要求 Set 成员不能重复 HashSet 外部无序地遍历成员 成员可为任意Object子类的对象,但如果覆盖了equals方法,同时注意修改hashCode方法. T ...
- Android-SVN
服务器启动svn服务 svnserve -d -r /home/wbp/svn/actia/ 1 .svn 重新定位location , 改变新仓库的uuid , 今天操作SVN Client 发现 ...
- 【原】push过快的错误 (Pushing the same view controller instance more than once is not supported)
今天在点击按钮push viewController 时,控制台报错: Terminating app due to uncaught exception 'NSInvalidArgumentExce ...
- UIView之常用属性
UIView之常用属性 1. view.tag = 200; // 系统保留0-1002. view.frame = CGRectMake(20, 30, 300, 300);3. view.cent ...
- 【转】lua random()
先来看看这两段代码: ① math.randomseed(os.time())for i=1,10 do n = math.random(10) print(n) 运行结果是: 63210754341 ...
- POJ 1155 树形背包(DP) TELE
题目链接: POJ 1155 TELE 分析: 用dp[i][j]表示在结点i下最j个用户公司的收益, 做为背包处理. dp[cnt][i+j] = max( dp[cnt][i+j ...
- springmvc问题汇总
1. IncompatibleClassChangeError in spring mvc Failed to read candidate component class....... ...
- php 4.X与5.x版本构造函数区别与类的继承
今天看ecshop源码的时候发现 构造函数是和类名一样,以前没接触过,一下子疑惑啦 HP4.x 版本: PHP 4.x 的构造函数名与类名相同. 注意:在子类里父类的构造函数不会自动执行 ...