精华内容
下载资源
问答
  • 数组大小可以任意改变
    千次阅读
    2021-04-08 11:32:03

    我正在处理我的应用程序中的大型数组,需要调整它们的大小.

    假设您有一个2Gb的数组,并且您希望将其调整为3Gb.有没有办法在不需要暂时5Gb的情况下调整大小?

    例如,给定使用-Xmx1G标志的1Gb堆:

    public class Biggy {

    public static void main(String[] args) {

    int[] array;

    array = new int[100 * 1000 * 1000]; // needs 400Mb, works

    array = null; // needed for GC

    array = new int[150 * 1000 * 1000]; // needs 600Mb, works

    array = null; // needed for GC

    array = new int[100 * 1000 * 1000]; // needs 400Mb, works

    array = Arrays.copyOf(array, 150 * 1000 * 1000); // needs 1000Mb, throws out of memory

    }

    }

    那么,有没有办法调整数组大小而不需要额外的临时内存?

    解决方法:

    我会使用List< int []>其中每个int []是固定大小.例如1.28亿.增长整个“集合”只涉及添加另一个数组.我在直接内存中使用IntBuffer,这避免了使用堆的需要. (或使用内存映射文件,这意味着它不使用堆或直接内存;)这是丑陋的,我使用包装类来隐藏丑陋.它确实表现得非常好.使用内存映射文件,我可以使用大于物理内存的“数组”.

    private final List array = new ArrayList();

    public int get(long n) {

    return array.get((int)(n >> 27)).get(n & ((1 << 27) -1));

    }

    public void put(long n, int v) {

    return array.get((int)(n >> 27)).put(n & ((1 << 27) -1), v);

    }

    标签:java,arrays,memory

    来源: https://codeday.me/bug/20190630/1337380.html

    更多相关内容
  • Vector 类实现了一个动态数组,主要用在事先不知道数组大小,或者只是需要一个可以改变大小数组的情况。 构造方法 默认的向量,默认大小为 10 Vector() 创建指定大小的向量 Vector(int size) 创建指定大小的...

    定义

    Vector 类实现了一个动态数组,主要用在事先不知道数组的大小,或者只是需要一个可以改变大小的数组的情况。

    构造方法

    默认的向量,默认大小为 10

    Vector()
    

    创建指定大小的向量

    Vector(int size)
    

    创建指定大小的向量,并可按指定量增加容量

    Vector(int size,int incr)
    

    创建一个包含集合 c 元素的向量

    Vector(Collection c)
    

    常用函数

    函数作用
    void add(int index, Object element)在此向量的指定位置插入指定的元素。
    boolean add(Object o)将指定元素添加到此向量的末尾。
    boolean addAll(Collection c)将指定 Collection 中的所有元素添加到此向量的末尾,按照指定 collection 的迭代器所返回的顺序添加这些元素。
    boolean addAll(int index, Collection c)在指定位置将指定 Collection 中的所有元素插入到此向量中。
    void clear()从此向量中移除所有元素。
    Object get(int index)返回向量中指定位置的元素。
    Object remove(int index)移除此向量中指定位置的元素。
    boolean remove(Object o)移除此向量中指定元素的第一个匹配项,如果向量不包含该元素,则元素保持不变。
    展开全文
  • }}数组大小可以程序运行的时候才定义吗?不。在数组的定义中,数组大小必须是编译时可知的,不能是在程序运行时才可知的。例如,假设i是一个变量,你就不能用i去定义一个数组大小:char array[i];有些语言支持...

    }

    }

    数组的大小可以程序运行的时候才定义吗?

    不。在数组的定义中,数组的大小必须是编译时可知的,不能是在程序运行时才可知的。例如,假设i是一个变量,你就不能用i去定义一个数组的大小:

    char array[i];

    有些语言支持这种定义,但C语言不支持。如果C语言支持这种定义,栈就会变得更复杂,调用函数的开销就会更大,而程序的运行速度就会明显变慢。

    如果数组的大小在编译时是可知的,即使它是一个非常复杂的表达式,只要它在编译时能被计算出来,你就可以定义它。

    如果你要使用一个在程序运行时才知道其大小的数组,你可以说明一个指针,并且调用malloc()或calloc()函数从堆中为这个数组分配内存空间。以下是一个拷贝传给main()函数的argv数组的例子:

    例 7.15 在动行时确定大小的数组,使用了指针和malloc()

    # include

    # include

    int

    main (int argc, char* * argv)

    {

    char* * new_argv;

    int i;

    new_argv = (char* * ) calloc(argc + l, sizeof (char * ));

    / * or malloc ((argc +1) * sizeof (char * ) ) * /

    printf ("allocated room for %d pointers starting at %P\n", argc +

    1, new_argv);

    for (i = 0;i

    {

    / * make room for '\0' at end, too * /

    new_argv [i]= (char* ) malloc(strlen(argv[i]) + l);

    strcpy(new_argv[i], argv[i]);

    printf ("allocated %d bytes for new_argv[%d] at %P",

    "copied\"%s\"\n",

    strlen(argv[i]) + l, i, new_argv[i], new_argv[i]) ;

    }

    new_ argv [argc] = NULL:

    for (i = 0;i

    free(new_argv[i]);

    printf ("freed new_argv[%d] at %P\n" , i, new_argv[i]) ;

    argv[i]=NULL;

    }

    free(new_argv);

    printf("freed new_argv itself at %P\n",new_argv);

    return 0;

    }

    注意:为什么例7.5在释放了new_argv数组中的每个元素之后,还要将这些元素赋值为NULL呢?这是一种在长期实践的基础上形成的习惯。在释放了

    一个指针之后,你就无法再使用它原来所指向的数据了,或者说,该指针被“悬挂”起来了,它不再指向任何有用的数据。如果在释放一个指针之后立即将它赋值为

    NULL,那么,即使程序再次使用该指针,程序也不会出错。当然,程序可能会间接引用这个空指针,但这种错误在调试程序时就能及时被发现。此外,

    程序中可能仍然有一些该指针原来的拷贝,它们仍然指向已被释放的那部分内存空间,这种情况在C程序中是很自然的。总之,尽管上述这种习惯并不能解决所有问题,但确实有作用。

    《C语言编程要点》

    展开全文
  • Java动态调整数组大小

    万次阅读 2016-09-21 10:43:39
    在Java中,数组一旦创建,其大小是无法改变的。因此,我们可以更改数组的实现,动态调整数组大小,使得既能保存所有元素,又不至于浪费空间。实际上,完成这个很简单:private void resize(int max){ //将大小为N...

    在Java中,数组一旦创建,其大小是无法改变的。因此,我们可以更改数组的实现,动态调整数组的大小,使得既能保存所有元素,又不至于浪费空间。实际上,完成这个很简单:

    private void resize(int max){
        //将大小为N<MAX的栈移动到大小为MAX的数组中
        Item[] temp = (Item[])new Object[max];
        for(int i = 0;i < N;i++){
            temp[i] = a[i];
        }
        a = temp;
    }

    例如其在push中的应用,就可以动态的调节数组大小:

    public void push(Item item){
        if(N==a.length) resize(2*a.length);
        a[N++] = item;
    }

    在pop中的应用:

    public Item pop(){
        Item item = a[--N];
        a[N] = null;
        if(N>0 && N==a.length/4) resize(a.length/2);
        return item;
    }
    展开全文
  • 动态调整数组大小

    千次阅读 2018-03-15 21:47:15
    我们在使用数组时,如果设置长了,短了都不太合适,甚至还需要在运行时... //假设此时需要改变这个数组大小。 //1.可以设置一个新的数组存放它的数据 ,长度增加为你想要的。 int [] b = new int[6]; b[5] =...
  • 今天发现,进行增加,删除,插入(理解为改变数组大小),不去进行改变指针指向的内存长度是会报内存错误的 定义的一个动态数组类,有一个数组长度:m_nSize,有一个指针:*m_pData #if !defined _DYNAMICARRAY_H_...
  • 在Java中,数组创建成功以后,其大小(??? )(能/不能)改变答: 不能新民主主义革命最基本的动力是()。答:中国无产阶级病人,男性,36岁。尿蛋白(++++),全身水肿1个月,测血压165/100mmHg。入院后诊断为肾病综合征。引起...
  • C++改变一个一维数组长度

    千次阅读 2019-09-22 19:34:35
    动态数组,只能赋给动态数组, T* & arr 指针引用 不一定就是往大了改,还有可能往小的改变,取新旧长度的最小值,来确定复制的数量 新的长度需要判断是否大于0 #include <iostream> #include <...
  • JavaScript中的数组长度是可变的,可用赋值运算符改变数组大小,如果改变之后的数组的长度比原数组大,则新数组会在末尾补充相应数量的空位,空位上的数组元素的值是undefined;如果改变之后的数组的长度比原数组小...
  • C语言中,数组长度必须在创建数组时指定,并且只能是一个常数,不能是变量。一旦定义了一个数组,系统将为它分配一个固定大小的空间,以后不能改变,称为...而动态数组则不然,它可以随程序需要而重新指定大小。动态...
  • 一、C++内置数组数组大小固定,速度较快通用格式是:数据类型 数组名[ 数组大小 ];如 int a[40];//一维数组 int a[5][10];//二维数组二、vector创建数组包含多种通用算法长度可变,使用灵活,但效率稍低vector是...
  • 调整数组大小 选择用数组表示栈内容意味着用例必须预先估计栈的最大容量。在 Java 中,栈一旦创建,其大小是无法改变的,因此栈使用的空间只能是这个最大容量的一部分。选择大容量的用例在栈为空或几乎为空时会浪费...
  • 给定一个长度为 n 的整数数组,你的任务是判断在最多改变 1 个元 素的情况下,该数组能否变成一个非递减数列。非递减数列定义如下:对 于数组中所有的 i (1 ),满足 array[i] [i + 1]
  • 向量(Vector)是一个封装了动态大小数组的顺序容器。 向量是一个能够存放任意类型的动态数组。 C++ 中 Vector 的使用 头文件 #include 需要使用 std 命名空间 using namespace std; 以下使用方法以 int 数据...
  • 1、创建任意长度(int)的数组; 2、数组各元素默认初始化为 “-1”; 3、重载了“=”,可以数组赋值给数组,原数组长度小,自动增加长度,原数组长度大,则只将原数组对应长度内的值替换; 4、重载了“[]",...
  • 首先: int[]s=new int[10]; s=new int[20]; 这段代码是对的!...为什么说数组大小在创建之后不能改变呢,意思就是创建了一个内存大小为20空间的后不能在这个基础上扩展大小,只能另开辟空间。 ...
  • java 数组定义方法

    2021-11-28 18:27:47
    2、数组在定义的时候必须指定大小,而且大小是不可以改变的 3、从数组中获取数组元素的时候,需要使用下标来获取,下标从0开始 4、数据是有序集合,这个有序指的不是大小的排序,指的是插入的顺序 使用: 1、...
  • 数组在java中的扩容方法

    千次阅读 2021-03-21 09:29:29
    在使用数组的时候,因为大小的限制,难免会出现不够用的现象。直接给数据对象扩容是不可行的,这时候就需要我们找寻一些其他的方法。本篇先为大家简单分析扩...(2)利用数组复制方法可以变通的实现数组扩容。(3)Syste...
  • 考虑题目一中的三种方法,只有方法二没有改变原有数组,所以方法二放到题目二同样的适用;但是我们可以把HashMap替换成数组实现。可以想想为什么题目一不适合使用题目中的方法一,题目二中的方法一与题目一中的方法...
  • 十分详细的C语言实现动态数组分析
  • Cpp数组

    千次阅读 2019-01-18 18:51:29
    与 vector 类型相似,数组可以保存某种类型的一组对象;而它们的区别在于,数组的长度是固定的。数组一经创建,就不允许添加新的元素。指针则可以像迭代器一样用于遍历和检查数组中的元素。设计良好的程序只有在...
  • 目录 数组 如何创建数组 访问和使用数组 ...数组大小可以动态调整。 3.数组的length属性:可读可写,可以通过设置length的值从数组的末尾移除项或向数组中添加新项 如何创建数组 数组字面量 var ...
  • 数组大小是动态变化的,当新增项时或移除项时可以动态的改变大小来容纳当前数据项 在JavaScript中创建数组 在JavaScript中创建数组有两种方式: 其一:调用数组的构造函数 var a = new Array(3);//创建一个长度为3...
  • 新分配在堆内的内存,数组定义之后不能改变大小,realloc(p,sizeof(p)+sizeof(int))函数不会改变p的值,新的内存地址是函数的返回值: int a[4], *p=a; int *q=(int *)realloc(p,sizeof(p)+sizeof(int));//注意:...
  • 数组一旦被创建,它的大小就是不可改变的。 元素必须是相同类型,不允许出现混合类型。 数组中的元素可以是任何数据类型,包括基本类型和引用类型。 数组变量属于引用类型,数组可以看成是对象,数组中的每个元素...
  • 数组

    2022-04-10 09:54:21
    其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。 数组声明创建 语法: dataType[] arrayname = new dataType[arraySzie]; 数组的默认值为0。 示例: ① ② 数组...
  • Java日报 部门:**大数据开发六部 姓名:cqmfx(阡陌飞絮) 日期:2020.10.25 备注:部分转自百度,CSDN,菜鸟,侵权删 大纲 一、数组介绍 二、排序 数组那些事
  • JavaScript数组详解

    2021-09-20 20:56:01
    JavaScript数组详解
  • 数组一旦被创建,它的大小就是不可以改变的。 其元素必须是相同类型,不允许出现混合类型。 数组中的元素可以是任何数据类型,包括基本类型和引用类型。 数组变量属引用类型,数组可以看成是对象,数组中的每个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 158,070
精华内容 63,228
关键字:

数组大小可以任意改变

友情链接: 814code_asm.rar