相信接触过编程语言的童鞋对字符串不陌生吧,无论是c、c++还是c#等等,几乎所有的编程语言中都少不了字符串,那么,今天就说说java中的字符串。
在java中,声明一个字符串很容易,用String即可,如:
String s1="123abc"; String s2="abc";
相信上面的定义对大家来说就是小菜一碟,那么,我再定义一个s3:
String s3 ="123abc"; System.out.println(s1==s3);//true System.out.println(s2==s3);//false
对于上面的输出结果,我想大家都能答对,但是为什么呢?难道只是简单的因为俩个内容相同,俩个不同吗?显然不是的。
在java中,字符串是不变对象,意思是说,字符串内容一旦创建不可改变,若想改变某个字符串内容一定会创建新对象。像上面的s1、s2和s3后面的值都可以叫做“字面量”,他们在编译时被放到常量池中,一旦有内容相同的,机会被认为是同一个值,那么指向他们的引用地址也就相同,所以上面的结果不单单是因为内容上的异同。那么,现在再来声明一个引用:
String s4=new String("123abc"); System.out.println(s4==s3);
这个结果又是什么呢?显然是false。s4是一个指向新new出来的对象,虽然它指向的地址中的值是123abc,但是也仅仅是地址中的值一样,但地址不同,所以,结果为false。
接下来,再看几个:
String s4 = "123"+"abc"; String str1 = "123"; String str2 = "abc"; String s5 = str1+str2; System.out.println(s4==s3); System.out.println(s5==s3);
结果是true,false。当一个计算表达式计算符两边都是字面量时,会直接计算结果,然后将结果编译到class文件中,s4在class文件中样子是:
String s4 = "123abc";
在编译时编译器自动优化,将s4转变成123abc,然后寻找常量池中有没有“123abc”,所以s4==s3;而s5则是由俩个地址完全不同的字符串重新拼接成一个新的,那么就会分配一个新的常量池地址给它,所以s5==s3为false。
时间: 2024-10-18 08:39:06