首页
学习
活动
专区
工具
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元素,是否使用了正确的索引以及是否添加了重复元素。

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

相关·内容

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)根据下标访问元素,效率高。

42540

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.

    37220

    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修饰的成员变量可以手动调用

    36810

    ArrayList源码解析

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

    33620

    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()方法中进行的。

    42520

    ArrayList 源码解析

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

    64641

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

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

    66140

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

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

    1.9K20

    简单源码解读之猜想验证

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

    39520

    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

    63930

    ArrayList扩容机制JDK1.8

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

    17520

    《我们一起学集合》-ArrayList

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

    47310

    Java面试——阻塞队列

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

    88820

    第56节:ArrayList,LinkedList和String

    break; } } } 这样控制台显示: // 显示 1 1 集合是用来存储一些变量 Collection的一些常见方法: size() isEmpty(() contains...LinkedList中是处于不同的内存地址的,每个元素存储的空间有个文件指针是指向下一个元素的,只有当它进行迭代,才能找到....链表内是由一个header的表项是作为链表的开始,同样有链表的结尾.链表中表项头header的驱表项就是链表中第一个元素,而表项header的前驱就是链表的最后一个元素....创建对象: ArrayList arrayList = new ArrayList(); 添加数据等等: arrayList.add("dashucoding"); LinkedList都是指针指向下一个元素...,如果中间有进行删减,那么后面的元素会提前到前面空缺的位置,后面的一样.所以LinkedList比较麻烦的,LinkedList是基于链表的数据结构哦~ 总结LinkedList和ArrayList

    41230

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

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

    18210

    ArrayList扩容原理

    而且大家都一定知道ArrayList集合是通过数组实现的,但是声明一组数据的时候都会选择ArrayList而不是数组,原因就是由于这组数据的元素的数量不确定,如果使用数组的话,我们还得亲自维护数组的长度...,那必定是添加元素的时候,容量不够了,所以才要扩容啊,因此我们找一下添加元素的方法 // 末尾添加一个元素 public boolean add(E e) { //size+1表示要添加这个元素...//arrayList元素数量 + c的元素数量 size += numNew; // ... } //指定位置添加一个集合 public boolean addAll(int index...而且此方法做了更详细的判断,如果我们声明ArrayList对象的时候指定了他的初始容量,那么扩容的容量就是我们传入的参数;如果没有指定他的初始容量,那么扩容的容量至少10。...总结 1、自动扩容的新容量的大小是原容量的1.5倍 2、一般来讲扩容的最大容量最大数组长度,即最大整数-8 3、若ArrayList元素的数量大于最大数组长度,则扩容的容量最大整数 4、

    28640
    领券