哎~~~自己去跑下这代码吧 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(); }
} }
List只是个接口,而ArrayList要实现这个接口,应该它占用的内存要大
ArrayList list = new ArrayList(); List list = new ArrayList(); 这两个语句只是生成了两个对象,引用的是原jvm的内存空间,只有当你给这两个对象分配指向的位置时,才会对内存空间有影响,如list.add("test"); 这时才会对内存有影响
对,如果不执行add操作他们占用的内存空间是一样的
呵呵,确实有差距的,原因在于接口实现上。ArrayList实现了List接口, 但是如果使用List list = new ArrayList();的话,虚拟机只会创造一 个在仅拥有List中声明过的方法的实例,而ArrayList list = new ArrayList(); 创造的实例还会拥有在ArrayList中的扩展方法和字段,两者占用内存自然 不同了,呵呵
List list = new ArrayList()相当于List list=(List)new ArrayList();
只是转了一下型
ArrayList list = new ArrayList();
List list = new ArrayList();
这两条语句开辟的内存空间,取决于ArrayList的构造方法,而不是类型声明。
ArrayList是它的实现类,是一个用数组实现的List.
为什么内存不一样?你是怎么知道的?我也想知道。
Runtime.freeMemory()这样也行?你知道运行Runtime.freeMemory()这条语句占用了多少内存么?
然后你怎么计算呢?
汗,你要是用这个方法来判断两个大型应用占用的内存还可以,用他来比较这么细微的东西,不可能得到正确的结果的。更何况就算你啥也不干,内存也是随时在变化的,JVM本身就跑了很多东西。
反正是来上面俩个语句都加上这个语句,所以它所占的内存在两个语句中是一样的,可以不要管的。
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();
}
}
}
List list = new ArrayList(); 这两个语句只是生成了两个对象,引用的是原jvm的内存空间,只有当你给这两个对象分配指向的位置时,才会对内存空间有影响,如list.add("test");
这时才会对内存有影响
对,如果不执行add操作他们占用的内存空间是一样的
但是如果使用List list = new ArrayList();的话,虚拟机只会创造一
个在仅拥有List中声明过的方法的实例,而ArrayList list = new ArrayList();
创造的实例还会拥有在ArrayList中的扩展方法和字段,两者占用内存自然
不同了,呵呵
你得到freeMemory只能说明你程序不同,毕竟变量类型不同都回导致占用内存不用是正常的。
而对于大规模数据量的时候,这种类型的不同导致的内存消耗不同是可以忽略不计的。你不信可以都放入10万个1K的String尝试一下。注意每次都要new String(),否则没有效果。
那么子类独有的方法和属性包括静态方法和属性,在多态是有可见与否的具体情况而定.那么2种情况下的初始化是不是一样的,不知道啊?
期待高人给出实证.至于楼上用RunTime这个我觉得不可取啊,先执行和后执行有分别,而且GC的实际回收还有特定的时间周期.
再者2者的内存区分本身细微,我觉得数据不可靠啊......
主要看一下,向上转型时可能产生的接口缩小。无论子类如何扩
展,用基类使用时,不可能比基类大。