加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 移动互联 > 正文

Java开拓常犯的10个错误,打死都不要犯

发布时间:2019-07-11 13:42:08 所属栏目:移动互联 来源:佚名
导读:阅读目次 Array转ArrayList 判定一个数组是否包括某个值 在轮回内部删除List中的一个元素 HashTable与HashMap 行使荟萃原始范例(raw type) 会见级别 ArrayList和LinkedList 可变与不行变 父类和子类的结构要领 照旧结构要领 将来事变 这个列表总结了10个Ja
副问题[/!--empirenews.page--]

Java开拓常犯的10个错误,打死都不要犯

 阅读目次

  • Array转ArrayList
  • 判定一个数组是否包括某个值
  • 在轮回内部删除List中的一个元素
  • HashTable与HashMap
  • 行使荟萃原始范例(raw type)
  • 会见级别
  • ArrayList和LinkedList
  • 可变与不行变
  • 父类和子类的结构要领
  • “”照旧结构要领
  • 将来事变

这个列表总结了10个Java开拓职员最常犯的错误。

1、Array转ArrayList

当必要把Array转成ArrayList的时辰,开拓职员常常这样做:

  1. List list = Arrays.asList(arr); 

Arrays.asList()会返回一个ArrayList,可是要出格留意,这个ArrayList是Arrays类的静态内部类,并不是java.util.ArrayList类。

java.util.Arrays.ArrayList类实现了set(), get(),contains()要领,可是并没有实现增进元素的要领(究竟上是可以挪用add要领,可是没有详细实现,仅仅抛出UnsupportedOperationException非常),因此它的巨细也是牢靠稳固的。为了建设一个真正的java.util.ArrayList,你应该这样做:

  1. ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arr)); 

ArrayList的结构要领可以吸取一个Collection范例,而java.util.Arrays.ArrayList已经实现了该接口。

2、判定一个数组是否包括某个值

开拓职员常常这样做:

  1. Set<String> set = new HashSet<String>(Arrays.asList(arr)); 
  2. return set.contains(targetValue); 

以上代码可以正常事变,可是没有须要将其转换成set荟萃,将一个List转成Set必要特另外时刻,着实我们可以简朴的行使如下要领即可:

  1. Arrays.asList(arr).contains(targetValue); 

可能

  1. for(String s: arr){ 
  2.  if(s.equals(targetValue)) 
  3.  returntrue; 
  4. returnfalse; 

第一种要领可读性更强。

3、在轮回内部删除List中的一个元素

思量如下代码,在迭代时代删除元素:

Java开拓最常犯的10个错误,打死都不要犯

功效打印:[b, d]

在上面这个要领中有一系列的题目,当一个元素被删除的时辰,list巨细减小,然后原先索引指向了其余元素。以是假如你想在轮回里通过索引来删除多个元素,将不会正确事变。

你大概知道行使迭代器是在轮回里删除元素的正确方法,或者你也知道foreach轮回跟迭代器很相同,但究竟环境却不是这样,如下代码:

Java开拓最常犯的10个错误,打死都不要犯

将抛出ConcurrentModificationException非常。

然而接下来的代码却是OK的:

Java开拓最常犯的10个错误,打死都不要犯

next()要领必要在remove()要领之前被挪用,在foreach轮回里,编译器会在删除元素操纵化挪用next要领,这导致了ConcurrentModificationException非常。更多具体信息,可以查察ArrayList.iterator()的源码。

4、HashTable与HashMap

从算法的角度来讲,HashTable是一种数据布局名称。可是在Java中,这种数据布局叫做HashMap。

HashTable与HashMap的一个首要的区别是HashTable是同步的,以是,凡是来说,你会行使HashMap,而不是Hashtable。保举:HashMap 和 Hashtable 的 6 个区别!

5、行使荟萃原始范例(raw type)

在Java中,原始范例(raw type)和无界通配符范例很轻易让人夹杂。举个Set的例子,Set是原始范例,而Set是无界通配符范例。

请看如下代码,add要领行使了一个原始范例的List作为入参:

Java开拓最常犯的10个错误,打死都不要犯

运行以上代码将会抛出非常:

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String at ...

行使原始范例荟萃很是伤害,由于它跳过了泛型范例搜查,是不安详的。其它,Set, Set, 和Set这三个有很大的差异。

6、会见级别

开拓职员常常行使public修饰类字段,固然这很轻易让别人直接通过引用获取该字段的值,但这是一个欠好的计划。按照履历,应该尽也许的低竣工员属性的会见级别。

7、ArrayList和LinkedList

为什么开拓职员常常行使ArrayList和LinkedList,却不知道他们之间的区别,由于它们看起来很像。然而它们之间有着庞大的机能差别。简朴的说,假若有大量的增进删除操纵而且没有许多的随机遇见元素的操纵,应该首选LinkedList。

8、可变与不行变

不行变工具有许多利益,如简朴、安详等。可是对付每个差异的值都必要一个单独的工具,太多的工具会引起大量垃圾接纳,因此在选择可变与不行变的时辰,必要有一个均衡。保举:Java 中的 String 真的是不行变的吗?

凡是,可变工具用于停止发生大量的中间工具,一个经典的例子是大量字符串的拼接。假如你行使一个不行变工具,将会顿时发生大量切合垃圾接纳尺度的工具,这挥霍了CPU大量的时刻和精神。行使可变工具是正确的办理方案(StringBuilder);

Java开拓最常犯的10个错误,打死都不要犯

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读