码迷,mamicode.com
首页 > 编程语言 > 详细

java中字符串的常见问题

时间:2016-05-24 10:34:45      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:字符串   java   

      相信接触过编程语言的童鞋对字符串不陌生吧,无论是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。

java中字符串的常见问题

标签:字符串   java   

原文地址:http://11404805.blog.51cto.com/11394805/1782331

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!