"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等类是引用传递,而自定义类则要看构造函数怎么定义。。。“
上面是我的总结,请指正
好神奇,算不算bug呢
sun的编译器是这样处理的:
Integer i=Integer.valueOf(3);
而不是通过new来创建了,因为Integer类中静态的创建了-128~+127之间的对象,需要的数在这个范围之内时,直接返回,此范围之外的数才通过new来创建.
@wkl7123: 长知识了
正解
好多年没有接触java了,记得以前看过原因如下:
Java将int型的数据放入collection时会发生装箱操作,这个效率很低。为了优化这一过程,JVM默认缓存了-128 -- 127 之间的所有的Integer(估计因为JVM认为这个区间的数字使用很频繁,并且不会占用多大内存)。
由于系统缓存,这个区间的数字不会发生装箱操作,同一个值的引用都会指向同一个对象,在这个区间外的赋值操作会重新分配内存。从而出现了你说的这个现象。
至于字符串,也有一个驻留机制的,具体你可以查询一下String.intern函数。
string和Integer不一样的好吧,首先 String 不属于 8 种基本数据类型,String 是一个对象。 因为对象的默认值是 null,所以 String 的默认值也是 null,但它又是一种特殊的对象,有其它对象没有的一些特性。Integer 类在对象中包装了一个基本类型 int 的值。Integer 类型的对象包含一个 int 类型的字段。