首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

即使在添加元素后,ArrayList也显示为空

在Java中,ArrayList是一种动态数组,可以根据需要自动调整大小。当我们向ArrayList添加元素后,可能会遇到ArrayList显示为空的情况。这可能是由于以下几个原因导致的:

  1. 未正确初始化ArrayList:在使用ArrayList之前,我们需要使用构造函数或者add()方法来初始化ArrayList。如果没有正确初始化,那么在添加元素后,ArrayList将仍然为空。
  2. 添加了null元素:如果我们向ArrayList添加了null元素,那么ArrayList仍然为空,因为null不会被视为有效元素。
  3. 使用错误的索引添加元素:在ArrayList中,我们可以使用add()方法根据索引位置添加元素。如果我们使用了错误的索引,例如超出了ArrayList的范围,那么添加的元素将不会被正确放置,导致ArrayList仍然为空。
  4. 添加了相同的元素:ArrayList允许添加重复的元素。如果我们多次添加相同的元素,那么ArrayList仍然显示为空,因为它只会保留一个副本。

为了解决这个问题,我们可以采取以下步骤:

  1. 确保正确初始化ArrayList:使用构造函数或者add()方法来初始化ArrayList,例如:ArrayList<Object> list = new ArrayList<>()。
  2. 检查是否添加了null元素:在添加元素之前,确保要添加的元素不是null。
  3. 检查索引是否正确:如果使用了索引添加元素,请确保索引的范围是有效的,不超过ArrayList的大小。
  4. 检查是否添加了重复元素:在添加元素之前,可以使用contains()方法检查ArrayList中是否已经存在相同的元素。

总结起来,当我们向ArrayList添加元素后,如果ArrayList仍然显示为空,我们应该检查是否正确初始化ArrayList,是否添加了null元素,是否使用了正确的索引以及是否添加了重复元素。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java集合(一)--框架认识+Arraylist介绍+迭代器遍历

对象,调用这个对象里面的方法,去往这个对象集合里面添加新的元素:我们可以看到,使用这个add方法添加新的元素的时候,这个数据类型是不一样的,这个也是和数组的一个区别,我们的数组里面的数据类型必须是一样的...3下标的数据,我们的这个列表里面是可以插入重复的元素,也可以插入null数值的; 我们也可以在这个指定位置插入,第一个参数就是下标,第二个参数就是插入的内容,除此之外,这个还有indexof,lastindexof...,但是我们的这个ArrayList没有这个线程安全; 2.创建ArrayList对象的时候,如果使用无参构造器,这个时候容量就是0,当我们添加数据的时候,这个容量就是10,加满之后按照1.5倍进行扩容;...,即使是空的,也是显示,方便我们看这个现象更加直观; 我们没进行这个设置的时候这个Object[22]@599就已经显示出来这个这个列表的大小:就是22,但是我们没有进行设置的时候,这个null就不会显示出来...,我们上面的这个设置效果就是为了把这个即使是空的数据也要显示出来,方便我们进行调试,因为这个IDEA里面的这个默认显示的是被阉割的,并不是完整的,而是已经有的不是空的数据; ull就不会显示出来,我们上面的这个设置效果就是为了把这个即使是空的数据也要显示出来

9610

arraylist linkedlist底层实现原理

具体举例说明:在单线程运行的情况下,如果Size = 0,添加一个元素后,此元素在位置 0,而且Size=1;而如果是在多线程情况下,比如有两个线程,线程 A 先将元素存放在位置0。...线程B也向此ArrayList 添加元素,因为此时 Size 仍然等于 0 (注意哦,我们假设的是添加一个元素是要两个步骤哦,而线程A仅仅完成了步骤1),所以线程B也将元素存放在位置0。...,则设置元素数组为空 7 this.elementData = EMPTY_ELEMENTDATA; 8 } 9 } 六、ArrayList的add()方法 在add()方法中主要完成了三件事...参数为size+1,代表的含义是如果集合添加元素成功后,集合中的实际元素个数。换句话说,集合为了确保添加元素成功,那么集合的最小容量minCapacity应该是size+1。...(2)ArrayList在顺序添加一个元素的时候非常方便,只是往数组里面添加了一个元素而已。 (3)根据下标遍历元素,效率高。 (4)根据下标访问元素,效率高。

44040
  • Guava - 拯救垃圾代码,写出优雅高效,效率提升N倍

    Preconditions.checkNotNull 进行非空判断,好处为觉得有两个,一是语义清晰代码优雅;二是你也可以自定义报错信息,这样如果参数为空,报错的信息清晰,可以直接定位到具体参数。...使用 JDK 提供的不可变集合创建成功后,原集合添加元素会体现在不可变集合中,而 Guava 的不可变集合不会有这个问题。...(String) 可以为空值自定义显示文本。...字符串分割 JDK 中是自带字符串分割的,我想你也一定用过,那就是 String 的 split 方法,但是这个方法有一个问题,就是如果最后一个元素为空,那么就会丢弃,奇怪的是第一个元素为空却不会丢弃,...现在可以了, Guava 中提供了简单的缓存类,且可以根据预计容量、过期时间等自动过期已经添加的元素。即使这样我们也要预估好可能占用的内存空间,以防内存占用过多。

    1K30

    JDK源码分析-ArrayList

    ArrayList 内部也是一个数组,它对数组的功能做了增强:主要是在容器内元素增加时可以动态扩容,这也是 ArrayList 的核心所在。...指定初始化集合的构造器 该构造器传入一个集合 Collection,即使用 Collection 中的元素初始化 ArrayList 对象,代码如下: public ArrayList(Collection...DEFAULTCAPACITY_EMPTY_ELEMENTDATA,即使用无参构造器初始化 ArrayList,则默认初始化容量为 10....若未指定初始化容量 当第一次执行 add() 方法时,将数组长度默认初始化为 10,之后再添加元素时不扩容,直至容量等于 10,再添加第 11 个元素时,将容量扩容为 15 (10 + 10 >> 1)...场景分析一: 若有一个初始容量为 1 的 ArrayList,线程 T1 和 T2 同时向其中添加元素(add() 方法),当添加第 2 个元素时,需要进行扩容。 此时若有以下执行时序: 1.

    37820

    ArrayList 源码分析

    成员属性 当添加第一个元素时,elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA 的任何空ArrayList都将扩展为默认的capacity private...与 EMPTY_ELEMENTDATA 分开,这样就可以了解当添加第一个元素时需要创建多大的空间 transient Object[] elementData; // 真正存储ArrayList中的元素的数组...添加元素与扩容 添加元素时使用 ensureCapacityInternal() 方法来保证容量足够,size + 1 为最少需要的空间大小,如果elementData的长度不够时,需要使用 grow(...:至少需要的容量为两个集合的长度之和,同样是通过 ensureCapacityInternal() 来保证容量是足够的,然后调用 System.arraycopy 将要添加的集合中的元素复制到原集合已有元素的后面...默认序列化机制就会忽略该字段,反序列化后自动获得0或者null值 静态成员不参与序列化 每个类可以实现readObject、writeObject方法实现自己的序列化策略,即使是transient修饰的成员变量也可以手动调用

    37610

    【数组知识的扩展①】

    (即:`all` ,`evenarr`,`oddarr`的创建)未给它们分配大小,导致后面我们其实是无法向这些数组里面添加元素的,中国有句古话“强扭的瓜不甜”,即使我们强制给他们添加新元素,这也是徒劳,...最终就会看到控制台那句报错信息写的:数组越界异常~ 她为了解决这个问题,在Java中找到了一个内置类,即 `ArrayList` , 下面我们将进入ArrayList的学习: ArrayList:这个类是...他是一个可以动态修改的数组,与普通数组相比,他没有固定大小的限制,我们可以通过它进行添加或删除元素。...("---添加----------------------------------------------------------------------"); // 添加元素...However`ArrayList`不是线程安全的,在多线程环境中,如果多个线程同时对同一个`ArrayList`修改,可能会导致数据不一致,或者抛出异常,如果想在多线程环境中使用`ArrayList`

    10510

    ArrayList源码解析

    上面的方法是ArrayList的构造方法,这个方法只实现了一个功能就是将elementData数组设置为一个空数组,也可以理解为将ArrayList集合中的底层数组清空。...但这时elementData数组并没有被初始化,也就是说在我们使用ArrayList集合类是,即使我们创建了ArrayList对象,底层的数组也不会执行初始化操作。...上述代码是ArrayList集合类中的添加方法,虽然我们现在还不知道ensureCapacityInternal()方法具体的作用是什么,但我们简单分析可知,这段代码执行完后,就会把当前元素添加到ArrayList...方法的参数值其实就是集合中已经存储的元素个数然后执行加1后的值。然后将最大的那个值赋给方法参数。...按照上面分析,我们可以得到结论是在ArrayList中,只有当前添加的元素刚好超过了底层数组中的大小时,才会创建新的数组来存储元素。

    34920

    ArrayList源码学习

    1.相关变量信息 //默认初始化容量为10 private static final int DEFAULT_CAPACITY = 10; //为空数组实例准备一个空数组{} private static...= 0; } 进行addAll操作添加元素到指定位置: //将集合c中所有元素添加到当前ArrayList中 public boolean addAll(Collection<?...= 0; } 进行addAll操作添加元素到指定位置: //将集合c中所有元素添加到当前ArrayList中 public boolean addAll(int index, Collection<?...= 0; } 默认的初始容量为10。是否需要扩容,会先计算容量。如果数组为空,则直接返回默认容量10。如果需要容量>数组长度,则进行扩容。...其进行添加元素的时候,会首先进行越界校验,如果没有越界才继续进行操作。接着查看容量是否够,不够的话,进行扩容操作,而扩容操作是在grow()方法中进行的。

    43320

    ArrayList 源码解析

    ArrayList 允许空值和重复元素,当往 ArrayList 中添加的元素数量大于其底层数组容量时,其会通过扩容机制重新生成一个更大的数组。...,只需两个步骤即可: 检测数组是否有足够的空间插入 将新元素插入至序列尾部 通过上面源码分析我们可以知道: 任何一个空的ArrayList在添加第一个元素时,内部数组容量将被扩容为10; 扩容时,newCapacity...遍历时删除 遍历时删除是一个不正确的操作,即使有时候代码不出现异常,但执行逻辑也会出现问题。关于这个问题,阿里巴巴 Java 开发手册里也有所提及。...但删除元素 1 后,就无法再进入 while 循环,此时 it.hasNext() 为 false。...原因是删除元素 1 后,元素计数器 size = 1,而迭代器中的 cursor 也等于 1,从而导致 it.hasNext() 返回false。

    65541

    Java 集合框架(3)---- List 相关类解析(下)

    好了,这样的话我们就把 ArrayList 的添加元素的整个流程过了一遍,主要流程也不复杂: 先判断元素数组是否需要扩容 ⇒ 确定扩容后的容量(第一次将容量调整为默认容量(10),之后 以1.5 倍数进行扩容...同时我们也知道:进行扩容操作的代价是很大的,尤其是当你的 ArrayList 的元素数量很大的时候,向虚拟机申请内存空间和进行元素拷贝的开销都很大,所以我们在使用的时候如果能够预知需要使用的最大容量,我们应该调用传入固定数值参数作为数组元素最大容量的构造方法...中定义 modCount++; } 这里涉及到数据结构中在双向链表末尾添加新元素的过程,即将新的末尾节点和旧的末尾结点通过直接前驱和直接后继的关系链接起来,然后更新末尾节点为新添加的这个节点(相当于末尾节点引用...Vector 这个类其实和 ArrayList 类相当像,也是利用数组储存元素,同时也可以动态的管理元素,我们可以看看它的类继承结构图: ?...我们知道栈的操作无非就几种:入栈、出栈、查看栈顶元素、判断栈是否为空、得到栈中元素的个数。而 Vector 不仅支持这几种操作,同时支持随机访问、随机修改、随机添加。

    66640

    Java集合对象如何进行内存优化

    当您使用默认构造函数创建ArrayList时,elementData被设置为指向一个单例共享的零大小数组(elementData也可以设置为null,但是单例数组提供了一些较小的实现优势)。...一旦将第一个元素添加到列表中,就会创建一个真正的、惟一的elementData数组,并将提供的对象插入其中。为了避免在每次添加新元素时调整数组的大小,它的创建长度为10(“默认容量”)。...这里有一个问题:如果您不向这个ArrayList添加更多元素,那么elementData数组中的10个插槽中的9个将保持空。即使您稍后清除这个列表,内部数组也不会收缩。下图总结了这个生命周期: ?...通常,如果指定-Xmx小于32g,则指针大小为4字节;对于较大的堆,它是8字节。因此,使用默认构造函数初始化的ArrayList只添加了一个元素,浪费了36或72个字节。...事实上,一个空的ArrayList也会浪费内存,因为它没有用,但是ArrayList对象本身的大小是非零的,并且比您想象的要大。

    2K20

    简单源码解读之猜想验证

    一、背景 最近有一个朋友问,为啥 ArrayList 空参构造方法和有参构造方法的参数为 0 所用的空元素数组不用同一个。...2.1 猜想后验证 既然不一样,我们猜测他们可能并不是简单的作为空数组元素,可能会用来判断构造的来源(是空参构造函数还是带初始容量构造的)。...那么第一次添加元素时真的用它来判断了吗?空参构造方法第一次添加元素时容量又是怎样变化的呢? 2.2 核实&验证 如果没提到第一次添加元素时用到,我们可以在 IDEA中找到用到该变量的地方,一一排查。...data).DEFAULTCAPACITY_EMPTY_ELEMENTDATA == ((ArrayList) data).elementData 验证了此时的确为默认容量的空元素数据。...执行到打印语句处打断点,然后在调试窗口中执行表达式: ((ArrayList) data).elementData 可以看到添加第一个元素后,底层的 elementData 容量的确是 10.

    40720

    List集合

    (1)添加元素 void add(int index,Object element):在[index]位置添加一个元素。...在构建ArrayList集合对象时,如果没有显示指定容量,那在JDK1.6及其之前版本的内部数组初始化容量默认为10,之后的版本初始化容量为长度为0的空数组,在添加第一个元素时再创建一个长度为10的数组...ArrayList延迟创建长度为10的数组的目的是节省内存空间,因为有时我们在创建ArrayList集合对象后,并没有添加元素,这点在方法的返回值类型是List类型时,极有可能存在。...当然你也可以在创建ArrayList集合对象时,自己指定初始化容量。   ArrayList类在添加一个新元素时,如果现有的数组容量不够,则会将新数组长度扩容为原来的1.5倍之后再添加。...如果没有显示指定容量,则在JDK6版本创建对象时,初始化容量为10,在更高版本创建对象时,初始化容量为0,第一次添加元素时,初始化容量为10. 1.5倍 不安全(不同步) 较新 较高 1.3.4 Stack

    65130

    ArrayList扩容机制JDK1.8

    JDK7中构造一个初始容量为10的空列表但是JDK8中只是构造一个空的数组 ArrayList(Collection<?...(size + 1); //在完成添加之前要确保数组长度足够 elementData[size++] = e; return true; } //3.elementData为ArrayList...,就初始化数组容量为10(空参的构造方法下首次添加) if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { return...我们明白了ArrayList的自动扩容机制,每次新添加元素的时候都会判断是否能够容下,如果不够就会发生扩容,扩容的大小为原大小的1.5倍数,明白这些以后让我们看看下面这段程序扩容了几次呢??...(i); } 前20次添加不会发生扩容,当21元素添加时数组容量从20扩容到30,当添加31元素时数组容量从30扩容到45,当添加46元素时数组容量从45扩容到67 发布者:全栈程序员栈长,转载请注明出处

    19120

    《我们一起学集合》-ArrayList

    // 任何空的ArrayList 将被扩展到10当(第一次添加元素时) // 注意是通过transient修饰 transient Object[] elementData; //...* 构造一个初始容量为10的空列表。...ArrayList的无参构造,其实默认是空数组,我们上面说的初始化容量默认为10,是当我们用无参构造函数后,第一次向ArrayList添加元素时扩容的默认大小。...5-2.增加 ArrayList添加元素的方法有四个:一个是在末尾添加,一个是指定索引添加,另两个是在末尾添加集合和在指导索引位置添加集合 // 将指定的元素添加到列表的末尾。...最后我们在看看ArrayList的一些方法,没有必要全记住因为我也记不住,只要有个大概印象就好了,在我们要用的时候再去查找。

    48110

    Java面试——阻塞队列

    当阻塞队列为空时,通过 poll 指定获取时间,超过时间后,消费者线程会退出,并返回 null。...你可能会想,如果我一直往队列中添加元素而不取,添加的元素个数超过了数组长度,会不会覆盖之前添加的元素。...Link也支持在创建对象时指定队列长度,如果没有指定,默认为Integer.MAX_VALUE。...而 Condition内部同样维持着一个双向链表,但是向链表中添加元素(await)和从链表中移除(signal)元素没有像 ReentrantLock那样,保证线程安全,所以在调用 Condition...takeLock 取元素单独的锁,和放元素分开,这样即使有 Condition也可以使的取和放元素在不同的节点上自选。notEmpty 取元素的Condition锁,和放元素锁分开。

    90320

    【建议收藏合集整理】国一大佬带你,蓝桥杯Java组拿奖基础知识整理集合,看完,3天冲蓝桥杯省一。

    它的作用是将指定的内容打印到标准输出流(通常是控制台),并在最后添加一个换行符,以使输出的内容换行显示。...注意事项 System.out.println() 是线程安全的,可以在多线程环境下使用。 System.out.println() 总是会在输出内容的末尾添加一个换行符,以使输出内容换行显示。...另外,Java 中的取余操作也适用于浮点数,但不建议在浮点数上使用取余操作,因为浮点数的精度问题可能导致不可预测的结果。通常情况下,应该避免在浮点数上执行取余操作。...:" + isEmpty); // 输出 "true" } } 这些例子演示了基础队列方法的使用,包括添加元素、移除元素、获取队列头部元素以及检查队列是否为空。...isEmpty() 方法:判断栈是否为空。 你可以通过这些方法来操作栈,实现数据的压入、弹出、查看栈顶元素以及判断栈是否为空。

    56811
    领券