Java开发者易犯错误Top10 你的名字 2022-08-07 01:35 1748阅读 0赞 allowtransparency="true" frameborder="0" scrolling="no" src="http://hits.sinajs.cn/A1/weiboshare.html?url=http%3A%2F%2Fwww.csdn.net%2Farticle%2F2015-02-13%2F2823958&type=3&count=&appkey=&title=%E5%9C%A8Java%E4%B8%AD%EF%BC%8C%E6%9C%89%E4%BA%9B%E4%BA%8B%E7%89%A9%E5%A6%82%E6%9E%9C%E4%B8%8D%E4%BA%86%E8%A7%A3%E7%9A%84%E8%AF%9D%EF%BC%8C%E5%BE%88%E5%AE%B9%E6%98%93%E5%B0%B1%E4%BC%9A%E7%94%A8%E9%94%99%EF%BC%8C%E5%A6%82%E6%95%B0%E7%BB%84%E8%BD%AC%E6%8D%A2%E4%B8%BA%E6%95%B0%E7%BB%84%E5%88%97%E8%A1%A8%E3%80%81%E5%85%83%E7%B4%A0%E5%88%A0%E9%99%A4%E3%80%81Hashtable%E5%92%8CHashMap%E3%80%81ArrayList%E5%92%8CLinkedList%E3%80%81Super%E5%92%8CSub%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0%E7%AD%89%EF%BC%8C%E5%A6%82%E6%9E%9C%E8%BF%99%E4%BA%9B%E5%AF%B9%E4%BD%A0%E6%9D%A5%E8%AF%B4%E6%98%AF%E9%99%8C%E7%94%9F%E7%9A%84%EF%BC%8C%E4%BD%A0%E5%8F%AF%E4%BB%A5%E5%9C%A8%E6%9C%AC%E6%96%87%E4%B8%AD%E4%BA%86%E8%A7%A3%E5%AE%83%E4%BB%AC%E3%80%82&pic=&ralateUid=&language=zh\_cn&rnd=1423831685679" width="22" height="16"> **摘要:**在Java中,有些事物如果不了解的话,很容易就会用错,如数组转换为数组列表、元素删除、Hashtable和HashMap、ArrayList和LinkedList、Super和Sub构造函数等,如果这些对你来说是陌生的,你可以在本文中了解它们。 本文总结了Java开发者经常会犯的前十种错误列表。 ![54dd917d1b5aa.jpg][] **Top1. 数组转换为数组列表** 将数组转换为数组列表,开发者经常会这样做: **\[java\]** [view plain][] [copy][view plain] 1. List<String> list = Arrays.asList(arr); Arrays.asList()将返回一个数组内部是私有静态类的ArrayList,这不是java.util.ArrayList类,java.util.Arrays.ArrayList类有set()、 get()、 contains()方法,但是没有任何加元素的方法,因此它的大小是固定的。你应该这么做来创建一个真正的数组: **\[java\]** [view plain][] [copy][view plain] 1. ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arr)); ArrayList的构造函数能够接受一个集合类型,这也是java.util.Arrays.ArrayList的超级类型。 **Top2. 检查一个数组包含一个值** 开发者经常这么做: **\[java\]** [view plain][] [copy][view plain] 1. Set<String> set = new HashSet<String>(Arrays.asList(arr)); 2. return set.contains(targetValue); 代码可以工作,但是没有必要首先转换列表到Set,转换一个列表到一个Set需要额外的时间。因此你可以把它简化为: **\[java\]** [view plain][] [copy][view plain] 1. Arrays.asList(arr).contains(targetValue); 或 **\[java\]** [view plain][] [copy][view plain] 1. for(String s: arr)\{ 2. if(s.equals(targetValue)) 3. returntrue; 4. \} 5. returnfalse; 第一个比第二个更具可读性 **Top3. 在一个循环中从一个列表里删除一个元素** 考虑下面删除元素的代码在迭代中的结果: **\[java\]** [view plain][] [copy][view plain] 1. ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d")); 2. for (int i = 0; i < list.size(); i++) \{ 3. list.remove(i); 4. \} 5. System.out.println(list); 输出是: **\[java\]** [view plain][] [copy][view plain] 1. \[b, d\] 该方法有一个严重的问题,当一个元素被删除时,列表收缩的大小以及指针改变了。所以想要在循环内利用指针删除多个元素是无法正常进行的。 这种情况下使用迭代器才是正确的方法,foreach循环在Java中的工作像是一个迭代器,但实际上并不是,考虑下面的代码: **\[java\]** [view plain][] [copy][view plain] 1. ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d")); 2. 3. for (String s : list) \{ 4. if (s.equals("a")) 5. list.remove(s); 6. \} 它会报出[ConcurrentModificationException][]异常。 相反下面这个就可以正常工作。 **\[java\]** [view plain][] [copy][view plain] 1. ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d")); 2. Iterator<String> iter = list.iterator(); 3. while (iter.hasNext()) \{ 4. String s = iter.next(); 5. 6. if (s.equals("a")) \{ 7. iter.remove(); 8. \} 9. \} .next()必须在.remove()之前被调用。在foreach循环中,编译器将在删除元素操作之后调用.next(),这也是导致ConcurrentModificationException异常的原因,你可以[点击此处][Link 1]查看ArrayList.iterator()的源代码。 **Top4. Hashtable vs HashMap** 根据算法的常规,Hashtable是对数据结构的称呼。但是在Java中,数据结构的名称是HashMap。Hashtable和HashMap关键不同之一是Hashtable是同步的。 关于这一点可查看以下两个链接: [HashMap vs. TreeMap vs. Hashtable vs. LinkedHashMap][] [Map问题Top10][Map_Top10] **Top5. 使用集合的原始类型** 在Java中,原始类型和无限制的通配符类型很容易被混淆。以Set为例,Set是原始类型,而Set(?)则是无限制的通配符类型。 考虑下面的代码,以一个原始类型List作为参数: **\[java\]** [view plain][] [copy][view plain] 1. publicstaticvoid add(List list, Object o)\{ 2. list.add(o); 3. \} 4. publicstaticvoid main(String\[\] args)\{ 5. List<String> list = new ArrayList<String>(); 6. add(list, 10); 7. String s = list.get(0); 8. \} 该代码会抛出一个异常: **\[java\]** [view plain][] [copy][view plain] 1. Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String 2. at ... 使用原始类型集合是危险的,因为原始类型集合跳过了泛型类型检查,也不安全。Set、Set<?>和Set<Object>之间有很大的不同。详细可查看 [Raw type vs. Unbounded wildcard][]和[Type Erasure][]。 **Top6. 访问级别** 开发者经常对类域使用public,这很容易通过直接引用获得域值,但这是一个非常糟糕的设计。根据经验来说是给予成员的访问级别越低越好。 详细情况可点击查看Java中成员访问级别:[public、protected、private][public_protected_private] **Top7.ArrayList VS LinkedList** 如果你不知道ArrayList和LinkedList之间的区别时,你可能会经常的选用ArrayList,因为它看起来看熟悉。然而它们之间有巨大的性能不同。简单的来说,如果有大量的添加/删除操作,并且没有很多的随机存取操作时,LinkedList应该是你的首选。如果您对此不是很了解的话,[点此此处][Link 2]查看更多关于它们性能的信息。 **Top8. Mutable VS Immutable** Immutable对象有很多优势,比如简单、安全等等。但它要求每一个不同的值都需要有一个不同的对象,而太多的对象可能会导致垃圾收集的高成本。所以对Mutable和Immutable的选择应该有一个平衡点。 一般来说,Mutable对象用于避免产生过多的中间对象,经典的例子是连接大量的字符串数。如果你使用Immutable字符串,那么会产生很多符合垃圾收集条件的对象。这对CPU是浪费时间和精力的,当其可以使用Mutable对象作为正确的解决方案。(如StringBuilder) **\[java\]** [view plain][] [copy][view plain] 1. String result=""; 2. for(String s: arr)\{ 3. result = result + s; 4. \} 这里还有一些其他Mutable对象可取的情况。例如mutable对象传递到方法中允许你在不跳过太多语法的情况下收集多个结果。另一个例子是排序和过滤,你可以构建一个带有原有集合的方法,并返回一个已排序的,不过这对大的集合来说会造成更大的浪费。 推荐阅读:[为什么字符串是Immutable?][Immutable] **Top9. Super和Sub构造函数** **![54dd937bd39d5.jpg][]** 这个编译错误是因为默认的Super构造函数是未定义的。在Java中,如果一个类没有定义一个构造函数,编译器会默认的为类插入一个无参数构造函数。如果一个构造函数是在Super类中定义的,这种情况下Super(String s),编译器不会插入默认的无参数构造函数。 另一方面,Sub类的构造函数,无论带不带有参数,都会调用无参数的Super构造函数。 编译器在Sub类中试图将Super()插入到两个构造函数中,但是Super默认的构造函数是没有定义的,编译器才会报错。如何解决这一问题?你只需在Super类中添加一个Super()构造函数,如下所示: **\[java\]** [view plain][] [copy][view plain] 1. public Super()\{ 2. System.out.println("Super"); 3. \} 或移除自定义的Super构造函数,又或者在Sub函数中添加super(value)。 这方面想了解更多的可以[点击此处][Link 3]查看。 **Top10. ""或构造函数?** 字符串可以通过两种方式创建: **\[java\]** [view plain][] [copy][view plain] 1. //1. use double quotes 2. String x = "abc"; 3. //2. use constructor 4. String y = new String("abc"); 它们之间有何不同?下面的例子可以给出答案: **\[java\]** [view plain][] [copy][view plain] 1. String a = "abcd"; 2. String b = "abcd"; 3. System.out.println(a == b); // True 4. System.out.println(a.equals(b)); // True 5. 6. String c = new String("abcd"); 7. String d = new String("abcd"); 8. System.out.println(c == d); // False 9. System.out.println(c.equals(d)); // True 关于它们如何在内存中分布的更多细节可以查看《[使用""或构造函数创建Java字符串][Java]》。 **推荐阅读:** [Constructors of Sub and Super Classes in Java?][Link 3] [How Developers Sort in Java?][How Developers Sort in Java] [How to Convert Array to ArrayList in Java?][How to Convert Array to ArrayList in Java] [Java Type Erasure Mechanism][Type Erasure] **原文来自:[programcreek][]** [54dd917d1b5aa.jpg]: http://img.ptcms.csdn.net/article/201502/13/54dd917d1b5aa.jpg [view plain]: http://www.csdn.net/article/2015-02-13/2823958# [ConcurrentModificationException]: http://www.programcreek.com/2014/01/java-util-concurrentmodificationexception/ [Link 1]: http://www.programcreek.com/2014/01/deep-understanding-of-arraylist-iterator/ [HashMap vs. TreeMap vs. Hashtable vs. LinkedHashMap]: http://www.programcreek.com/2013/03/hashmap-vs-treemap-vs-hashtable-vs-linkedhashmap/ [Map_Top10]: http://www.programcreek.com/2013/09/top-9-questions-for-java-map/ [Raw type vs. Unbounded wildcard]: http://www.programcreek.com/2013/12/raw-type-set-vs-unbounded-wildcard-set/ [Type Erasure]: http://www.programcreek.com/2011/12/java-type-erasure-mechanism-example/ [public_protected_private]: http://www.programcreek.com/2011/11/java-access-level-public-protected-private/ [Link 2]: http://www.programcreek.com/2013/03/arraylist-vs-linkedlist-vs-vector/ [Immutable]: http://www.programcreek.com/2013/04/why-string-is-immutable-in-java/ [54dd937bd39d5.jpg]: http://img.ptcms.csdn.net/article/201502/13/54dd937bd39d5.jpg [Link 3]: http://www.programcreek.com/2013/04/what-are-the-frequently-asked-questions-about-constructors-in-java/ [Java]: http://www.programcreek.com/2014/03/create-java-string-by-double-quotes-vs-by-constructor/ [How Developers Sort in Java]: http://www.programcreek.com/2014/03/how-developers-sort-in-java/ [How to Convert Array to ArrayList in Java]: http://www.programcreek.com/2013/04/how-to-convert-array-to-arraylist-in-java/ [programcreek]: http://www.programcreek.com/2014/05/top-10-mistakes-java-developers-make/
相关 初级Java开发者常犯的内存管理错误 作为初级Java开发者,经常会遇到一些关于内存管理的常见错误。以下是一些常见的例子: 1. **不释放对象**:忘记调用对象的`finalize()`方法或使用`try... 清疚/ 2024年09月16日 06:03/ 0 赞/ 10 阅读
相关 初级开发者常犯的10个Java语法错误 作为一名初级开发者,常常会因为对Java语法理解不够深入而犯错误。以下是一些常见的Java语法错误: 1. **括号不匹配**:这是最常见的错误之一,比如忘记关闭一个大括号或 一时失言乱红尘/ 2024年09月15日 13:42/ 0 赞/ 15 阅读
相关 初级开发者易犯错误:Java循环控制不当问题 作为初级开发者,经常会遇到Java中循环控制不当的问题。这些问题可能会导致代码执行效率低下、无限循环等问题。下面列举一些常见的循环控制不当问题: 1. 循环条件设置错误: 比眉伴天荒/ 2024年09月10日 02:09/ 0 赞/ 8 阅读
相关 Java初学易犯错误 Java初学易犯错误 1)找不到文件 ①源文件名称拼写错误或不存在 ②当前路径错误 2)主类名和文件名不一致 解决方法:声明为public的主类应与文件名一 淩亂°似流年/ 2024年04月01日 19:04/ 0 赞/ 42 阅读
相关 Java 开发人员常犯的 10 大错误 Java 开发人员常犯的 10 大错误 本文译自:[Top 10 Mistakes Java Developers Make][] 此列表总结了 Java 开发人员经常 野性酷女/ 2024年03月27日 09:01/ 0 赞/ 45 阅读
相关 iOS开发过程中易犯的小错误 addGestureRecognizer(\_:) 一个手势对象只绑定一个view // 只有最后一个imgv有点击事件 let tap = UI 喜欢ヅ旅行/ 2022年10月03日 00:34/ 0 赞/ 146 阅读
相关 Java开发者易犯错误Top10 allowtransparency="true" frameborder="0" scrolling="no" src="http://hits.sinajs.cn/A1/we 你的名字/ 2022年08月07日 01:35/ 0 赞/ 1749 阅读
相关 Java开发者易犯错误Top10 【转】本文总结了Java开发者经常会犯的前十种错误列表。 Top1. 数组转换为数组列表 将数组转换为数组列表,开发者经常会这样做: > \[java\] > L 怼烎@/ 2022年06月06日 03:59/ 0 赞/ 160 阅读
相关 python 易犯错误之input() print('what is your name') spam=input() if spam==1: print('Hello') elif sp 我会带着你远行/ 2022年05月21日 12:48/ 0 赞/ 159 阅读
还没有评论,来说两句吧...