这个嘛,论坛讨论的也挺多的
String s = “abc”
String s1 = new String("abc");
这两个对象的区别你应该知道,就不多说了。
String s2=“a”+"b"+"c"+"a"//不建议这么做,因为用+号连接起来的字符串,相当于new出来的(六个之多,a、b、c、ab、abc、abca),也就是编译期确定不了,建议用StingBuilder或StringBuffer(同步),用来存储可变长度的字符串
public class AnimalFarm {
public static void main(String[] args) {
final String pig = "length: 10";//编译器就可以确定,存在于常量池中。
final String dog = "length: "+pig.length();//相当new一个新串然,在编译期确定不了,不在常量池中,new出来然后dog对象指向了新的字符串
final String pig = "length:10"; //要运算 pig.length()=9;就是字符串长度,你一个一个数length:10的个数
final String dog = "length: "+pig.length();// 这时候的String dog = “length:9”。考虑清楚这里就行
public class AnimalFarm {
public static void main(String[] args) {
final String pig = "length:10";
final String dog = "length:"+pig.length();
System.out.println("Animals are equals:"+ pig==dog);
System.out.println("Animals are equals:"+ pig.equals(dog));
}
}
以上摘自贴里内容,往下看
我测试了一下,如果是直接赋值,无论是String nn="length: 10";还是String mm="length: "+10;和pig比较的时候,==判断的都是true,而和dog比较则为false。我的理解是,dog赋值时,用到了pig.length(),所以dog的值,其实是随着pig的长度而改变的,所以虚拟机存储的并不是和pig同样的引用地址,所以用==判断为false。而equals比较的是字符串的具体值,所以返回true了。你将pig.length()换成10,结果自然是不一样的。
参考代码:
public class AnimalFarm {
public static void main(String[] args) {
final String pig = "length: 10";
final String dog = "length: "+pig.length();