注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 CCIE-Lab考试将新增10分钟..
 帮助

看完这道题,你敢在心里承认自己是高手么


2006-12-04 09:35:38
 标签:面试 试题 浪潮   [推送到技术圈]

    在《浪潮面试——答错的两道题》 中,我写了这么一道题,后来一位朋友的留言引起了我的注意,把结果做了测试,不过,还希望高人能详细解释一下机理。
    题目————————
JAVA:
        String a = "hello";
        String b = "h";
        b += "ello";
        System.out.println(a == b);
        System.out.println((Object)a == (Object)b);
结果是:F F

如果是:
        String a = "hello";
        String b = "hello";
        System.out.println(a == b);
        System.out.println((Object)a == (Object)b);
结果是: T T
C#:
        String a = "hello";
        String b = "h";
        b += "ello";
        System.out.println(a == b);
        System.out.println((Object)a == (Object)b);
结果是:T F——(解释是C#里重载了 == 所以将string可视为基本类型?)

如果是:
        String a = "hello";
        String b = "hello";
        System.out.println(a == b);
        System.out.println((Object)a == (Object)b);
结果是: T T
 
     需要注意的地方就是,对于String类型,为什么声明两个值相等的变量,进行(Object)a == (Object)b级别的比较时,仍旧是TRUE;有同学解释说,是JDK的bug,应该不会吧。。。还有说跟垃圾回收的机制有关, 但是,由分配变量值到比较,是不是还没有涉及到回收操作啊。
   
    写到这里的时候,我又做了个JAVA的测试,           
            String a = new String("hello");
            String b = new String("hello");
            System.out.println(a == b);
            System.out.println((Object)a == (Object)b);
    结果是:F F
 
 
    呵呵,上面的白写了,但是还是要发出去吧。。。答案找到了——
 
    计算机的内存中有堆和栈两块空间,其中栈中存放所有对象、函数、变量等的引用;而堆中存放对象、值等。不管是new出的对象还是用类似String a = "hello";这类的对象,都是放在堆中的。
String a= "hello" ;
String b= "hello" ;
String c= new String("hello") ;
    表面上看这三句回实例化3个String对象,实际上是两个。在java中有一个叫“字符数据池”的内存管理机制,在对b赋值之前,会检查池中有没有相同的数据,如果有,则直接引用;若没有,系统会实例化这个String的对象;而执行到String c = new String("hello") ;系统会直接实例化该对象,而不会在池中查找。也不会将这个对象放在池中。 如果改动a或b时,并不会改动另外一个引用的值——系统会首先在池中查找有没有相同的对象,如果没有,会实例化这个对象。
 
    下面还是留个问题给大家讨论吧。。。
            String a = "hello1";
            String b = "hello";
            b = "hello" + 1; 
            //此行如果为 b = b + 1,C#结果是一样的;
            //但在JAVA中是由原来的TT变为FF                   
            Console.WriteLine(a == b);                //T
            Console.WriteLine((Object)a == (Object)b);//F
-----------------------------------------------------------
            String a = "hello1";
            String b = "hello";
            b = "hello" + "1";
            Console.WriteLine(a == b);                //T
            Console.WriteLine((Object)a == (Object)b);//T
------------------------------------------------------------
            String a = "hello1";
            String b = "hello";
            b =b + "1";
            Console.WriteLine(a == b);                 //T
            Console.WriteLine((Object)a == (Object)b); //F
 
    尤其是C#和JAVA混着比较,更有点彻底晕菜的感觉。看来对这个1和"1"的处理也是不一样的。1在java里和String进行操作是先 ToString()了吧?那在C#里 b = "hello" + 1;这一行是怎么处理的呢,"hello" + 1 和"hello" + "1",为什么结果是不同的。。。




    文章评论
 
2006-12-04 11:59:53
有点晕菜了……
当然我十年前编过程,而且从来也不是高手……

2006-12-04 15:03:14
哈哈,能引起YangSir关注的问题看来也是大问题了。。。

2006-12-05 09:09:45
顶下,好象是和数据类型有关吧最后,呵呵,变量,一个吃常量的

2006-12-07 12:32:06
晕乎乎的 到现在 我都没有深究过操作系统方面的东西

2006-12-07 12:41:54
C java就是复杂么

呵呵 我用的vb 好像么有这种问题的

难怪搞VB的老被人说肤浅 唉...

2007-01-03 03:52:43
考过SCJP的人,就会觉得这些其实是JAVA中最基础的东西了。
String对象的不变性理论说明:String对象一旦被创建,就绝不能改变。可是我们JAVA编程的经历并不完全是这样的。
其实不变性理论指的是字符串指针指向的内容不变。而改变的只是引用。如果想要字符串改变的话,就用StringBuffer吧。

JAVA不复杂,但需要人的耐心细心,细心的去品位他们之间的差别,你就会感觉别一般乐趣。
JAVA不难学,但其内容广阔如大海,是一种锻炼人性格的语言。

2007-01-03 03:55:33
雨寒厉害,懂得这么语言。见多识光~文章也挺深刻的。
我只对JAVA有所钻研。
谢谢

2007-08-16 16:14:02
早就搞明白了这个有什么用,我依然不是高手!

2007-08-17 08:19:00
高手的境界还是很远的。。。强中自有强中手

2008-02-04 15:23:03
呵呵,本人不是高手
这些都是基本知识啊

2008-02-19 10:57:01
有点晕!有有点明白了!

 

发表评论

昵   称:
验证码:  点击图片可刷新验证码  博客过2级,无需填写验证码
内   容: