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的话不用太注重。我不是很赞同,大家的看法是什么啊?
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的话不用太注重。我不是很赞同,大家的看法是什么啊?
"="重载了valueof方法: public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
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() {}
}
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的时候,可以不用创建空间了,减少消耗。
据我所知,内存好像被分成四个区,heap,stack,data segment,还有一个什么来着,都分别放些什么啊?4楼你的意思是100不是放在堆内存还是怎么啊?
求解释,谢谢!
100是放在cache数组里的,而这个数组是放在堆中的
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)
我现在看完了基础语法啦,是不是应该搞个小项目做做,还是要学点其他的什么,不知道swt要不要学啊?
方法放在code segment?