黑马程序员技术交流社区

标题: 关于数组长度的问题 [打印本页]

作者: 胡帅冰    时间: 2013-3-19 16:35
标题: 关于数组长度的问题
本帖最后由 胡帅冰 于 2013-3-19 21:07 编辑

    数组在定义的时候是需要定义数组长度的,能不能在定义的时候动态的定义数组的长度?在以后使用的时候,增加数组的长度或者缩减数组的长度??
作者: 高境    时间: 2013-3-19 16:45
这是不能的,数组一被定义,那么他在堆内存中就产生一个实体,这个数组的长度就是固定的。数组时存储同一类型元素的容器。等你学到集合,就会知道集合的长度是可以变化的,而且集合存储的是对象~~
作者: Alex shaw    时间: 2013-3-19 16:54
char [] c = new char;
你的意思是不是向上面那样,数组的长度i由方法传入或者其他,你可以在方法上指定数组长度然后传给上面的表达式 如下
  1.         public void testArray(int i)
  2.         {
  3.                 char[] c = new char[i];
  4.         }
复制代码
但是如果你说的是定义一个长度为a的数组,然后再下面的操作中有变成长度为b 那就不行了
作者: 杨剑    时间: 2013-3-19 17:07
这个是不行的,数组一旦被定义,或者说是被初始化,在长度在内存中就已经被固定了,而且只能存储一种类型的数据,如果添加数据太多,长度不够用,一般可以进行扩容,但是我说的扩容指的是把原来的数组中的数据拷贝到新的数组里面,原来的数组还在内存中的;新的数组长度要比原来的数组长度要大,然后增加新的数据,集合里面ArrayList底层用的是数组数据结构,如果长度不够用就重新创建个数组,长度比原来的大,把原来数组中的数据复制到新数组当中,并把新数组的引用赋给集合的引用变量。
作者: 顾传文    时间: 2013-3-19 17:10
         数组的长度是不能动态变化的,可以先定义集合,然后转换为数组。
Collection
变成数组(toArray()toArray(T[] a)
A.        为什么要将Collection集合变成数组呢?
为了限定对集合的操作,不需要对集合进行增删操作。
B.        指定类型的数组到底定义多长呢?
当指定类型的数组长度小于集合的size,那么该方法内部会重新创建一个数组,新创建的数组长度为集合的size。这样一来,原先传递进来的数组就无效,会浪费内存。
当指定类型的数组长度大于利集合的size,就不会重新创建数组,而是使用传递进来的数组。
综上两点,创建一个与集合的size一样长的数组最优。
import java.util.*;
public class Test {
    public static void main(String[] args) {
        Collection<String> collection = new ArrayList<String>();
        collection.add("aaa");
        collection.add("bbb");
        collection.add("ccc");
        /*
         * 传递进toArray方法的数组长度为1,小于Collection的size。
         * toArray方法内部重新创建了一个数组。
         */
        String[] arr1 = collection.toArray(new String[1]);
        System.out.println("arr1="+Arrays.asList(arr1));
        String[] arr2 = collection.toArray(new String[5]);
        System.out.println("arr2="+Arrays.asList(arr2));
        
    }
}
打印结果:
arr1=[aaa, bbb, ccc]
arr2=[aaa, bbb, ccc, null, null]

作者: MyNameIs520    时间: 2013-3-19 17:11
楼主是想根据程序的需要创建一个最合适的数组,既能满足存储的需求,又能最优化性能吧?
其实ArrayList就是一个长度自动变化的数组~~楼主可以考虑使用这个替代数组
作者: 沉默de羔羊    时间: 2013-3-19 17:14
在定义的时候不能动态的定义数组长度,一旦定义了数组长度,就已经在分配了对应大小的内存区域,已经固定了,就没办法修改。

根据你的需求,你可以考虑这样处理:

int[] _array=null; 这里先定义。

然后通过:
int total=XXXX;  ---这里可以动态到数据库获取数值。
_array=new int[total];--- new一个内存空间!






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2