黑马程序员技术交流社区

标题: 关于StringBuffer 和String 类的代码,哪个大侠帮我分析下。 [打印本页]

作者: 施家雄    时间: 2013-3-11 13:37
标题: 关于StringBuffer 和String 类的代码,哪个大侠帮我分析下。
下面是一个String类,功能是对当前字符串操作后并不改变字符串本身,而是又生成另一个实例。代码如下:
  1. class StringBufferExample
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 String st1="This is a String example";
  6.                 System.out.println("before changed,st1="+st1);

  7.                 String st2=st1.toLowerCase();
  8.                 System.out.println("After changed,st1="+st1);
  9.                 System.out.println("st2="+st2);
  10.        
  11.         }
  12. }
复制代码
结果为:before changed,st1=This is a String example
            after changed,st2=This is a String example
            st2=this is a string example   
对st1操作后,st1不变。可是将其中的String 类改成StringBuffer类就出现错误了。代码如下:
  1. class StringBufferExample
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 StringBuffer st1="This is a StringBuffer example";
  6.                 System.out.println("before changed,st1="+st1);

  7.                 StringBuffer st2=st1.toLowerCase();
  8.                 System.out.println("After changed,st1="+st1);
  9.                 System.out.println("st2="+st2);
  10.        
  11.         }
  12. }
复制代码
不是说SringBuffer类处理可变字符串,当修改一个StringBuffer类的字符串时,不需要再创建一个新的字符串对象,而是直接对原字符串进行操作。可是变成下面这样的程序就为什么出错了,求大神给予指点。谢谢!
作者: HM李帅    时间: 2013-3-11 13:52
首先  StringBuffer是不可以直接等于初始化的
创建StringBuffer需要在其构造里初始化
比如 StringBuffer s = new StringBuffer(“before changed”);
其次 StringBuffer 也没有toLowerCase方法
综上所述  所以会报错
建议看一下这两个类的api
虽然用法大同小异但区别还是不少的
作者: 邹学良    时间: 2013-3-11 13:52
本帖最后由 邹学良 于 2013-3-11 13:55 编辑

StringBuffer对象的初始化不像String类的初始化一样,Java提供的有特殊的语法,而通常情况下一般使用构造方法进行初始化。
StringBuffer s = new StringBuffer();
StringBuffer和String属于不同的类型,也不能直接进行强制类型转换,下面的代码是错误的
StringBuffer st1="This is a StringBuffer example";

StringBuffer类中的方法主要偏重于对于字符串的变化,例如追加、插入和删除等,这个也是StringBuffer和String类的主要区别

作者: scott0610    时间: 2013-3-11 14:03
class StringBufferExample
{
       public static void main(String[] args)
    {
              String st1="This is a String example";

            System.out.println("before changed,st1="+st1);

           //String里中的toLowerCase()返回的是一个新的String。因为String是一个不可改变的。
       //所以st1还是原来的数据,st2才是转换后的新字符串。
            String st2=st1.toLowerCase();

            System.out.println("After changed,st1="+st1);

             System.out.println("st2="+st2);   
        }

}

至于下面关于SringBuffer的代码中
StringBuffer st1 = new StringBuffer("This is a StringBuffer example");//这样才能创建一个StringBuffer对象。
SringBuffer类没有提供toLowerCase()这个方法,


希望对你有所帮助。


作者: 张宁    时间: 2013-3-11 15:29

  1. class StringTest
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                    String st1="This is a String example";
  6.                System.out.println("before changed,st1="+st1);

  7.                String st2=st1.toLowerCase();
  8.                System.out.println("After changed,st1="+st1);//st1还是st1,st2指向st1.toLowerCase是说,
  9.                                                               //转换后的对应的字符串的地址传给了st2,
  10.                                                       //这两个字符串在常量池中的地址是不同的。
  11.                System.out.println("st2="+st2);
  12.                //StringBuffer st1="This is a StringBuffer example";不可以把String强制转换成StringBuffer
  13.                 StringBuffer sb1 = new StringBuffer("This is a StringBuffer example");
  14.                 System.out.println("before changed,sb1="+sb1);

  15.                 //StringBuffer st2=st1.toLowerCase();StringBuffer里边没有toLowerCase()方法
  16.                String sb2= sb1.toString().toLowerCase();//你可以把它转换成字符串,然后调用此方法。
  17.                 System.out.println("After changed,sb1="+sb2);
  18.                
  19.                
  20.                
  21.       
  22.         }
  23. }
复制代码
我自己修改了一下,希望能帮助你。
作者: HM李超    时间: 2013-3-11 15:43
说明一,附上代码
  1. class StringBufferExample
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 String st1="This is a String example";
  6.                 System.out.println("before changed,st1="+st1);

  7.                                 //String对象一旦创建,其初始值一直保持不变的,st1保存的是"This is a String example",
  8.                                 //即使调用toLoewrCase()方法,st1还是指向"This is a String example",所以输出st1时结果不变
  9.                                 //但是调用了toLowerCase()方法的结果可以返回到新的String对象st2,所以st2指向"this is a string example"

  10.                 String st2=st1.toLowerCase();
  11.                 System.out.println("After changed,st1="+st1);
  12.                 System.out.println("st2="+st2);
  13.         }
  14. }
复制代码
说明2,附上代码:
  1. class StringBufferExample
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 //StringBuffer st1="This is a StringBuffer example";   //没见过这样初始化StringBuffer的
  6.                                 StringBuffer st1 = new StringBuffer("This is a StringBuffer example");  //改成这样就对了,至少初始化正确了                                               
  7.                 System.out.println("before changed,st1="+st1);

  8.                 StringBuffer st2=st1.toLowerCase();   //这里的问题是StringBuffer并没有toLowerCase方法,String倒是有,不要混淆了,我建议你多看看jdk API
  9.                 System.out.println("After changed,st1="+st1);
  10.                 System.out.println("st2="+st2);
  11.         }
  12. }
复制代码
仅供参考,希望对你有点帮助
作者: 沈文杰    时间: 2013-3-11 18:40
  1. public static void main(String[] args)
  2.     {
  3.             //StringBuffer st1="This is a StringBuffer example";false
  4.             //你可以看下StringBuffer的API帮助文档,你上面是定义一个字符串的方法,而定义一个字符串缓冲区需要调用有参构造函数
  5.         StringBuffer st1=new StringBuffer("This is a StringBuffer example");
  6.         System.out.println("before changed,st1="+st1);
  7.         
  8.         //StringBuffer st2=st1.toLowerCase();false,toLowerCase()是字符串String的方法,不是StringBuffer的
  9.         //可以用下面的方式完成调用(先调用toString将str2转换成字符串在调用toLowerCase()方法,然后将结果作为参数传入构造函数)
  10.         StringBuffer st2=new StringBuffer(st1.toString().toLowerCase());
  11.         System.out.println("After changed,st1="+st1);
  12.         System.out.println("st2="+st2);
  13.    
  14.     }
复制代码





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