本篇文章为大家展示了Java的注意事项有什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
为建湖等地区用户提供了全套网页设计制作服务,及建湖网站建设行业解决方案。主营业务为成都网站设计、网站建设、建湖网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
1、 不要在 foreach 循环里进行元素的 remove/add 操作,可以在fori中进行remove/add。remove 元素请使用 Iterator 方式,如果并发操作,需要对 Iterator 对象加锁。【参考:https://my.oschina.net/u/3955185/blog/4496726】
//正例一: Listlist = new ArrayList<>(); list.add("1"); list.add("2"); Iterator iterator = list.iterator(); while (iterator.hasNext()) { String item = iterator.next(); if (删除元素的条件) { iterator.remove(); } } //正例二: for (int i=0;i < list.size();i++) { if (list.get(i)==2) { list.remove(i); } } //反例: for (String item : list) { if ("2".equals(item)) { list.remove(item); } }
原因:由于foreach底层是用iterator进行遍历,源代码如下:
public E next() { checkForComodification(); int i = cursor; if (i >= size) throw new NoSuchElementException(); Object[] elementData = ArrayList.this.elementData; if (i >= elementData.length) throw new ConcurrentModificationException(); cursor = i + 1; return (E) elementData[lastRet = i]; }
其中checkForComodification()
具体实现为:
final void checkForComodification() { if (modCount != expectedModCount){ throw new ConcurrentModificationException(); } }
从源代码可以看出,当modCount != expectedModCount
会抛异常,使用list的remove()操作之后,modCount
会加1,但是expectedModCount
不会加1,即两值不等,会抛异常。 使用Iterator的remove()会更改expectedModCount
的值,故需使用此方式进行remove/add。
public void remove() { if (lastRet < 0){ throw new IllegalStateException(); } checkForComodification(); try { ArrayList.this.remove(lastRet); cursor = lastRet; lastRet = -1; expectedModCount = modCount; } catch (IndexOutOfBoundsException ex) { throw new ConcurrentModificationException(); } }
如果使用fori进行remove/add,不会走checkForComodification()
方法,所以也可以使用fori进行操作,如正例2。
2、Integer比较的时候,使用equals,否则当比较的数据不在-128-127之间,比较的不是值,而是对象的引用,比较结果不是预期值。
上述内容就是Java的注意事项有什么,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注创新互联行业资讯频道。