重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

Java的注意事项有什么

本篇文章为大家展示了Java的注意事项有什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

为建湖等地区用户提供了全套网页设计制作服务,及建湖网站建设行业解决方案。主营业务为成都网站设计、网站建设、建湖网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!

1、 不要在 foreach 循环里进行元素的 remove/add 操作,可以在fori中进行remove/add。remove 元素请使用 Iterator 方式,如果并发操作,需要对 Iterator 对象加锁。【参考:https://my.oschina.net/u/3955185/blog/4496726】

//正例一:
List list = 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的注意事项有什么,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注创新互联行业资讯频道。


当前名称:Java的注意事项有什么
网站路径:http://cqcxhl.cn/article/gogcjo.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP