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

java arraylist ensureCapacity无法正常工作

Java ArrayList 确保容量有效性的方法

在 Java 中,ArrayList 是一个动态数组列表,它允许你添加、删除和访问元素。ensureCapacity 是一个用于扩展或收缩数组容量的方法。然而,在某种情况下,ensureCapacity 可能无法正常工作。

问题

代码语言:java
复制
import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Hello");
        list.add("World");

        System.out.println("List size: " + list.size()); // 输出:List size: 2

        list.ensureCapacity(10);
        System.out.println("New list size: " + list.size()); // 输出:New list size: 10
    }
}

在这个示例中,我们创建了一个 ArrayList,并向其中添加两个元素。然后,我们调用 ensureCapacity 方法来扩展列表容量,使其可容纳 10 个元素。但奇怪的是,ensureCapacity 似乎没有生效,list.size() 仍然等于 2。

原因和解决方案

问题原因可能是:ensureCapacity 无法正常工作,因为列表中已有元素数量超过了容量。在这种情况下,我们需要在添加元素之前调用 ensureCapacity,而不是在添加元素之后。

解决方案如下:

代码语言:java
复制
import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Hello");
        list.add("World");

        System.out.println("List size: " + list.size()); // 输出:List size: 2

        // 在添加元素之前调用 ensureCapacity
        list.ensureCapacity(10);
        System.out.println("New list size: " + list.size()); // 输出:New list size: 10
        
        // 添加元素
        list.add("Another element");
        System.out.println("New list size: " + list.size()); // 输出:New list size: 11
    }
}

现在,我们在添加元素之前调用 ensureCapacity,并添加另一个元素。这次,ensureCapacity 正常工作,list.size() 变为 11。

结论

当使用 ArrayList 时,确保在添加元素之前调用 ensureCapacity,以防止数组容量不足。在本例中,添加元素之后调用 ensureCapacity 没有效果。

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

相关·内容

【数据结构】ArrayList原理及实现学习总结

一、ArrayList介绍 ArrayList是一种线性数据结构,它的底层是用数组实现的,相当于动态数组。与Java中的数组相比,它的容量能动态增长。类似于C语言中的动态申请内存,动态增长内存。 ...当创建一个数组的时候,就必须确定它的大小,系统会在内存中开辟一块连续的空间,用来保存数组,因此数组容量固定且无法动态改变。...二、ArrayList继承关系 ArrayList继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。 ...实现了 java.io.Serializable 接口:可以启用其序列化功能,能通过序列化去传输。未实现此接口的类将无法使其任何状态序列化或反序列化。...或者根据实际需求,通过调用ensureCapacity方法来手动增加ArrayList实例的容量。

1.9K50

ArrayList源码简析

设计思路 初始化 插入元素 扩容检查 ensureCapacity System.arraycopy() 和 Arrays.copyOf()方法 迭代器 ---- ArrayList 简介 ArrayList...与 Java 中的数组相比,它的容量能动态增长。在添加大量元素前,应用程序可以使用ensureCapacity操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。...ArrayList 实现了 java.io.Serializable接口,这意味着ArrayList支持序列化,能通过序列化去传输。 ---- Arraylist 和 Vector 的区别?...ArrayList 是 List 的主要实现类,底层使用 Object[ ]存储,适用于频繁的查找工作,线程不安全 ; Vector 是 List 的古老实现类,底层使用 Object[ ]存储,线程安全的...数组的增删查改没有什么独特优化技巧,无法就是需要在插入前进行扩容判断而已。

31810

Java集合框架(三)—— List、ArrayList、Vector、Stack

但如果向ArrayList集合或Vector集合中添加大量元素时,可使用ensureCapacity方法一次性地增加capacity。这可以减少增加重分配的次数,从而提高性能。   ...除此之外,ArrayList和Vector还提供了如下两个方法来操作capacity属性: void ensureCapacity(int minCapacity);  将ArrayList或Vector...ArrayList和Vector在用法上几乎完全相同,但由于Vector是一个古老的集合(从JDK1.0就有了),最开始的时候,Java没有提供系统的集合框架,所以Vector里面提供一些方法名很长的方法...list.add("南京"); list.remove(0); } }    上面最后两行代码对于普通List集合完全正常,但如果试图通过这两个方法来增加、删除...所以上面代码在编译时完全正常,但在运行时抛出java.lang.UnsupportedOperationException异常。

75350

ArrayList 简介

每日一言:“书上说,天下没有不散的宴席,书上还说了,人生何处不相逢” ---- ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增长。...在添加大量元素前,应用程序可以使用ensureCapacity操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。...ArrayList 实现了 java.io.Serializable接口,这意味着ArrayList支持序列化,能通过序列化去传输。 Arraylist 和 Vector 的区别?...ArrayList 是 List 的主要实现类,底层使用 Object[ ]存储,适用于频繁的查找工作,线程不安全 ; Vector 是 List 的古老实现类,底层使用 Object[ ]存储,线程安全的...ensureCapacity方法 ArrayList 源码中有一个 ensureCapacity 方法不知道大家注意到没有,这个方法 ArrayList 内部没有被调用过,所以很显然是提供给用户调用的,

45000

【面试必备】透过源码角度一步一步带你分析 ArrayList 扩容机制

//欢迎加入Java高级架构进阶Qqun:963944895,私聊管理员免费领取Java架构学习视频、Java最新面试题、Java编程书籍 */ public Object[] toArray...四、ensureCapacity方法 ArrayList 源码中有一个ensureCapacity方法不知道大家注意到没有,这个方法 ArrayList 内部没有被调用过,所以很显然是提供给用户调用的,...高级架构进阶Qqun:963944895,私聊管理员免费领取Java架构学习视频、Java最新面试题、Java编程书籍 最好在 add 大量元素之前用 ensureCapacity 方法,以减少增量从新分配的次数...:"+(endTime1 - startTime1)); } } //欢迎加入Java高级架构进阶Qqun:963944895,私聊管理员免费领取Java架构学习视频、Java最新面试题、Java...编程书籍 运行结果: 使用ensureCapacity方法前:4637 使用ensureCapacity方法前:241 通过运行结果,我们可以很明显的看出向 ArrayList 添加大量元素之前最好先使用

62500

Java集合(3)---Java集合ArrayList

ArrayList简介 ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。...ArrayList 实现java.io.Serializable接口,这意味着ArrayList支持序列化,能通过序列化去传输。和Vector不同,**ArrayList中的操作不是线程安全的!...elementData数组的大小会根据ArrayList容量的增长而动态的增长,具体的增长方式,请参考源码分析中的ensureCapacity()函数。 (02) size 则是动态数组的实际大小。...// 若ArrayList的容量不足以容纳当前的全部元素,设置 新的容量=“(原始容量x3)/2 + 1” public void ensureCapacity(int minCapacity)...(03) ArrayList的克隆函数,即是将全部元素克隆到一个数组中。 (04) ArrayList实现java.io.Serializable的方式。

99400

Java集合深度解析之ArrayList

ArrayList源码剖析 ArrayList的源码如下(加入了比较详细的注释): package java.util; public class ArrayListextends AbstractList...// 若ArrayList的容量不足以容纳当前的全部元素,设置 // 新的容量=“(原始容量x3)/2 + 1” public void ensureCapacity(int minCapacity...的写入函数 // 将ArrayList的“容量,所有的元素值”都写入到输出流中 private void writeObject(java.io.ObjectOutputStream...注意扩充容量的方法ensureCapacityArrayList在每次增加元素(可能是1个,也可能是一组)时,都要调用该方法来确保足够的容量。...Java强烈推荐在复制大量数组元素时用该方法,以取得更高的效率。 4. 注意ArrayList的两个转化为静态数组的toArray方法。 第一个,Object[] toArray()方法。

78060

【深入理解java集合系列】ArrayList实现原理

在添加大量元素前,应用程序也可以使用ensureCapacity操作来增加ArrayList实例的容量,这可以减少递增式再分配的数量。 注意,此实现不是同步的。...数组扩容通过一个公开的方法ensureCapacity(int minCapacity)来实现。...在实际添加大量元素前,我也可以使用ensureCapacity来手动增加ArrayList实例的容量,以减少递增式再分配的数量。...或者根据实际需求,通过调用ensureCapacity方法来手动增加ArrayList实例的容量。 ArrayList还给我们提供了将底层数组的容量调整为当前列表保存的实际元素的大小的功能。...具体介绍请参考我之前的文章 深入Java集合学习系列:HashMap的实现原理 中的Fail-Fast机制。

33910

Java集合源码剖析——ArrayList源码剖析

ArrayList源码剖析 ArrayList的源码如下(加入了比较详细的注释): package java.util; public class ArrayList extends...// 若ArrayList的容量不足以容纳当前的全部元素,设置 新的容量=“(原始容量x3)/2 + 1” public void ensureCapacity(int minCapacity...2、注意扩充容量的方法ensureCapacityArrayList在每次增加元素(可能是1个,也可能是一组)时,都要调用该方法来确保足够的容量。...Java强烈推荐在复制大量数组元素时用该方法,以取得更高的效率。 4、注意ArrayList的两个转化为静态数组的toArray方法。 第一个,Object[] toArray()方法。...该方法有可能会抛出java.lang.ClassCastException异常,如果直接用向下转型的方法,将整个ArrayList集合转变为指定类型的Array数组,便会抛出该异常,而如果转化为Array

73520
领券