独孤正龙
2016-08-29 07:17
采纳率: 0%
浏览 1.4k

Java 声明string 变量的疑问

String ss="qsdcv";
    String ss1="qsdcv";

    String st=new String(ss);
    String st1=new String(ss1);

    System.out.println(ss==ss1);//true
    System.out.println(st==st1);//false
    ==是判断是否同一个引用,但是String ss="qsdcv";这种声明方式就是同一种引用?
    为什么会有这样的结果
        System.out.println(ss.equals(ss1));//true
    System.out.println(st.equals(st1));//true
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

7条回答 默认 最新

  • 迷茫猿小明 2016-08-29 07:21
    打赏 评论
  • Carrie丶 2016-08-29 07:26

    System.out.println(st.equals(st1)); //true
    判断内容相等用equals,st和st1是两个对象,指向内存不一样

    打赏 评论
  • 当作看不见 2016-08-29 07:33

    ==比较的是引用,就是地址,而equals是比较值,比较值的话,是值相同就返回true,而引用的话,值相同不一定相等,只有引用的地址相同才会相等,但是引用相同,值一定相等。
    例如var str="hello"; var str1="hello";他们的值相等,引用也相等,但是var str=new String(“hello”); var str1=new String("hello");是不相等的,由于两次都用了new,分配了两次地址,所以引用不同,Java的机制是声明string的时候(不用 new)会先在常量中池中先找,找到了的话就直接匹配,指向这个引用,但是如果调用了new 就不会去寻找是否有这个字符串,会直接分配新的空间给他

    打赏 评论
  • Carrie丶 2016-08-29 07:46

    第一位仁兄已经讲到了

    3第三个问题

    String hello = "hello";
    String hel = "hel";
    String lo = "lo";

    System.out.println(hello == "hel" + "lo");
    System.out.println(hello == "hel" + lo);

    求输出的结果

    解答 true false

    首先,上面已经说明了,hello hel lo这三个都是指向pool中的对象..

    现在我们考虑"hel" + "lo" 按照内容来说,两个相加也就是"hello".这个时候,这个会返回pool中的"hello"对象.所以,hello == "hel" + "lo" 返回的是true .

    而"hel" + lo 虽然内容也是"hello",但是它将在堆里面生成一个"hello"对象,并返回这个对象...所以这里的结果是false

    总结一下就是,如果加号两边的是字面值(字面值就是直接在""里写的值,比如上面的"hel"与"lo"),那么将在pool里查找有没对应内容的对象(这里的内容就是"hello"),并返回pool里的对象.这和hello是一样的....

    如果加号两边不满足上面的条件(比如,两边的值是引用值或者堆里的字符串对象).那么将不会再pool里查找"hello",而是直接在堆里生成一个新的对象...

    打赏 评论
  • lkj41110 2016-08-29 09:14
    打赏 评论
  • Antway_ 2016-08-29 09:18

    一楼正解,new的时候就重新分配地址了。所以false

    打赏 评论
  • 58coding 2016-08-29 15:59

    一般用String,因为String是不可变的,所以如果要连接字符串或者最好用StringBuffer或者Stringbuilder 可以看下这篇文章,http://58coding.com/article/detail/24659963087424338

    打赏 评论

相关推荐 更多相似问题