您的位置:首页 > 产品设计 > UI/UE

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

2015-10-30 16:47 423 查看



一、String的综述和各种赋值区别

综述:str只是一个String对象的引用,并不是String对象本身。

引用是4字节的数据,里面存放了它所指向的对象的地址,通过这个地址可以访问对象。

1.String str = null;

未分配存储空间,表示str不指向任何字符串对象,空引用

null代表声明了一个空对象,对空对象做任何操作都不行的,除了=和==

2.String str;

分配了一个内存空间,没存入任何对象,未初始化的引用

在方法中定义:直接使用时编译是不通过的,必须赋初值

在类中定义(static 静态变量):可以不赋初值直接引用,默认赋值为null


伦理片 http://www.dotdy.com/

3.String str = "";

分配存储空间,表示str指向一个长度为0的字符串对象

""代表声明了一个对象实例,这个对象实例的值是一个长度为0的空字符串。

4.String str = "a";与String str = new String("a");区别

前者是在字符串池里写入一个字符'a',然后用str指向它

后者是在堆上创建一个内容为"a"的字符串对象。

Java代码


//变量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 指向的对象值是否相等。

二、String、StringBuilder、StringBuffer

1.String

前面说了:

String str = "abc";

str只是一个字符串对象"abc"的引用,存储的是"abc"在内存中存放的地址。

str = "def";时

内存空间重新创建新对象"def",引用str重新指向新对象,实际内存中"abc"的值并未改变。

对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象

javac对String的实现机制也是通过JavaBuilder来实现的。

2.StringBuilder

Java代码


//无参数的构造方法

StringBuilder sb = new StringBuilder();

//源码:

public StringBuffer() {

super(16);

}

//super(16);源码:

char[] value;

AbstractStringBuilder(int capacity) {

value = new char[capacity];

}

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

影音先锋电影 http://www.iskdy.com/
3.StringBufffer

StringBuffer与StringBuilder基本类似。

StringBuilder和StringBuffer类拥有的成员属性以及成员方法基本相同,区别是StringBuffer类的成员方法前面多了一个关键字:synchronized。

=>StringBuffer是线程安全的。

4.三者性能

对于几个字符串的拼接,基本差不多。

大量数据:StringBuilder > StringBuffer > String

这个文章里面的面试题可以参考下

基本就这些,后续再补充吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: