请教:该类编译后运行的输出是什么,为什么会有这样的结果???

iloveyouonlyonce 2001-07-20 10:03:35
public class SizeOfAndStringPool {
public static void main(String[] args) throws Exception {
long m0, m1, m2, m3, m4, m5;
String s1, s2, s3, s4, s5;

Runtime rt = Runtime.getRuntime();
rt.gc();

m0 = rt.freeMemory();

// Very long string
s1 = "a";
m1 = rt.freeMemory();

s2 = s1; // no new obj created
m2 = rt.freeMemory();

// add an even longer one, 2 new objs created
s3 = s2 + "a";
m3 = rt.freeMemory();

s4 = s3; // no new obj created
m4 = rt.freeMemory();

// Assign the same string of s1 to s5
// since string pooling, no new obj created
s5 = "a";
m5 = rt.freeMemory();

// The results are in the reasonable error range
// since new String obj has mem-overhead too
System.out.println("s1 took " + (m0-m1) + " bytes."); // 2456
System.out.println("s2 took " + (m1-m2) + " bytes."); // 0
System.out.println("s3 took " + (m2-m3) + " bytes."); // 4408
System.out.println("s4 took " + (m3-m4) + " bytes."); // 0
System.out.println("s5 took " + (m4-m5) + " bytes."); // 0
}
}
...全文
94 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhuzhichao 2001-07-20
  • 打赏
  • 举报
回复
可能memory不一樣.
iloveyouonlyonce 2001-07-20
  • 打赏
  • 举报
回复
在我机器上却是这个结果:
s1 took 0 bytes.

s2 took 0 bytes.

s3 took 416 bytes.

s4 took 0 bytes.

s5 took 0 bytes.

为什么呢~~~
zhuzhichao 2001-07-20
  • 打赏
  • 举报
回复
s1 took 1376 bytes.

s2 took 0 bytes.

s3 took 0 bytes.

s4 took 0 bytes.

s5 took 0 bytes.

I_am_me 2001-07-20
  • 打赏
  • 举报
回复
s1 = "a"; 只是将"a"的句柄付与s1,s2 = s1之类也是一样。
只有s3 = s2 + "a";这样的右值是表达式的才会分配内存给结果。
对象赋值实际上只是句柄的赋值

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧