总结Java开发者工作中经常会犯的前五种错误

总结Java开发者工作中经常会犯的前五种错误

编码文章call10242025-08-31 20:16:1811A+A-

下面总结工作中,常见的几种编写错误和不当的地方,稍加注意,写出更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(); 
 } 
} 

避免工作中的一些错误,少犯错误,不挖坑,走上正确的道路。


点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4