帮忙看下这段代码~~

JavaLanguage2009 2009-08-15 11:00:48
http://blog.csdn.net/KingWolfOfSky/archive/2009/08/13/4444231.aspx
这篇博客里面讲了些关于Java细节方面的内容,它给了下面段代码,对输出还是不理解,麻烦各位大虾给解释下~~

1. public static void main(String args[])
2. {
3. Integer i1=new Integer(13);
4. Integer i2=new Integer(13);
5. int i3=13;
6. System.out.println(i1==i2);
7. System.out.println(i2==i3);
8. System.out.println(i3==i1);
9. }
10. * Output
11. * true
12. * false
13. * true
14. */


还有他说了自动包装时对于从–128到127之间的值,它们被包装为Integer对象后,会存在内存中被重用,而其它的值,被包装后的Integer对象并不会被重用,即相当于每次包装时都新建一个Integer对象。
这是为什么?
小弟新人,先谢谢各位了~~
...全文
332 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
pppddtt 2009-08-16
  • 打赏
  • 举报
回复
我记得我的运行结果页跟楼主不一样,false,true,true
samihyypia 2009-08-16
  • 打赏
  • 举报
回复

public static void main(String args[]) {
Integer i1 = new Integer(123);
int i = 123;
Integer i2 = 123;
System.out.println(i == i1); //true
System.out.println(i == i2); //true
System.out.println(i1 == i2); //false
}

由这个结果可以看出来int和Integer比较的话是比较两者的int值
而两个Integer对象互相比较的是两者的引用是否一样
lee90649 2009-08-16
  • 打赏
  • 举报
回复
学习了!~
Monkey_D_Luffy 2009-08-16
  • 打赏
  • 举报
回复
原来是答案错了
Tomzzu 2009-08-16
  • 打赏
  • 举报
回复
受教了, 帮顶
hahawowulei 2009-08-16
  • 打赏
  • 举报
回复
false
true
true
==================
Integer i1=new Integer(13);是new了个integer,在堆中生成
Integer i2=new Integer(13);也是new了个integer,同上,因此i1!=i2;
int i3=13; 是从池中取的,自动封装
GGMMYQL 2009-08-16
  • 打赏
  • 举报
回复
jdk 1.4 之前没有对-128-127做缓存,之后都做为缓存。。
呵呵
好吃的松子 2009-08-16
  • 打赏
  • 举报
回复
学习了!
wzju64676266 2009-08-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 bigbug9002 的回复:]
值在–128到127之间的Integer在常量池中放着,你新new的Integer的值只要在–128到127之间之间,实际上是不新建对象的,而是直接从常量池中取,所以无论你new Integer(20)多少次,他们的引用都是相同的。

i1==i2 //两个引用相同。
i2==i3 //这个会把i3自动包装为Integer,由于i3是变量,所以会在堆中建新的对象。 
i3==i1 //这个会把i1自动解包为int。

上面两式说明,自动包装和解包是以运算符左边的操作数的类型为主的。
[/Quote]

你是不是搞错了,所以无论你new Integer(20)多少次,他们的引用都是相同的,这句话对吗?new 永远是新创建的,

改成Integer i=20;或者是Integer i=Integer.valueOf(20);这样才是你说的那个直接从常量池中取
loveofmylife 2009-08-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 bigbug9002 的回复:]
看来用new 是会在堆中建新对象的.

用Integer i1=13;时用调用Integer valueOf(13)这时用的是常量池中的对象.
[/Quote]
Integer i1=new Integer(13); 使用new就是重新创建了对象,而不是在池中拿
Integer i1=3;和Integer i1=Integer.valueOf(3);这两条语句是一样的,这是自动封箱
Int a=i1;和int a=i1.intValue()一样;这是自动解封。
longq121 2009-08-16
  • 打赏
  • 举报
回复
public static void main(String args[])
2. {
3. Integer i1=new Integer(13);
4. Integer i2=new Integer(13);
5. int i3=13;
6. System.out.println(i1.intValue()==i2.intValue());
7. System.out.println(i2==i3);
8. System.out.println(i3==i1);
9. }
10. * Output
11. * true
12. * true
13. * true
yangxing1209 2009-08-16
  • 打赏
  • 举报
回复
这种基础的东西应该自己去体会,先读程序,估计大概要做什么,再运行程序,看看人的猜测是不是对了,然后分析运行结果,你可以一句一句的对照结果理解。不用问人的!
bigbug9002 2009-08-16
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 wzju64676266 的回复:]
引用 5 楼 bigbug9002 的回复:
值在–128到127之间的Integer在常量池中放着,你新new的Integer的值只要在–128到127之间之间,实际上是不新建对象的,而是直接从常量池中取,所以无论你new Integer(20)多少次,他们的引用都是相同的。

i1==i2 //两个引用相同。
i2==i3 //这个会把i3自动包装为Integer,由于i3是变量,所以会在堆中建新的对象。 
i3==i1 //这个会把i1自动解包为int。

上面两式说明,自动包装和解包是以运算符左边的操作数的类型为主的。


你是不是搞错了,所以无论你new Integer(20)多少次,他们的引用都是相同的,这句话对吗?new 永远是新创建的,

改成Integer i=20;或者是Integer i=Integer.valueOf(20);这样才是你说的那个直接从常量池中取
[/Quote]

是的,我错了!!
chenchengamao 2009-08-15
  • 打赏
  • 举报
回复
给你举个例子吧:

public class MyJava{
public static void main(String[] args){
make(3,3); //调用后打印结果为true
make(500,500); //调用后打印结果为false
make(3,new Integer(3)); //调用后打印结果为false
make(new Integer(3),new Integer(3)); //调用后打印结果为false
}
public static void make(Integer a,Integer b){
System.out.println(a==b);
}
}
chenchengamao 2009-08-15
  • 打赏
  • 举报
回复
听我说,其实是这样的:


首先:运行结果不是true false true,而是false true true。


原因:由于包装类的对象是不可变的,所以两个拥有相同类型相同值的数可以使用同一个包装类对象,因此在这种情况下,在Java实现中这两个数自动装箱所使用的包装类对象是同一个包装类对象。但是这两个数必须满足以下条件:


数的类型 数的值域
boolean true与false
byte 所有值
char \u0000~\u00ff
short -128~127
int -128~127



就这些,SUN的官方资料。
java1109 2009-08-15
  • 打赏
  • 举报
回复

public static void main(String args[]) {
Integer i1 = new Integer(1123);
int i = 1123;
Integer i2 = 1123;
System.out.println(i == i1); //true
System.out.println(i == i2); //true
System.out.println(i1 == i2); //false
}
wzju64676266 2009-08-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bigbug9002 的回复:]
引用 3 楼 knightzhuwei 的回复:
我运行的结果是
false
true
true


我怎么也是?
[/Quote]
对我,答案怎么这样的?
java1109 2009-08-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 knightzhuwei 的回复:]
我运行的结果是
false
true
true
[/Quote]
我也是
楼主那段代码
System.out.println(i2==i3);
System.out.println(i3==i1);
用int类型的i3和Integer的变量来比较,这时候的==应该是直接比较两者的int值
public static void main(String args[]) {
Integer i1 = new Integer(1123);
int i = 1123;
System.out.println(i == i1); //true
}
懒人的愿望 2009-08-15
  • 打赏
  • 举报
回复
楼主那段代码,输出应该是
false//new出来的对象都是新的对象,==比较两个对象是比较地址值,两个不同对象的地址是不可能相同的
true//应该是比较值吧
true
knightzhuwei 2009-08-15
  • 打赏
  • 举报
回复
我终于明白了 是那博客作者笔误了 他已经指出“对于Integer i = new Integer (int);的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。” 却在程序输出里写错了
加载更多回复(8)

62,614

社区成员

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

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