看完这道题,你敢在心里承认自己是高手么 推荐
2006-12-04 09:35
246 查看
在《浪潮面试——答错的两道题》 中,我写了这么一道题,后来一位朋友的留言引起了我的注意,把结果做了测试,不过,还希望高人能详细解释一下机理。
题目————————
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",为什么结果是不同的。。。
题目————————
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",为什么结果是不同的。。。
相关文章推荐
- 学会调整自己的生活态度 推荐
- IT人士还是要善待自己 推荐
- 蛙蛙推荐:自己做一个抓包工具(类库是用的别人的)
- 网格布局练习,自己练习使用!初学者进来分享,高手勿笑!
- 自己摸索,持续更新的app产品分析模版(小白文,高手请无视)若有补充万分感谢
- 基于lucene实现自己的推荐引擎
- 以太坊开发入门,完整入门篇(小白可以看看,高手看看自己有没有遗漏的
- 一个计算机高手的成长——推荐一读
- 20款实用经典的Chrome插件推荐,不过要自己到扩展中心搜噢!
- 基于lucene实现自己的推荐引擎
- [设计原则] 重视自己的设计感觉 推荐
- 互联网和开源技术那些事儿、开源社区自己从来不想承认的九大事实
- 巴尔默承认给自己的孩子洗脑
- 内部IT支撑部门的生存法则(第二篇—— 建立保护自己的游戏规则) 推荐
- Python是如何推荐自己的?
- 买房还是租房?王思聪和金星说出自己观点,看完受益良多!
- 一个程序员的告白:多年后,我才学会承认自己的无知
- 不等不靠不要,程序员自己减轻“辛苦” 推荐
- 严格执行系统,严格止损,不要心存侥幸,勇敢承认错误,不给自己的错误找理由。
- 流行软件开发技术一句话(自己总结的常看资料,请各位高手指点)