首页 新闻 会员 周边 捐助

Java内存是否共用问题

0
悬赏园豆:20 [待解决问题]

"Java:Integer和String是一样的,一但初始化就不能改变它的值,因为Integer里没有类似的set方法."
--------某位网友说道
那么请问,还有哪些类是这样的,一旦初始化后就不能改变值,除非重新new让变量指向另一块内存中的对象.
(声明p1和p2是同一个类的引用:我考虑这个问题是因为当p1和p2指向同一块内存时,我修改p1会不会影响p2. 如果不影响的话,我是不是可以把p1和p2当作两个对象考虑,而Java设计它们指向同一块内存只是出于减少内存使用)

PS: 回答时可以考虑这么个例子。

1 int a=?;
2 Integer p1=a;
3 integer  p2=a;
4 System.out.println(p1==p2);

如果a在 [-128,127] 区间上,那么输出true,否则false

问题补充:

有些乱,我感觉Java的8种基本类型和String类,Integer类虽然有变量共享同一块内存的机制,但实际上它们和C++的值传递(在程序逻辑上)没什么区别。我猜其他7个基本类型的包装类也是这样的。所以现在知道8+8+1种类型(8个基本类型,8个包装类,Stfring类)是完全可以用值传递来理解他们的,而像StringBuffer等类是引用传递,而自定义类则要看构造函数怎么定义。。。

上面是我的总结,请指正

wkl7123的主页 wkl7123 | 初学一级 | 园豆:154
提问于:2013-06-30 15:08
< >
分享
所有回答(3)
0

好神奇,算不算bug呢

angelshelter | 园豆:9914 (大侠五级) | 2013-06-30 16:26

sun的编译器是这样处理的:

Integer i=Integer.valueOf(3);

而不是通过new来创建了,因为Integer类中静态的创建了-128~+127之间的对象,需要的数在这个范围之内时,直接返回,此范围之外的数才通过new来创建.

支持(0) 反对(0) wkl7123 | 园豆:154 (初学一级) | 2013-06-30 18:58

@wkl7123: 长知识了

支持(0) 反对(0) angelshelter | 园豆:9914 (大侠五级) | 2013-06-30 20:43

正解

支持(0) 反对(0) 嗨,你的益达~~~ | 园豆:221 (菜鸟二级) | 2013-07-31 15:02
1

好多年没有接触java了,记得以前看过原因如下:

Java将int型的数据放入collection时会发生装箱操作,这个效率很低。为了优化这一过程,JVM默认缓存了-128 -- 127 之间的所有的Integer(估计因为JVM认为这个区间的数字使用很频繁,并且不会占用多大内存)。

由于系统缓存,这个区间的数字不会发生装箱操作,同一个值的引用都会指向同一个对象,在这个区间外的赋值操作会重新分配内存。从而出现了你说的这个现象。

至于字符串,也有一个驻留机制的,具体你可以查询一下String.intern函数。

天方 | 园豆:5432 (大侠五级) | 2013-06-30 18:57
0

string和Integer不一样的好吧,首先 String 不属于 8 种基本数据类型,String 是一个对象。 因为对象的默认值是 null,所以 String 的默认值也是 null,但它又是一种特殊的对象,有其它对象没有的一些特性。Integer 类在对象中包装了一个基本类型 int 的值。Integer 类型的对象包含一个 int 类型的字段。

若雪封尘 | 园豆:663 (小虾三级) | 2013-07-03 16:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册