日期:2014-05-20  浏览次数:20804 次

StringBuffer和String的区别?!???
Java code

                  StringBuffer sb=new StringBuffer();
        String path=new String(sb);
        String[] array=path.split(";");
        System.out.println(array);
        System.out.println("------------------------");
        String path1=null;
        String[] array1=path1.split(";");
        System.out.println(array1);


显示结果如下:
Java code

[Ljava.lang.String;@35ce36
------------------------
Exception in thread "main" java.lang.NullPointerException
    at qiu.teststring.TestSplitNull.main(TestSplitNull.java:11)





打印出的结果array没有报错,正常显示;而array1报错。小弟现在捣鼓不清楚了,还望路过的帮忙看看

------解决方案--------------------
这跟String没有一毛钱关系

String path1=null;
String[] array1=path1.split(";");


Object a = null;
int hashCode = a.hashCode();

这两个代码原理是一样一样的
------解决方案--------------------
path1 是 null , path1.split(";") 怎么可能不报错呢?
------解决方案--------------------
JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。
------解决方案--------------------
探讨

引用:
path1 是 null , path1.split(";") 怎么可能不报错呢?


第二个我知道肯定会报错,我想知道第一个同样sb是空的,但是赋值给path后就不报错了,为什么?????

------解决方案--------------------
探讨

引用:
path1 是 null , path1.split(";") 怎么可能不报错呢?


第二个我知道肯定会报错,我想知道第一个同样sb是空的,但是赋值给path后就不报错了,为什么?????

------解决方案--------------------
你null 就等于没实例出来 压根没那东西 你怎么split 肯定报错啊
------解决方案--------------------
探讨

引用:
path1 是 null , path1.split(";") 怎么可能不报错呢?


第二个我知道肯定会报错,我想知道第一个同样sb是空的,但是赋值给path后就不报错了,为什么?????

------解决方案--------------------
String:固定长度的字符串,如果要发生变化必须重新生成新的实例;字符串常量;不可变的对象
StringBuffer:字符串变量,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。
StringBuilder 字符串变量(非线程安全)一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。
注:如果针对某一String用“+”拼接的话,效率比StringBuffer还快,比如:String x="a"+"b";JVM认为x="ab";不过如果是几个不同的String拼接的话就不行了。
------解决方案--------------------


首先 String 的长度是不变的 例如 String str="123"; str+="456"; 这时str已经是新的实例了 
而 StringBuffer 的长度是可变的 并且 始终保持同一个对象

 而你出现的NullPointException(空指针异常) 那是因为你的path1是null值 这样path1.split 必定会出现空指针异常
------解决方案--------------------
楼主请看你的代码
String path1=null;
String[] array1=path1.split(";");
System.out.println(array1);

你使用了一个为null的对象去调用方法,能不报NullPointerException吗?