`
man_yutao
  • 浏览: 39517 次
  • 性别: Icon_minigender_1
  • 来自: 梦的国度
社区版块
存档分类
最新评论

关于一个ArrayList的例子思考

阅读更多
一个简单的例子
import java.util.*;
public class SetList {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        for (int i = -3; i < 3; i++) {
             list.add(i);
        }
        for (int i = 0; i < 3; i++) {
         	  list.remove(i);
          }
	    System.out.println( list);
    }
}



会输出什么呢?是[-3,-2,-1],是[0,1,2],还是[-2,0,2]。

先不说答案,对于各种可能的结果来分析下。


对于第一种答案得出来也是有依据的,因为在ArrayList下有个方法如下
public boolean remove(Object o) {  ......  },执行此方法,移除掉值0,1,2,
所以认为答案为[-3,-2,-1]。

很不幸,ArrayList下还有个remove的重载方法
public E remove(int index) { ......   }
真正执行的是下面这个方法。

如果想得到第一种答案,可以将程序修改成如下
import java.util.*;
public class SetList {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        for (int i = -3; i < 3; i++) {
             list.add(i);
        }
        for (int i = 0; i < 3; i++) {
         	  list.remove(Integer.valueOf(i));//或者 list.remove((Integer)i);
          }
	    System.out.println( list);
    }
}



得出第二种结论的人该说了,既然是按照索引进行删除的,那肯定是第二种答案,这同样是个经典的错误。

ArrayList是基于数组的线性表,每删除索引处数据后,索引后的数据会全部向前移一位,原先的最后一位值变为null。也就是每删除一次,数组的结构就调整一次。

过程如下
[-3,-2,-1,0,1,2]在执行remove(0)后结果为
[-2,-1,0,1,2]    在执行remove(1)后结果为
[-2,0,1,2]        在执行remove(2)后结果为
[-2,0,2]

正确答案为第三种,哈
分享到:
评论

相关推荐

    C# 100个小例子(完整源码)

    《C# 100个小例子(完整源码)》是一个集合了大量C#编程实践的资源包,包含了从基础到进阶的各种示例代码,旨在帮助初学者和有一定经验的开发者巩固和提升C#编程技能。这个压缩包涵盖了C#语言的核心特性,以及...

    需求分析实验报告 东北大学版

    - 收款机类 (`Checkout`) 中包含一个 `ArrayList&lt;Transaction&gt;` 来存储所有在该收款机下发生的交易记录。 - 交易记录类 (`Transaction`) 中包含一个 `ArrayList&lt;Payment&gt;` 来存储每一笔交易中所有的付款信息。 ```...

    java基础编程.pdf

    另一个例子是isFlower方法,它接受一个整型参数,判断这个数是否是水仙花数,并返回一个布尔值。 关于程序设计,题目中的实例涉及到循环和条件判断的结合使用。在计算1到100能被3整除的数的和时,使用while循环遍历...

    近220个JAVA初学者实例源码

    网络编程可能是另一个主题,你可能会发现如何使用Socket进行TCP/IP通信,或者使用ServerSocket创建服务器端应用。 最后,这些实例还可能涵盖一些特定的Java API,如Swing或JavaFX用于构建图形用户界面(GUI),或者...

    数据结构实验报告 栈、队列和矩阵.doc

    在这个例子中,逆转字符串可以通过递归地将第一个字符移到末尾来实现,直到字符串为空或只剩下一个字符。代码中`reserve`方法就是递归逆转字符串的实现。 第二部分是输出一个集合(n个元素)的所有子集。这同样可以...

    POI导入Excel表格数据小例子

    Apache POI 是一个用于读写 Microsoft Office 格式文件的 Java API,包括 Excel、Word 和 PowerPoint 等。本例通过 Apache POI 库将 Excel 文件中的数据导入到数据库中。 #### 二、关键技术与库 - **Apache POI**: ...

    Head_First_Java_第二版中文高清版

    总的来说,《Head First Java》第二版是一本全方位的Java入门教程,它不仅教你如何编写Java代码,更重要的是教会你如何思考像一个程序员,理解和解决问题。通过阅读这本书,你将能够掌握Java的基础,为进一步的学习...

    java实用编程100例

    Java是一种广泛使用的面向对象的编程语言,以其跨平台性、高效性和丰富的类库而...记住,实践是检验真理的唯一标准,所以不仅要理解每一个例子,还要动手编写代码,不断迭代和优化,这样你的编程技能才能真正得到提升。

    Java程序设计实用教程源代码

    在源代码中,学习者可以找到关于线程创建、同步、互斥锁等的例子,这对于编写能够充分利用多核处理器的高效程序至关重要。 最后,Java标准库提供了丰富的API,如Swing或JavaFX用于图形用户界面(GUI)开发,网络...

    java简单小程序源码

    6. **继承**:一个类可以继承另一个类的特性,使用`extends`关键字实现。这有助于代码复用和构建复杂的类层次结构。 7. **多态**:多态允许不同类的对象对同一消息做出不同的响应,增强了程序的灵活性。Java通过...

    大学课程JAVA实例

    描述中的“本人一个一个做的,都能运行出来”表明这些实例是实际运行过的,并且经过验证可以成功执行,这为学习者提供了信心,确保他们可以跟随这些例子进行学习并看到预期的结果。分享这些实例也是学术交流的重要...

    Head First Java Code(配套《Head First Java》的例程代码)

    继承使得一个类可以继承另一个类的特性,减少代码重复;多态允许不同类的对象对同一消息做出响应,增强程序的灵活性。 4. **异常处理**:Java中的异常处理机制是通过try-catch-finally语句块来实现的,用于捕获和...

    java疯狂讲义 源代码

    在《Java疯狂讲义》的源代码中,你会看到许多关于集合框架的实现,例如ArrayList、LinkedList、HashMap等。集合框架是Java处理对象集合的核心工具,它们提供了存储、检索和操作数据的高效方式。此外,文件I/O、网络...

    Java程序设计与数据结构第六章习题答案

    2. **链表**:链表是一种动态数据结构,每个元素(节点)包含数据和指向下一个节点的引用。Java提供了LinkedList类来实现链表。理解链表的插入、删除、遍历等操作对于理解数据结构的底层工作原理至关重要。 3. **栈...

    java基础

    8. **继承与多态**:继承允许一个类(子类)从另一个类(父类)继承属性和方法,实现代码重用。多态则意味着相同的方法在不同对象上有不同的行为。 9. **异常处理**:Java通过try-catch-finally语句块处理运行时...

    Thinking in Java 3rd Edition 中文版(最好的版本).rar

    Java集合框架是另一个重要的主题,包括List、Set、Map接口及其实现,如ArrayList、LinkedList、HashSet、HashMap等。这些容器类为数据存储提供了丰富的选择,同时,Iterator和Iterable接口让遍历变得简单。此外,...

    Java新手学习实例

    记得每次完成一个例子后,都要思考其背后的原理和应用场景,这样才能真正吸收和掌握所学知识。 在"JAVA Example"这个压缩包中,你可以找到这些实例的源代码。打开每个文件,仔细阅读代码,运行并观察输出,然后尝试...

    JAVA经典的40个实例

    例如,实现一个简单的电话簿系统,存储和查找联系人。 4. **多线程**:理解线程的创建和同步,如Thread类的使用、Runnable接口实现、synchronized关键字以及wait()、notify()方法。 5. **IO流**:学习如何读写文件...

    C#初学者编程实例

    "C#初学者编程实例"就是一个极好的资源集合,它包含了一系列针对初学者设计的编程实例,旨在帮助新手快速上手并掌握C#语言的基础和进阶应用。 首先,C#(读作"C sharp")是微软公司开发的一种面向对象的编程语言,...

    Java程序员必会的程序

    “单例模式”是一个典型的例子,它确保一个类只有一个实例,并提供一个全局访问点。通过实现一个单例类,可以掌握如何在不同场景下控制对象的创建和访问。 #### 4. 异常处理与调试 了解异常处理机制,如try-catch-...

Global site tag (gtag.js) - Google Analytics