您的位置:首页 > Web前端

java String StringBuilder StringBuffer 以及各种赋值和注意

2015-10-24 13:05 399 查看
[size=x-large]一、String的综述和各种赋值区别[/size]
综述:[color=red]str只是一个String对象的引用,并不是String对象本身。
引用是4字节的数据,里面存放了它所指向的对象的地址,通过这个地址可以访问对象。[/color]

1.String str = null;
未分配存储空间,表示str不指向任何字符串对象,空引用
null代表声明了一个空对象,对空对象做任何操作都不行的,除了=和==

2.String str;
分配了一个内存空间,没存入任何对象,未初始化的引用
在方法中定义:直接使用时编译是不通过的,必须赋初值
在类中定义(static 静态变量):可以不赋初值直接引用,默认赋值为null

3.String str = "";
分配存储空间,表示str指向一个长度为0的字符串对象
""代表声明了一个对象实例,这个对象实例的值是一个长度为0的空字符串。

4.String str = "a";与String str = new String("a");区别
前者是在字符串池里写入一个字符'a',然后用str指向它
后者是在堆上创建一个内容为"a"的字符串对象。

//变量a和b将会指向同一内存地址(""的地址)
String a = "";
String b = "";
if(a == b){
System.out.println("a和b地址相等"+true);
}
if(a.equals(b)){
System.out.println("a和b值相等"+true);
}
//变量c和d不会指向同一地址,而是两个""内容的地址
String c = new String("");
String d = new String("");
if(c==d){
System.out.println("c和d地址相等"+true);
}
if(c.equals(d)){
System.out.println("c和d值相等"+true);
}

变量a,b方式:先去字符串池中查找字符串是否已经存在,如果在就直接指向该地址,如果不在生成一个实例放入池中再指向该地址。
变量c,d方式:通过new关键字来生成对象是在堆区进行的,而在堆区进行对象生成的过程是不会去检测该对象是否已经存在的。因此通过new来创建对象,创建出的一定是不同的对象,即使字符串的内容是相同的
所以:a,b方式性能更高。

5.str.equals("abc")和"abc".equals(str)
推荐种写法,可以省略掉对null的判断。
String str = null;
if(str.equals("abc"))//空指针异常java.lang.NullPointerException

if("abc".equals(str))//可以正常运行

6.如何判断字符串是否为空:
if(str != null && str != "")
顺序最好不要写反:
String str = null;
if(str != "" && str != null)//抛出空指针异java.lang.NullPointerException

7.判断字符串是否相等
== : 是判断 str 的地址是否相等。
equals : 是判读 str 指向的对象值是否相等。

[size=x-large]二、String、StringBuilder、StringBuffer[/size]
1.String
前面说了:
String str = "abc";
str只是一个字符串对象"abc"的引用,存储的是"abc"在内存中存放的地址。
str = "def";时
内存空间重新创建新对象"def",引用str重新指向新对象,实际内存中"abc"的值并未改变。
[color=red]对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象[/color]
javac对String的实现机制也是通过JavaBuilder来实现的。

2.StringBuilder

//无参数的构造方法
StringBuilder sb = new StringBuilder();
//源码:
public StringBuffer() {
super(16);
}
//super(16);源码:
char[] value;
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}

新建StringBuilder()对象时候,默认是构建一个大小为16字节的字符数组char[],StringBuilder预先开辟了空间,append的时候只是向内存地址赋值。如果长度不够时候再重新开辟内存。

3.StringBufffer
StringBuffer与StringBuilder基本类似。
StringBuilder和StringBuffer类拥有的成员属性以及成员方法基本相同,区别是StringBuffer类的成员方法前面多了一个关键字:synchronized。
=>StringBuffer是线程安全的。

4.三者性能
对于几个字符串的拼接,基本差不多。
大量数据:StringBuilder > StringBuffer > String

http://www.cnblogs.com/dolphin0520/p/3778589.html
这个文章里面的面试题可以参考下
基本就这些,后续再补充吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: