LileLTP--程序之路

努力坚持走着这条路,虽然是刚刚起步……

用户操作
[即时聊天] [发私信] [加为好友]
李乐ID:lileltp
46709次访问,排名2377好友0人,关注者0
lileltp的文章
原创 31 篇
翻译 0 篇
转载 14 篇
评论 24 篇
LileLTP的公告
最近要看一下的书
最近评论
everest:我已经把你的博客加入了。
博客名称:everest的博客
网址:http://blog.csdn.net/everest
RSS:http://blog.csdn.net/everest/rss.aspx
everest:我加你了
烟台大苹果:已经加你了
Feng:huh...I love this song so much too......
aaa:哈哈
~~
java 很难的
文章分类
收藏
相册
.net站点收藏
asp.net入门
ASP酷
MSDN中文网站
中国DotNet俱乐部
留言与交换链接
★★★★交换链接★★★
★★★★留言板★★★★
点击直接从这里给我QQ发信息吧
网页平面
W3CHINA
我的平面作品
相册和其他
我的又一根据地
Wallop--也是根据地
我的相册
麻省理工學院開放式課程
友情链接(Blog)
driftingice
Eclipse 详细配置
sosoho's blog
vk的专栏
刘鹏小子的Blog
烟台大苹果(RSS)
猫儿左左
老康(RSS)
英雄会之强强联手
顽小鱼(RSS)
黑驴的路
友情链接(设计类)
123千克设计空间
Howe's blog
站点收藏
1.赛迪网-技术天地
2.ChinaJavaWorld
3.太平洋软件资讯
4.中国Java开发网
5.Java研究组织
6.Java中文站
7.Java爱好者
8.JSP天空
9.CnJsp
a.无忧脚本
b.UMLchina
c.Sun技术社区
d.IBM
e.中国软件开发
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 对象的比较收藏

新一篇: 有什么建议和问题就给我留个言吧! | 旧一篇: 有关构造方法的问题

class A{
  int a=1;
}

public class equalTest{
   public static void main(String[] args) {
    A obj1=new A();
    A obj2=new A();
    String s1,s2,s3="abc",s4="abc";
    s1=new String("abc");
    s2=new String("abc");
    System.out.println("s1=s2?"+(s1.equals(s2)));
    System.out.println("s1=s3?"+(s1==s3));
    System.out.println("s1=s3?"+(s1.equals(s3)));
    System.out.println("s3=s4?"+(s3==s4));
    System.out.println("s2=s3?"+(s2.equals(s3)));
    System.out.println("s2=s4?"+(s2.equals(s4)));
    System.out.println("obj1=obj2?"+(obj1.equals(obj2)));
    System.out.println("s1=s2?"+(s1==s2));
    obj1=obj2;
    System.out.println("obj1=obj2 after obj1=obj2 ?"+(obj1.equals(obj2)));
    System.out.println("obj1=obj2 after obj1=obj2 ?"+(obj1==obj2));
  }
}

结果:

s1=s2?true
s1=s3?false
s1=s3?true
s3=s4?true
s2=s3?true
s2=s4?true
obj1=obj2?false
s1=s2?false
obj1=obj2 after obj1=obj2 ?true
obj1=obj2 after obj1=obj2 ?true

问题:

  1. 书上写到对于同一类的对象,==和equals方法返回值都是false。那么s3.s4是否是同一类的对象呢?如果是,那么灰色标识出来地方结论就不对了。如果不是那又算是什么?
    解答:记住一句话:引用永远放在栈上,而对象永远动态分配在堆上。
      关于==和equals的区别其实深入到技术细节就是栈地址和堆地址的判断。
      学JAVA你要搞清楚什么是简单的数据类型和什么是对象。
      记住,在java中String就是一个类。
      ==和equals的区别:
      ==用来判断引用地址是否相同,即判断是否引用(指针)指向同一个堆中的对象
      而equals是判断对象内的数据是否相同,而不是地址了(不是指针指向的地址)。
      System.out.println("s1=s2?"+(s1.equals(s2)));这个清楚了吧,内容相同为true
        System.out.println("s1=s3?"+(s1==s3));地址不同啊,为false
        System.out.println("s1=s3?"+(s1.equals(s3)));内容相同为true
        System.out.println("s3=s4?"+(s3==s4));这里还是有些问题,那位大哥给我说一下。
        System.out.println("s2=s3?"+(s2.equals(s3)));内容相同为true
        System.out.println("s2=s4?"+(s2.equals(s4)));内容相同为true
        System.out.println("obj1=obj2?"+(obj1.equals(obj2)));obj1引用指向的内容在new后并没有进行赋值,所以为假,即堆中的内容为未知。为false
        System.out.println("s1=s2?"+(s1==s2));指向的栈地址不同啊,为false
        obj1=obj2;是引用赋值,即指针赋值
        System.out.println("obj1=obj2 after obj1=obj2 ?"+(obj1.equals(obj2)));
        System.out.println("obj1=obj2 after obj1=obj2 ?"+(obj1==obj2));
    上面二个全是TRUE,因为引用赋值后,指向的同一个对象,引用指针内容为同。所以为TRUE。
     JAVA是面向对象的东西,之所以还使用栈的东西是为了速度上的考虑,堆中虽然使用灵活,但效率的确是个大问题,编译器还得动态进行内存大小的配置,而栈中虽然不能动态配置大小,但却使用的速度非常快。各有得失。

    最后多谢ghyghost这么详细的答案
  2. 绿色标记出来的地方为什么最后为false,而下面的那个s3=s4的,确为true?
    解答:绿色标记出来的s1和s3是不同的。s1是实例后的字符串是new的关系。开辟了新的内存空间。而s3不是。所以不是直接的==。所以equale的s1.s3是相等的。而后面的s3.s4因为字符串池的关系。其实是指的同一字符串。

发表于 @ 2004年09月03日 20:51:00|评论(loading...)|编辑

新一篇: 有什么建议和问题就给我留个言吧! | 旧一篇: 有关构造方法的问题

评论

#湖北! 发表于2004-09-04 19:34:00  IP: 221.136.176.*
晕!看不懂!
#LileLTP 发表于2004-09-04 19:38:00  IP: 221.204.17.*
^_^。学学就看懂了。
#石晓利  发表于2004-09-11 19:22:00  IP: 218.247.158.*
很想细心看清.....
#石  发表于2004-09-11 19:24:00  IP: 218.247.158.*
很羡慕你,同时,也祝你更进步.
#LileLTP 发表于2004-11-11 20:46:00  IP: 221.204.25.*
如果感兴趣的话可以一起学习啊.
发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © LileLTP