本篇文章为大家展示了Java的注意事项有什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
1、 不要在 foreach 循环里进行元素的 remove/add 操作,可以在fori中进行remove/add。remove 元素请使用 Iterator 方式,如果并发操作,需要对 Iterator 对象加锁。【参考:https://my.oschina.net/u/3955185/blog/4496726】
//正例一: List<String> list = new ArrayList<>(); list.add("1"); list.add("2"); Iterator<String> 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的注意事项有什么,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。