A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 luguoyuanf 于 2013-4-20 07:37 编辑

                String s = "java";
                String ss = "java";
                String s1 = new String ("java");
                String s2 = "ja";
                String s3 = "va";
                String s4 = s2+s3;
                String s5 = "ja"+"va";

                System.out.println(s==ss);        //true
                System.out.println(s==s1);        //false
                System.out.println(s==s4);        //false
                System.out.println(s==s5);        //true
刚看到这么一个面试题,不知道为什么结果是这样的,请哪位大牛帮忙解释下.谢谢了.

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

11 个回复

倒序浏览
好好看看==和=相关的内容含义,左右是否相等
回复 使用道具 举报
  1.                 String s = "java";
  2.                  String ss = "java";
  3.                  String s1 = new String ("java");
  4.                  String s2 = "ja";
  5.                  String s3 = "va";
  6.                  String s4 = s2+s3;
  7.                  String s5 = "ja"+"va";

  8.                 System.out.println(s==ss);        //true
  9.                  System.out.println(s==s1);        //false
  10.                  System.out.println(s==s4);        //false
  11.                  System.out.println(s==s5);        //true
  12. 我怎么感觉这个题是错的.字符串比较用equals
复制代码
回复 使用道具 举报
new会在内存中新开辟一块空间,字符串作比较、实质是内存地址作比较、new出来的空间作比较结果是false
s2、s3在内空中有自己的空间、字符串相加形成心字符串赋值给s4、同样道理产生了新的内存地址、作比较结果为false
s5是两个字符串相加结果赋值给s5、与   String s = "java";在内存中是一样的效果,和s==ss一样,比较结果为true.
回复 使用道具 举报
陈湘林 发表于 2013-4-19 23:35
好好看看==和=相关的内容含义,左右是否相等

这不是我要的结果,只是左右是否相等那看一下就知道了,运行结果不是想的那么简单.我也知道==和=的含义,这里面有String类的隐式操作.
回复 使用道具 举报
如果用这种方式创建对象String s = "java";它先会检查方法区的常量池中是否有java字符串,如果用就不会创建,所以执行String ss = "java"时,前面已经创建了一个java字符串对象,此时不会创建了,所以s和ss指向方法区的同一个对象,故s==ss为true,String s1= new String("java");指的是在堆内存中创建了一个对象,并把该对象地址赋值给s1,所以s==s1为false,s4=s2+s3将他们两个的值连接起来会生成新的字符串,所以s和s4不会引用同一个字符串,所以s==s4为false,执行String s5 = "ja"+"va";会将这两个字符串连接起来为java,然后检查是否在常量池中存在java字符串,如果存在不会创建新的java字符串,所以s和s5也是引用同一个对象。注意s4=s2+s3这种情况创建新的字符串原因是右边都是变量。

点评

你说得详细,我理解了,谢谢你的解释.  发表于 2013-4-20 00:01

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

回复 使用道具 举报
孙百鑫 发表于 2013-4-19 23:49

这是sun公司的SCJP认证的一道基础题,运行也没有报错.
回复 使用道具 举报
String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。使用==号进行内存地址的比较。s和ss其实是指向同一个对象,内存地址相同,s==ss返回true。而s1 new了新的对象,内存地址和s、ss不相同了。所以s==s1返回false。由于s2、s3都是变量,所以s4=s2+s3生成新的字符串,所以s==s4为false,至于 "ja"+"va" 这两个字符串连接起来先检查是否在常量池中存在java字符串,如果存在不会创建新的java字符串,所以s==s5返回true。
回复 使用道具 举报
杨剑 中级黑马 2013-4-20 00:06:41
9#
杨剑 发表于 2013-4-19 23:54
如果用这种方式创建对象String s = "java";它先会检查方法区的常量池中是否有java字符串,如果用就不会创建 ...

呵呵,不用客气都是互相学习嘛
回复 使用道具 举报
你好
String s = "java";
                 String ss = "java";
                 String s1 = new String ("java");
                 String s2 = "ja";
                 String s3 = "va";
                 String s4 = s2+s3;
                 String s5 = "ja"+"va";

                System.out.println(s==ss);        //true  final修饰的string类为常量,唯一的,s和ss指向同一个字符,比较地址相同
                 System.out.println(s==s1);        //false s指向"java"字符串.s1指向堆内存中一块空间,这块空间里装了"java",地址值为空间地址值,so比较不相同
                 System.out.println(s==s4);        //false s4会新生成一个字符串,新的地址
                 System.out.println(s==s5);        //true  本身你的s5="ja"+"va"就是个幌子,它就是"java",指向也是"java",s s5地址值相同,true
注意:==号比的是地址.与equals比较不同,实际应用中字符串的比较还是equals好点,...

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

回复 使用道具 举报
杨剑 发表于 2013-4-19 23:54
如果用这种方式创建对象String s = "java";它先会检查方法区的常量池中是否有java字符串,如果用就不会创建 ...

很详细.长见识了
回复 使用道具 举报
字符串,如果是用“==”比较实际上比较的是内存空间中地址,如果是用equals()方法比较的才是值,所以,只要是会有开辟新空间,指向不同内存地址的话,用“==”比较都会是false,用String类的构造函数肯定会开辟新的空间,所以比较地址是false,而字符串实际上就是字符的数组,是已经创建就是不可变的,所以,变量形式的拼接,也会创建一个新的内存空间,但是直接拼接创建出来的字符数组确实一样的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马