文档章节

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
博文 39
码字总数 40146
作品 0
杭州
技术主管
JVM内存管理:深入Java内存区域与OOM

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

underA
2013/10/24
0
0
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架构
07/11
0
0
深入了解java运行时的内存区域

对于java程序员来说,并不必显示地对内存进行管理,一切都交给java虚拟机去做吧,而且,你也不一定做得比java虚拟机来得专业。好像所有内存管理都交给虚拟机去做就万事大吉了,但是,事实有时...

依然范特西
2012/09/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Bash重定向详解

Bash重定向详解 Bash的重定向指的是将命令的输入和输出导向不同地方,而不是默认的标准输入、标准输出和标准错误。Bash的重定向实际上是对标准输入、标准输出和标准错误的重置,进而将所需输...

小陶小陶
今天
3
0
EventBus原理深度解析

一、问题描述 在工作中,经常会遇见使用异步的方式来发送事件,或者触发另外一个动作:经常用到的框架是MQ(分布式方式通知)。如果是同一个jvm里面通知的话,就可以使用EventBus。由于Event...

yangjianzhou
今天
14
0
OpenCV图像处理实例:libuv+cvui显示摄像头视频

#include <iostream>#include <opencv2/opencv.hpp>#define CVUI_IMPLEMENTATION#include <cvui.h>extern "C"{#include <uv.h>}using namespace std;#define WINDOW_NAM......

IOTService
今天
3
0
openJDK之JDK9的String

1.openJDK8的String 先来看下openJDK8的String的底层,如下图1.1所示: 图1.1 底层上使用的是char[],即char数组 每个char占16个bit,Character.SIZE的值是16。 2.openJDK9中的String 图2.1...

克虏伯
今天
4
0
UEFI 模式下如何安装 Ubuntu 16.04

作者:知乎用户 链接:https://www.zhihu.com/question/52092661/answer/259583475 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 针对UEFI模式下安装U...

寻知者
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部