总结Java开发者工作中经常会犯的前五种错误
下面总结工作中,常见的几种编写错误和不当的地方,稍加注意,写出更6的代码。
一,字符串==和equals
经常遇到这样的问题,也是面试的常客,下面例子给你答案。
String a = "abcd"; String b = "abcd"; System.out.println(a == b); // True a和b是字符串常量,在常量池中存在。 System.out.println(a.equals(b)); // True String c = new String("abcd"); String d = new String("abcd"); System.out.println(c == d); // False c和d 是两个不一样的字符串对象,比较的是对象地址 System.out.println(c.equals(d)); // True 比较的是两个内容的值,都是abcd.
二,使用集合的原始类型
在Java中,原始类型和无限制的通配符类型很容易被混淆。以Set为例,Set是原始类型,而Set(?)则是无限制的通配符类型。
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<?>和Set<Object>之间有很大的不同。
所以在使用过程中,泛型中如有确定好类型,最好使用包装类型,Integer,Boolean,Double...等这样的,确定不好,可以使用?统配符来代替。
三,数组转换为数组列表
将数组转换为数组列表,开发者经常会这样做:
List<String> list = Arrays.asList(arr);
Arrays.asList()将返回一个数组内部是私有静态类的ArrayList,这不是java.util.ArrayList类,
java.util.Arrays.ArrayList类有set()、 get()、 contains()方法,但是没有任何加元素的方法,因此它的大小是固定的,使用不当会报错的。你应该这么做来创建一个真正的数组
ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arr));
ArrayList的构造函数能够接受一个集合类型,这也是
java.util.Arrays.ArrayList的超级类型
四,检查一个数组包含一个值
常见操作如下:
Set<String> set = new HashSet<String>(Arrays.asList(arr)); return set.contains(targetValue);
代码可以工作,但是没有必要首先转换列表到Set,转换一个列表到一个Set需要额外的时间。因此你可以把它简化为
Arrays.asList(arr).contains(targetValue);
五,在一个循环中从一个列表里删除一个元素
示范1
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]
该方法有一个严重的问题,当一个元素被删除时,列表收缩的大小以及指针改变了。所以想要在循环内利用指针删除多个元素是无法正常进行的。
这种情况下使用迭代器才是正确的方法,foreach循环在Java中的工作像是一个迭代器,但实际上并不是
示范2:
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(); } }
避免工作中的一些错误,少犯错误,不挖坑,走上正确的道路。