一段简单的代码

孤鸿掠影 2011-03-23 11:01:48
public class TestDengHao {
public static void main(String[] args) {
Integer a = 100;
Integer b = 100;
Integer c = 200;
Integer d = 200;
System.out.println(a == b);
System.out.println(c == d);
}
}


大家看一下这道题,这些100,200在内存中是怎么分配的。

有种说法是搞c/c++的话很注重内存分析,搞java的话不用太注重。我不是很赞同,大家的看法是什么啊?
...全文
235 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ganymede 2011-03-24
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 guhonglueying 的回复:]

引用 12 楼 suntingtingonly 的回复:
常量都放在常量池 看下 深入JAVA 虚拟机


我现在看完了基础语法啦,是不是应该搞个小项目做做,还是要学点其他的什么,不知道swt要不要学啊?
[/Quote]
前些日子刚干完SWT,看你有没有兴趣了呵呵
孤鸿掠影 2011-03-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jamesliulyc 的回复:]
常量都放在常量池
[/Quote]

方法放在code segment?
Ganymede 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 guhonglueying 的回复:]

引用 4 楼 followme_1987 的回复:
Integer有自动缓存的机制,这点有点类似String常量池。if(i >= -128 &amp;amp;&amp;amp; i <= IntegerCache.high)
return IntegerCache.cache[i + 128] 也就是说当数在-128 到 127之间的时候 返回的是cache数组,而这个数组……
[/Quote]
Code segment 代码区,编译后的代码Data segment 用来放静态变量和常量Stack 叫栈:用来存放局部变量Heap叫堆:用来动态生成内存的如成员变量 。我们微机接口与组成原理讲的。
100是放在cache数组里的,而这个数组是放在堆中的
Ganymede 2011-03-23
  • 打赏
  • 举报
回复
另外针对楼主 有种说法是搞c/c++的话很注重内存分析,搞java的话不用太注重。我不是很赞同,大家的看法是什么啊?

我觉得还是要看你用JAVA做什么。大部分人用JAVA基本上做做网页,做做XXX系统,很少跟内存打交道。写底层代码基本上用C或者汇编。原先用汇编的时候,想不跟内存打交道都不行。但是JAVA作为一门高级语言,一门面向对象语言,应该不像C那样面向底层编写代码,况且C里面有指针,说实在的它也必须要为内存分配动动脑子。而JAVA没有指针的概念,对于程序员来讲,应该是更加方便了。当然有些人特别喜欢研究内存问题,挺好的,因为欧洲的潮流是越底层越接近机器硬件,越有前途。
孤鸿掠影 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 followme_1987 的回复:]
Integer有自动缓存的机制,这点有点类似String常量池。if(i >= -128 &amp;&amp; i <= IntegerCache.high)
return IntegerCache.cache[i + 128] 也就是说当数在-128 到 127之间的时候 返回的是cache数组,而这个数组应该是static,所有有多个Integer,它们返回的数组对象只有一个……
[/Quote]

据我所知,内存好像被分成四个区,heap,stack,data segment,还有一个什么来着,都分别放些什么啊?4楼你的意思是100不是放在堆内存还是怎么啊?
求解释,谢谢!
Ganymede 2011-03-23
  • 打赏
  • 举报
回复
Integer有自动缓存的机制,这点有点类似String常量池。if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128] 也就是说当数在-128 到 127之间的时候 返回的是cache数组,而这个数组应该是static,所有有多个Integer,它们返回的数组对象只有一个,也就是说地址是相同的,所以System.out.println(a == b);应该是true.相反当你的数是200的时候,也就是说大于127了,那么将会在堆中开辟新的Integer空间 所以System.out.println(c == d); 为false。 JVM这样做就是为了当有大量数值小于127大于-128的时候,可以不用创建空间了,减少消耗。
孤鸿掠影 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 suntingtingonly 的回复:]
常量都放在常量池 看下 深入JAVA 虚拟机
[/Quote]

我现在看完了基础语法啦,是不是应该搞个小项目做做,还是要学点其他的什么,不知道swt要不要学啊?
孤鸿掠影 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xjfxlj 的回复:]
当值再-128~127之间时,被装箱成Integer对象后,会存在内存里被重用,这时用"=="比较的时候,a和b是参考到同一个对象上的.Integer a = 100时,编译器将其转换为:Integer a = Integer.valueOf(100);

Java code
public static Integer valueOf(int i) {
if(i >……
[/Quote]


谢谢、
eXeSP 2011-03-23
  • 打赏
  • 举报
回复
那看看这个,这是Integer类内的一个静态内部类:


private static class IntegerCache {
static final int high;
static final Integer cache[];

static {
final int low = -128;

// high value may be configured by property
int h = 127;
if (integerCacheHighPropValue != null) {
// Use Long.decode here to avoid invoking methods that
// require Integer's autoboxing cache to be initialized
int i = Long.decode(integerCacheHighPropValue).intValue();
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - -low);
}
high = h;

cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
}

private IntegerCache() {}
}


孤鸿掠影 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 exesp 的回复:]
内存分析,咱不太懂,源代码还能看一点。
"="重载了valueof方法:

Java code

public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128……
[/Quote]

#1楼的好像有点意思,不过为什么128以上的和128一下的数经过自动打包以后会有差别?我想知道这个差别在内部是怎么样形成。
eXeSP 2011-03-23
  • 打赏
  • 举报
回复
内存分析,咱不太懂,源代码还能看一点。
"="重载了valueof方法:

public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}




suntingtingonly 2011-03-23
  • 打赏
  • 举报
回复
常量都放在常量池 看下 深入JAVA 虚拟机
xjfxlj 2011-03-23
  • 打赏
  • 举报
回复
当值再-128~127之间时,被装箱成Integer对象后,会存在内存里被重用,这时用"=="比较的时候,a和b是参考到同一个对象上的.Integer a = 100时,编译器将其转换为:Integer a = Integer.valueOf(100);
    public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}

/**
* The value of the <code>Integer</code>.
*
* @serial
*/


当超过范围时,"=="比较的是两个对象,所以结果是FALSE.要改成c.equals(d)
caicheng_119 2011-03-23
  • 打赏
  • 举报
回复
不清楚、不明白、不了解、不知道
JamesLiu 2011-03-23
  • 打赏
  • 举报
回复
常量都放在常量池
孤鸿掠影 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 exesp 的回复:]
那看看这个,这是Integer类内的一个静态内部类:

Java code


private static class IntegerCache {
static final int high;
static final Integer cache[];

static {
final int l……
[/Quote]

谢谢。

62,614

社区成员

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

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