java软件开发人中经常误解区
博客专区 > longbadx 的博客 > 博客详情
java软件开发人中经常误解区
longbadx 发表于4年前
java软件开发人中经常误解区
  • 发表于 4年前
  • 阅读 193
  • 收藏 13
  • 点赞 0
  • 评论 0

【腾讯云】如何购买服务器最划算?>>>   

  1. 数组(array)转成集合(ArrayList

    错误:如经常这样处理

           List<String> list = Array.asList(arr);

    Arrays.asList()方法返回的是Arrays里的私有静态内部类ArrayList,不是集合java.util.ArrayList类。这是java.util.Arrays.Arrys.ArrayList类内部只有三个方法 set(),get(),contains(),但没有增加元素方法,因此他大小是不变的。要想创建一个集合ArrayList,这样的如:

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

  2. 检查一个数组包含这个值(check if an Array contains a value)

    开发人员经常这样做:

    Set<String> set = new HashSet<String>(Arrays.asList(arr));

    return set.contains(targetValue);

    代码上多执行了几步,必需先转换成一个集合再给set;

    可以这样写:

    Arrays.asList(arr).contains(targetValue); or  for(String s:arr){if(s.equals(targetValue))return true;}return false;

  3. 在删除一个循环内的集合元素

    考虑下面的代码,迭代过程中删除元素:

       

ArrayList<String> list = new ArrayList<String>(Arrays.asList("a","b","c","d"));
for(int i = 0; i< list.size();i++){
    list.remove(i);
}
System.out.println(list);

输出结果:

[b,d]

在这个方法是严重问题,当集合里一个元素被删除时,集合长度缩小、下标也发生改变。因此如果使用下标删除循环里的元素,这将正确删除元素。

你可能知道,使用iterator实现元素删除,也知道用foreach像iterator一样删除,但实际上不能的,考虑下面代码:

ArrayList<String> list = new ArrayList<String>(Arrays.asList("a","b","c","d"));
for(String s: list)
{
    if(s.equals("a")) list.remove(s);
}

它会抛出ConcurrentModificationException异常

相反就可以:

ArrayList<String> list = new ArrayList<String>(Arrays.asList("a","b","c","d"));
Iterator<String> iter = list.iterator();
while(iter.hasNext())
{
    String s = iter.next();
    if(s.equals("a"))
    {
        iter.remove();
    }
}

.next 必须在调用.remove()方法前。在foreach循环里,先删除元素然后在调用.next下面元素,这个原因引起ConcurrentModificationException异常,你可能想看ArrayList.iterator().源码;


 


共有 人打赏支持
粉丝 6
博文 34
码字总数 34160
×
longbadx
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: