`
大器晚成
  • 浏览: 52817 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

ArrayList的陷阱!谁知道?

 
阅读更多
import java.util.ArrayList;


public class ArrayListTest {
	public static void main(String[] args) {
		//一个物件链表
		ArrayList<String> strAl=new ArrayList<String>();
		strAl.add("a");
		strAl.add("b");
		strAl.add("c");
		strAl.add("d");
		//要删除物件链表的所有索引
		ArrayList<Integer> indexes=new ArrayList<Integer>();
		indexes.add(0);
		indexes.add(2);
		//逐个删除
		for (int i = 0; i < indexes.size(); i++) {
			strAl.remove(indexes.get(i));
		}
		//打印最后物件个数
		System.out.println(strAl.size());
	}
}

//谁能不运行代码,知道打印出来是多少呢
7
6
分享到:
评论
22 楼 anshui3211 2011-04-21  
谢谢分享,以前真不知道~
21 楼 贾懂凯 2011-04-20  
20 楼 大器晚成 2011-04-16  
lalahei 写道
感觉标题应该改成,自动装箱和拆箱的陷阱更合适~~

自动装箱和拆箱是根据需要来做的,而不是一遇到有基本类型的对象就自动拆箱
19 楼 magnum2010 2011-04-15  
LZ这个问题很是经典!长知识了!
18 楼 lalahei 2011-04-15  
感觉标题应该改成,自动装箱和拆箱的陷阱更合适~~
17 楼 lantian_123 2011-04-15  
wskiwwwx 写道
谁没事这么干啊,2B,get方法得到的是Object数据,你直接传给remove当然就自动适配到了remove(Object)这个方法了啊,而strAl里面没有0和2 ,当然删不掉任何数据啊,唉!!!

仁兄多大了啊?
16 楼 lalahei 2011-04-15  
i
wskiwwwx 写道
谁没事这么干啊,2B,get方法得到的是Object数据,你直接传给remove当然就自动适配到了remove(Object)这个方法了啊,而strAl里面没有0和2 ,当然删不掉任何数据啊,唉!!!

仁兄,明显激动了,这里的确是个陷阱,我想楼主拿出来,也是想让大家来认识到这个问题。没人做的事,当你做了,有时可以帮助你认识的问题的本质~~
15 楼 wskiwwwx 2011-04-15  
谁没事这么干啊,2B,get方法得到的是Object数据,你直接传给remove当然就自动适配到了remove(Object)这个方法了啊,而strAl里面没有0和2 ,当然删不掉任何数据啊,唉!!!
14 楼 Coder211 2011-04-15  
寻环里面的代码改为下面的语句
strAl.remove(indexes.get(i).intValue());
13 楼 卖火柴的老特工 2011-04-15  
大器晚成 写道
卖火柴的老特工 写道
菜鸟求指教啊

remove有两个类型的参数 Object 和int 你给它Integer  它直接调用remove(Object)

谢谢,还是自动拆箱想的太简单了
12 楼 fanfq 2011-04-14  
4
主要问题在这里
//逐个删除 
        for (int i = 0; i < indexes.size(); i++) { 
            strAl.remove(indexes.get(i)); 
        } 

不能这样直接remove的。
一般都在迭代器里面做的。
11 楼 deific 2011-04-14  
晕,不看源码,真想不到~~
10 楼 大器晚成 2011-04-14  
卖火柴的老特工 写道
菜鸟求指教啊

remove有两个类型的参数 Object 和int 你给它Integer  它直接调用remove(Object)
9 楼 大器晚成 2011-04-14  
卖火柴的老特工 写道
为什么没有自动拆箱啊??

因为remove接受Integer类型的参数,所以不会自动拆箱
8 楼 卖火柴的老特工 2011-04-14  
菜鸟求指教啊
7 楼 卖火柴的老特工 2011-04-14  
为什么没有自动拆箱啊??
6 楼 enefry 2011-04-14  
Object就是Object.
5 楼 snowflate_summer 2011-04-14  
想当然了,确实一开始没看出来,后来看了源码,也没看到  remove(Object o) 这个方法,确实一不小心就要掉到这个陷阱里去了。
4 楼 java_林 2011-04-14  

大器晚成 写道
grandboy 写道
这里要不是仔细看还真搞不对,我仔细想过,不过也是想错了。因为我几乎没有怎么使用过remove这个方法. 仔细看了一下ArrayList的实现。

我也是看到remove有两个参数才知道的。



嗯,想当然了,以为java会自动拆包,谁知道,这个方法有两个参数
3 楼 bolide74 2011-04-14  
for (int i = 0; i < indexes.size(); i++) {
			strAl.remove((int)indexes.get(i));
		}

如果是强制转换get的返回类型,就是真正删除掉了

相关推荐

    ArrayList源码Jdk1.8

    ### ArrayList源码解析(JDK 1.8) ...了解`ArrayList`的内部实现有助于更好地利用它的优势并避免潜在的性能陷阱。在设计多线程应用时尤其需要注意其非同步特性的限制,并采取适当的同步策略来保证数据一致性。

    java陷阱常见面试题

    Java语言在实际应用中充满了各种陷阱,这些陷阱可能在编程过程中导致意料之外的问题,对程序的稳定性和性能造成影响。对于求职者来说,熟悉这些陷阱并在面试中能够准确解答,是展示自身技能水平的重要方式。本文将...

    java面试陷阱题

    5. **集合框架**:深入理解ArrayList、LinkedList、HashSet、HashMap等集合类的内部实现,包括它们的时间复杂度和适用场景。知道ConcurrentHashMap在并发下的优势。 6. **反射机制**:理解反射的基本用法,如Class...

    java常见疑惑与陷阱

    例如,`ArrayList`和`HashMap`在多线程环境下不是线程安全的,而在某些场景下,我们可以选择使用`Vector`、`ConcurrentHashMap`等线程安全的集合类。 #### 三、揭开神秘的锁机制 Java中的锁机制是实现多线程同步的...

    java ArrayList.remove()的三种错误用法以及六种正确用法详解

    在Java编程中,ArrayList是List接口的一个重要实现类,它基于数组进行操作,提供了一种高效的方式来存储和访问有序的元素。ArrayList的remove()方法是一个关键功能,用于删除列表中的元素。然而,如果不正确地使用这...

    Java程序员面试可能遭遇的个专业技术陷阱解析.pdf,这是一份不错的文件

    - 面试陷阱:面试官可能会询问ArrayList和LinkedList的区别,或者HashMap的工作原理。 - 解析:Java集合框架包括List、Set、Map等接口及其实现类。ArrayList适合随机访问,LinkedList适合频繁插入和删除。HashMap...

    Java程序员面试陷阱共48页.pdf.zip

    Java程序员在面试过程中可能会遇到各种陷阱,这些陷阱可能源于对技术理解的深度、广度,或是面试技巧的不足。这份48页的PDF文档“Java程序员面试陷阱”旨在揭示这些问题,帮助求职者避免在关键面试时刻掉入这些误区...

    Java Scjp 陷阱大全

    7. **数组与集合**:数组是固定大小的,而集合如ArrayList和LinkedList具有动态增长能力。选择合适的数据结构很重要,同时,遍历集合时要注意迭代器的使用。 8. **字符串处理**:`String`是不可变的,`...

    java程序员面试陷阱

    6. **集合框架**:深入理解ArrayList、LinkedList、HashMap、HashSet等集合类的内部实现和性能特性,面试官可能会通过比较这些数据结构的差异来考察你的基础知识。 7. **泛型**:泛型是Java中一种强大的类型安全...

    Java 面试中的陷阱

    - 知道ArrayList和LinkedList的区别,HashMap和ConcurrentHashMap的工作原理。 - 探讨泛型、迭代器、并发容器(如ConcurrentHashMap、CopyOnWriteArrayList)的使用。 7. **反射与注解**: - 理解反射的概念,...

    Java ArrayList add(int index, E element)和set(int index, E element)两个方法的说明

    本文将详细解释`add(int index, E element)`和`set(int index, E element)`这两个方法,并通过示例代码分析它们的工作原理以及可能出现的陷阱。 1. `add(int index, E element)`方法: 这个方法用于在ArrayList的...

    IT职场:程序员Java面试中的陷阱

    这篇文章将探讨Java面试中的一些常见陷阱,帮助求职者更好地准备面试。 首先,面试官可能会问到关于Java基础的问题,这包括但不限于语言特性、数据类型、内存管理等。例如,他们可能会询问Java的垃圾回收机制,如何...

    java软件工程师面试试题集合、软件工程面试题和面试中的陷阱

    Java集合框架是另一个常考领域,包括ArrayList、LinkedList、HashMap、TreeMap等容器的特性与使用场景,以及如何进行高效的集合操作。面试中可能会要求实现特定的集合操作,比如查找、排序或优化内存占用。 JVM...

    突破程序员基本功的16课.part2

    14.5.1 谁都会出错 14.5.2 调试比写程序更费时 14.6 小结 第15课 使用IDE工具 15.1 何时开始利用IDE工具 15.2 IDE工具概述 15.2.1 IDE工具的基本功能 15.2.2 常见的Java IDE工具 15.3 项目管理 15.3.1 ...

    避坑手册 - JAVA编码中容易踩坑的十大陷阱.doc

    List&lt;User&gt; maleUsers = new ArrayList(); for (User user : userList) { if ("男".equals(user.getSex())) { maleUsers.add(user); } } userList.removeAll(maleUsers); ``` 2. 参数传递: Java中,对象...

    很容易弄错的java面试题

    "很容易弄错的Java面试题"通常涉及那些看似简单实则暗藏陷阱的问题,这些问题能够检验候选人在实际编程中的严谨性和对细节的把握。下面,我们将深入探讨一些经典的Java面试题及其背后的原理。 1. **对象的相等性**...

    你必须知道的261个Java语言问题

    这份资料《你必须知道的261个Java语言问题》旨在帮助开发者避免在实际编程过程中遇到的常见问题和陷阱,提升开发效率和代码质量。以下是对其中一些关键知识点的详细解释: 1. **内存管理**:Java的垃圾回收机制...

    JAVA基础易错总结(50%你不知道)

    开发者需要清楚ArrayList与LinkedList的性能差异,以及HashMap与TreeMap的区别。同时,理解迭代器的工作原理,避免在遍历集合时修改集合,这些都是避免运行时错误的关键。 并发编程是Java的强项,但也是挑战。线程...

    Java程序员容易犯的10个错误

    本文将针对Java程序员容易犯的10个错误进行详细讲解,帮助大家避免这些陷阱。 1. **Array 转 ArrayList**: 当使用`Arrays.asList()`方法将数组转换为列表时,返回的是`java.util.Arrays.ArrayList`,这是一个内部...

Global site tag (gtag.js) - Google Analytics