文档章节

java软件开发人中经常误解区

梦洛
 梦洛
发布于 2014/06/04 22:33
字数 450
阅读 204
收藏 13
  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
博文 42
码字总数 40146
作品 0
杭州
技术主管
私信 提问
即将改变软件开发的5个Java 9新特性

预计发布的Java 9中,最令人兴奋的特性是什么? 有关Java9的消息最近显得有些沉寂,不要被它迷惑了。JDK开发者正在努力朝着下一个版本迈进,计划2015年12月前完成所有功能开发。之后,它会经...

oschina
2015/07/22
14.7K
59
My java——JVM(内存域)三

续 My java——JVM(内存)二 写了一点JVM内存的一些操作的方法,和引出内存的分类。 是呀,java内存是我们在java编程中很少考虑到的,也没用真正的管理过。也许都知道JVM有自己的垃圾回收机...

tngou
2013/03/18
0
0
java JVM的内存区域(运行时数据区域)

JVM的内存形式: (1)方法区:存放了要加载的类的信息(名称,修饰符等)、类中的静态变量、类中定义为final的变量、类中Field信息、类中的方法信息,当开发人员通过Class对象的getName、i...

LCZ777
2014/11/25
0
0
JVM内存结构 VS Java内存模型 VS Java对象模型

Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模型和...

Java架构
2018/07/11
0
0
JVM内存管理:深入Java内存区域与OOM

Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来。 概述: 对于从事C、C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高...

underA
2013/10/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

给windows server中的“未识别的网络”或“无法识别的网络”设置网络位置类型

在windows server中,如果网络没有被正确的识别,那么就需要手工设置一下网络位置类型。 将“公用网络”指定设置为“专用网络“ 【控制面板】--【系统和安全】--【管理工具】--【本地安全策略...

gugudu
今天
1
0
阿里强制要求的21条Java开发规范,可以避免很多坑

1. 【强制】避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成本,直接用类名来访问即可。 2. 【强制】所有的覆写方法,必须加@Override注解。 说明:getObject...

天王盖地虎626
今天
8
0
oracle dg 备库未设置convert参数导致ORA-01111,ORA-01110

查看trace 文件: MRP0: Background Managed Standby Recovery process started (amls) started logmerger process Sun Jan 20 07:55:53 2019 Managed Standby Recovery starting Real Time ......

hnairdb
今天
2
0
乱入Linux界的我是如何学习的

欢迎来到建哥学Linux,咳!咳!咳!开个玩笑哈,我是一个IT男,IT界的入门选手,正在学习Linux。 在之前,一直想进军IT界,学习IT技术,但是苦于没有人指导,也不知道学什么,最开始我自己在...

linux-tao
今天
3
0
乱入Linux界的我是如何学习的

欢迎来到建哥学Linux,咳!咳!咳!开个玩笑哈,我是一个IT男,IT界的入门选手,正在学习Linux。 在之前,一直想进军IT界,学习IT技术,但是苦于没有人指导,也不知道学什么,最开始我自己在...

linuxprobe16
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部