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
http://blog.csdn.net/hzc543806053/article/details/7324360
System.out.println(st.equals(st1)); //true
判断内容相等用equals,st和st1是两个对象,指向内存不一样
==比较的是引用,就是地址,而equals是比较值,比较值的话,是值相同就返回true,而引用的话,值相同不一定相等,只有引用的地址相同才会相等,但是引用相同,值一定相等。
例如var str="hello"; var str1="hello";他们的值相等,引用也相等,但是var str=new String(“hello”); var str1=new String("hello");是不相等的,由于两次都用了new,分配了两次地址,所以引用不同,Java的机制是声明string的时候(不用 new)会先在常量中池中先找,找到了的话就直接匹配,指向这个引用,但是如果调用了new 就不会去寻找是否有这个字符串,会直接分配新的空间给他
第一位仁兄已经讲到了
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",而是直接在堆里生成一个新的对象...
http://blog.csdn.net/qq_25673113/article/details/46992657
一楼正解,new的时候就重新分配地址了。所以false
一般用String,因为String是不可变的,所以如果要连接字符串或者最好用StringBuffer或者Stringbuilder 可以看下这篇文章,http://58coding.com/article/detail/24659963087424338