对于数组我们不是直接可以取length属性么源于此
public byte[] bytes=new byte[];
Systemoutprintln(byteslength); // 看有length属性
上面的bytes换算过来是
public class Array {
public int length;
public byte byte;
public byte byte;
public byte byte;
}
上面的bytes占用的内存是
+[+ + *] = + []=+=
是 bytes这个引用是Object基占的是length属性占的是个成员占的本来是 但要求是的倍数变成 了总共是
再如
byte[] bytes=new byte[];
的内存占用是:
+[++*]=+[]=;
byte[] bytes=new byte[]; 也是
对于元素是Object的数组Object也是当作其成员(注意只有引用这个数组的空间这个可以推到普通Class上)
Byte[] bytes=new Byte[];
这个 bytes的定义相当于:
public class Array {
public int length;
public Byte byte;
public Byte byte;
}
占用空间是
+[++*]+*= + + = 你自己算吧
推论千万不要用 Byte[] 有倍的差距!你可能一下子没明白过来没关系多琢磨一下对于普通的class来说内容占用就是基加成员的占用Object成员只记引用
public class Abc {
public int n;
public byte b;
public Object obj;
}
它的内容占用是 [+++]=
所以 Abc one=new Abc()的占用是 +=
提醒对于 Abc的成员 obj没有计如果要计入的话循环这个过程就可以了(琢磨一下)
举例
public class Abc {
public byte b;
public Object obj=null;
}
public class Def {
public int n;
public byte b;
public Abc obj=new Abc();
}
问Def one=new Def(); //占多少?
答+[+++]+[++]=++=
public class Abc {
public byte b;
public Object obj=null;
}
public class Def {
public int n;
public byte b;
public Abc[] objs=new Abc[];
{
for(int i=;i<;i++) {
objs[i]=new Abc();
}
}
}
问Def one=new Def(); //占多少?
答kao一下我也算不出来不过我写了程序可以算出来你给它一个Object它就能递归的算出总共占了多少内存这个程序不复杂你也可以写出来我等机会合适了再放出单独说一下StringString的结构是
public class String {
private final char value[];
private final int offset;
private final int count;
private int hash; // Default to
}
所以不考虑那个char[]的占用一个String最少占用 [++++]=bytes 加上引用共bytes 所以
String s=;
占用bytes!!!!! 尽管它的长度为如果精确的算加上引用一个String的占用是
++[++*length]
String s=; 的占用是 +=
String s=ab 的占用是 +=
String s=abc 的占用是 + =
要说的是String是常用的类这么看String耗内存很多所以jvm有优化同样的内容尽量重用所以除了是必须的外那个char[] 很可能一样比方说
String[] s=new String[];
for(int i=;i<;i++) {
s[i]=new String(abcdefasdjflksadjflkasdfj);
}
的占用的数量级是 *那 个字符串本身基本上不占内存只有一份!反正String 至少是 最多也可能是!比较占内存的数据结构这个很重要基本上就是 primitive的包装
实例
我以前用一个
Hashtable的结构有万个元素改为String[]+int[]后内存占用改观不少速度也很快万的String[] 快排一下也就秒多查找用分和hash也差不多少
[] []