A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 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, 下载次数: 9)

StringBuffer-1.png

8 个回复

倒序浏览
//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));
字符串底层操作不同

评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1

查看全部评分

回复 使用道具 举报
来学习一下,加油!!
回复 使用道具 举报
StringBuffer ss = new StringBuffer(“helloworld”);
String ss = s.toString();
这个StringBuffer的tostring相当于创建了一个新对象。跟一般的tostring有点不同。
回复 使用道具 举报
只知道StringBuffer在输出的时候,偶人调用了.toString()方法
回复 使用道具 举报
你的编译器怎么那么像subtext啊
回复 使用道具 举报
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了一个字符串对象出来的
回复 使用道具 举报
第一个SS==S2为false 是因为ss是在字符串缓冲区,而第二个s2是在常量池,自然返回false
第二个S2==S3为true,是因为两个都在常量池,常量池已有的字符串,是不会再重新新建,指向同一个地址
回复 使用道具 举报
StringBuilder的toString()方法里返回的是一个new String();
所以他和后面直接声明的String sss 不是同一个对象,所以用==比较是会返回false
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马