ArrayList list = new ArrayList();
List list = new ArrayList();
这2行都是创建的ArrayList的对象,为什么占用的内存却不同

解决方案 »

  1.   

    都是ArrayList对象,怎么知道的?
      

  2.   

    用Runtime类测试啊,获得虚拟机所占用的内存,就可以知道了啊,我也知道 虽然都是ArrayList对象,但是引用类型不同的话 所占的内存确实不同啊
      

  3.   

    List是ArrayList的基类
    List list = new ArrayList()相当于List list=(List)new ArrayList();
    只是转了一下型
      

  4.   

    占用的内存不会不一样的。
    ArrayList list = new ArrayList();
    List list = new ArrayList(); 
    这两条语句开辟的内存空间,取决于ArrayList的构造方法,而不是类型声明。
      

  5.   

    List是接口,List特性就是有序,会确保以一定的顺序保存元素.
    ArrayList是它的实现类,是一个用数组实现的List.
    为什么内存不一样?你是怎么知道的?我也想知道。
      

  6.   

    6楼说的我知道 我也不是JAVA新手 Runtime.freeMemory()就能够获得JVM的空余内存
      

  7.   

    嘿嘿!!
    Runtime.freeMemory()这样也行?你知道运行Runtime.freeMemory()这条语句占用了多少内存么?
    然后你怎么计算呢?
      

  8.   


    汗,你要是用这个方法来判断两个大型应用占用的内存还可以,用他来比较这么细微的东西,不可能得到正确的结果的。更何况就算你啥也不干,内存也是随时在变化的,JVM本身就跑了很多东西。
      

  9.   

    我晕,我以为真的有什么语句能知道一个 Java 对象占的内存大小呢?
      

  10.   

    不用关心Runtime.freeMemory()这个语句占用的内存吧
    反正是来上面俩个语句都加上这个语句,所以它所占的内存在两个语句中是一样的,可以不要管的。
      

  11.   

    哎~~~自己去跑下这代码吧
    import java.util.*;
    public class RuntimeTest
    {
    public static void main(String[] args)
    {

    try
    {
    Runtime r  = Runtime.getRuntime();
    System.out.println(r.freeMemory());
    List list = new ArrayList();
    //ArrayList list = new ArrayList();
    list.add(10);
    System.out.println(r.freeMemory());
    //System.out.println(list.size());
    }
    catch (Exception e)
    {
    e.printStackTrace();
    }

    }
    }
      

  12.   

    List只是个接口,而ArrayList要实现这个接口,应该它占用的内存要大 
      

  13.   

    ArrayList list = new ArrayList();
    List list = new ArrayList(); 这两个语句只是生成了两个对象,引用的是原jvm的内存空间,只有当你给这两个对象分配指向的位置时,才会对内存空间有影响,如list.add("test");
    这时才会对内存有影响
      

  14.   


    对,如果不执行add操作他们占用的内存空间是一样的
      

  15.   

    呵呵,确实有差距的,原因在于接口实现上。ArrayList实现了List接口,
    但是如果使用List list = new ArrayList();的话,虚拟机只会创造一
    个在仅拥有List中声明过的方法的实例,而ArrayList list = new ArrayList(); 
    创造的实例还会拥有在ArrayList中的扩展方法和字段,两者占用内存自然
    不同了,呵呵
      

  16.   

    ... Runtime.freeMemory() 只能得到一个大致的值。因为运行的时候,heap是不断变化的。使用heap不光你main中的部分。
    你得到freeMemory只能说明你程序不同,毕竟变量类型不同都回导致占用内存不用是正常的。
    而对于大规模数据量的时候,这种类型的不同导致的内存消耗不同是可以忽略不计的。你不信可以都放入10万个1K的String尝试一下。注意每次都要new String(),否则没有效果。
      

  17.   

    呵呵,这个问题回答要有依据啊...我不明白的是,如果用子类引用子类自身实例化,和用父类引用子类实例,
    那么子类独有的方法和属性包括静态方法和属性,在多态是有可见与否的具体情况而定.那么2种情况下的初始化是不是一样的,不知道啊?
     
    期待高人给出实证.至于楼上用RunTime这个我觉得不可取啊,先执行和后执行有分别,而且GC的实际回收还有特定的时间周期.
    再者2者的内存区分本身细微,我觉得数据不可靠啊......
      

  18.   

    要是还不明白的话,建议看一下java高级部分的“向上转型”。
    主要看一下,向上转型时可能产生的接口缩小。无论子类如何扩
    展,用基类使用时,不可能比基类大。