`
kimfly
  • 浏览: 47808 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

关于ArrayList的一点问题

    博客分类:
  • java
阅读更多

    昨天在程序检查时发现的以下的一段程序:

      List list = new ArrayList();
        Map map = new HashMap();
        map.put("id", "1");
        map.put("name", "dd");
        list.add(map);
        map = new HashMap();
        map.put("id", "2");
        map.put("name", "ff");
        list.add(map);

     map = new HashMap()后,会发生什么问题呢?

     因为list增加过map对象,按照传递指针的方法,那么最后的结果大家都知道了,就是最后list中的两个对象都指向了最后的那个map对象,即包含Id为2的那个map。但是结果是如此吗?

     很遗憾,我也被搞混了,结果是正确的,List 包含了两个不同的Map。

    带着疑惑google了一下,没有结果。怎么办? 查看一下jdk的源代码可能会有帮助。

    public boolean add(Object o) {
 ensureCapacity(size + 1);  // Increments modCount!!
 elementData[size++] = o;
 return true;
    }
  谜底就此揭开,原来ArrayList在实现的时候,在内部维护者一个数组,这样每次add以后,都是由它自身的内部数组对象指向那个对象了。所以上面的答案也就正确了。

    虽然用了java很长时间,也以为对常用的比较了解,困惑以后看看jdk源代码看来还是很有帮助的。

分享到:
评论
1 楼 leeight 2006-11-29  
呵呵

相关推荐

    ASP .NET - ArrayList对象

    可以通过调用`TrimToSize()`方法来实现这一点: ```vb mycountries.TrimToSize() ``` 这行代码将确保`ArrayList`只分配足够的内存来存储当前的元素数量。 #### 排序元素 对于需要按照一定顺序显示列表的情况,...

    day09-ArrayList集合&学生管理系统.pdf

    ArrayList的特点是基于数组的数据结构,这使得它在随机访问元素时表现良好,但数组的缺点是容量固定,而ArrayList弥补了这一点,它的容量是动态变化的,能够随着元素的增加而自动扩展。 ### ArrayList类概述 ...

    Java中ArrayList的工作原理详解

    ArrayList 的自动扩容是其最重要的一点。当我们向 ArrayList 中添加元素时,如果当前数组的长度不足以容纳新元素,那么 ArrayList 将扩展其数组的长度,以满足新的存储需求。扩展的规则是将当前数组的长度增加 50%,...

    C#检查指定对象是否存在于ArrayList集合中的方法

    在使用ArrayList.Contains方法时,还有一点需要注意:如果ArrayList中存储的是自定义类型,而这些类型没有重写Equals和GetHashCode,那么默认的相等比较是基于对象的引用,而不是基于对象的值。因此,即使两个对象的...

    今天会是有Offer的一天么:面试时不要再问我ArrayList、LinkedList和CopyOnWriteArrayList的区别了

    今天不看源码(想看源码的同学可以自己在...实现RandomAccess接口表示它可以支持随机访问(强调一点,并不是因为实现了RandomAccess接口,ArrayList才支持随机访问。RandomAccess只是一个标记接口,接口RandomAccess中

    java代码-定义一个员工信息类Employee,使用ArrayList对员工信息进行添加和显示。曾子龙

    例如,我们可以创建一个`displayEmployees`方法来实现这一点: ```java public static void displayEmployees(ArrayList<Employee> employees) { for (Employee e : employees) { System.out.println("ID: " + e....

    C#的动态数组介绍可用

    `TrimToSize` 方法可以帮助实现这一点: ```csharp AL.TrimToSize(); ``` 调用后,`ArrayList` 的 `Capacity` 将被调整为当前的 `Count` 大小。 #### 清空 ArrayList 如果需要清空整个 `ArrayList`,可以使用 `...

    Java定义队列结构,并实现入队、出队操作完整示例

    在队列操作中,需要注意的一点是队列的同步问题。在多线程环境下,需要使用同步机制来避免队列操作的并发问题。此外,队列操作还需要注意队列的容量问题,避免队列溢出等问题。 七、结语 本文主要介绍了Java定义...

    一点课堂 JAVA核心知识点整理.zip

    "一点课堂 JAVA核心知识点整理.zip"这个压缩包文件包含了关于Java编程的关键概念和技能的详细总结,非常适合初学者和有经验的开发者进行学习和复习。 首先,Java的核心知识点包括基础语法。这包括变量声明、数据...

    关于做程序开发的一点小的总结

    在“关于做程序开发的一点小的总结”中提到的第一个关键点是自学能力的重要性。在快速变化的IT行业中,新技术不断涌现,旧技术不断被淘汰,因此具备良好的自学能力对于程序员来说至关重要。这不仅包括学习新的编程...

    Java集合框架面试题

    这一点也要看实际情况,若是单挑数据的插入或删除,ArrayList 速度反而由于 LinkedList;若是批量随机的插入或删除数据,LinkedList 速度大大由于 ArrayList。 5. HashMap 和 Hashtable 的区别: - 1、HashMap 是...

    Java线上故障排查方案(2).pdf

    5. 云厂商或运营商问题排查,特别是在使用云服务时,云服务提供商的问题也会引起线上故障,排查时不应忽略这一点。 在故障排查时,常见的Linux命令也必须掌握。比如,使用top或htop命令查看实时的系统状态,使用...

    Java程序员面试题与经验工与总结.docx

    * 集合相关问题:HashMap、LinkedHashMap、ConcurrentHashMap、ArrayList、LinkedList 的底层实现,HashMap 和 Hashtable 的区别,ArrayList、LinkedList、Vector 的区别等。 * 多线程并发相关问题:创建线程的 3 种...

    CodingJava:只是解决了一点问题

    本主题围绕“CodingJava:只是解决了一点问题”,我们将深入探讨Java编程中的关键概念和技术,以及如何解决常见问题。 1. **基础语法**:Java的基础语法与C++类似,但更加简洁且具有自动内存管理。了解基本数据类型...

    一点Java复习资料

    - 软件学院05级OOP第二次测验试题及答案.doc:这可能是关于面向对象编程的一次测试,包括类、对象、封装、继承、多态等概念。 - OOP是Java的核心,理解类的定义、对象的创建和销毁、属性与方法的封装、单一职责...

    geek学习 有空就学习一点啦

    4. 集合框架:ArrayList、LinkedList、HashSet、HashMap等,以及它们的操作方法。 5. 输入/输出流:处理文件读写和网络通信。 6. 多线程:并发编程,理解Thread类和Runnable接口,以及同步机制(synchronized关键字...

    java练习程序集合类

    Java集合类中的ArrayList或LinkedList可以很方便地实现这一点。这里我们选择ArrayList,因为它的插入和访问速度较快。 ```java import java.util.ArrayList; import java.util.Collections; ArrayList<Integer> ...

    联想最新秋招java笔试题目.docx

    "联想最新秋招java笔试题目.docx" ...* 线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他线程共享进程所拥有的全部资源。

    java源码:Java数组倒置.zip

    除了这种方法,Java的Collections类提供了反转ArrayList的方法,虽然这里讨论的是数组,但了解这一点也有助于扩展知识面。例如,如果数组是对象类型的,可以先将其转换为ArrayList,再利用Collections的`reverse`...

    Frank-Wolfe-JAVA.rar_Frank_Frank-Wolfe

    1. **初始化**:首先,我们需要选择一个初始点,这可以是可行域内的任意一点,或者通过其他优化策略找到的点。 2. **梯度计算**:在每一步迭代中,我们计算目标函数在当前点的梯度,这是优化过程的关键,因为梯度...

Global site tag (gtag.js) - Google Analytics