黑马程序员技术交流社区

标题: 代码如下。StringBuffer的tostring。。怎么理解? [打印本页]

作者: java小兵    时间: 2015-2-4 23:41
标题: 代码如下。StringBuffer的tostring。。怎么理解?
本帖最后由 java小兵 于 2015-2-5 21:04 编辑
  1. public class StringBufferDemo1 {
  2.         public static void main(String[] args) {
  3.                 //StringBuffer  s4
  4.                 StringBuffer s = new StringBuffer("helloworld");
  5.                 System.out.println("s:"+s);
  6.                 String ss = s.toString();
  7.                 System.out.println("ss:"+ss);
  8.                 String s2 = "helloworld";
  9.                 System.out.println("s2:"+s2);
  10.                 System.out.println("ss==s2:"+(ss==s2));
  11.                 String sss = "helloworld";
  12.                 System.out.println("sss:"+sss);
  13.                 System.out.println("s2==sss:"+(s2==sss));
  14.         
  15.         }
  16. }
复制代码


结果如下图。   求大神解释!!!!

StringBuffer-1.png (161.02 KB, 下载次数: 22)

StringBuffer-1.png

作者: duxubo    时间: 2015-2-5 11:40
//StringBuffer  s4
                StringBuffer s = new StringBuffer("helloworld");
                System.out.println("s:"+s);//S在缓冲区
                String ss = s.toString();//底层调用StringBuilder.append方法"helloworld"存在缓冲区
                System.out.println("ss:"+ss);
                String s2 = "helloworld";//在常量池
                System.out.println("s2:"+s2);
                System.out.println("ss==s2:"+(ss==s2));
                String sss = "helloworld";//在常量池
                System.out.println("sss:"+sss);
                System.out.println("s2==sss:"+(s2==sss));
字符串底层操作不同
作者: phil    时间: 2015-2-5 11:54
来学习一下,加油!!
作者: java小兵    时间: 2015-2-5 21:04
StringBuffer ss = new StringBuffer(“helloworld”);
String ss = s.toString();
这个StringBuffer的tostring相当于创建了一个新对象。跟一般的tostring有点不同。
作者: Never、saydie    时间: 2015-2-5 22:27
只知道StringBuffer在输出的时候,偶人调用了.toString()方法
作者: Julie    时间: 2015-2-6 01:35
你的编译器怎么那么像subtext啊
作者: kenfine    时间: 2015-2-6 07:29
String s1="helloword";
String s2="helloword";
s1,s2指向的是同一个字符串常量池中的对象"helloword"。
String s3=new String("helloword");
String s4=new String("helloword");
这个构造函数在API中的解释是:
初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。
所以s3和s4的指向不同!

至于
StringBuffer s = new StringBuffer("helloworld");
String ss = s.toString();
JDK这个方法是:
  1. public String toString() {
  2.         // Create a copy, don't share the array
  3.         return new String(value, 0, count);
  4.     }
复制代码

显然,这个是重新new了一个字符串对象出来的
作者: kfcka    时间: 2015-2-6 09:02
第一个SS==S2为false 是因为ss是在字符串缓冲区,而第二个s2是在常量池,自然返回false
第二个S2==S3为true,是因为两个都在常量池,常量池已有的字符串,是不会再重新新建,指向同一个地址
作者: lwh316658735    时间: 2015-2-6 19:09
StringBuilder的toString()方法里返回的是一个new String();
所以他和后面直接声明的String sss 不是同一个对象,所以用==比较是会返回false




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2