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



一、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代码   收藏代码
  1. //变量a和b将会指向同一内存地址(""的地址)  
  2. String a = "";  
  3. String b = "";  
  4. if(a == b){  
  5.     System.out.println("a和b地址相等"+true);  
  6. }  
  7. if(a.equals(b)){  
  8.     System.out.println("a和b值相等"+true);  
  9. }  
  10. //变量c和d不会指向同一地址,而是两个""内容的地址  
  11. String c = new String("");  
  12. String d = new String("");  
  13. if(c==d){  
  14.     System.out.println("c和d地址相等"+true);  
  15. }  
  16. if(c.equals(d)){  
  17.     System.out.println("c和d值相等"+true);  
  18. }  

变量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代码   收藏代码
  1. //无参数的构造方法  
  2. StringBuilder sb = new StringBuilder();  
  3. //源码:  
  4. public StringBuffer() {  
  5.         super(16);  
  6.     }  
  7. //super(16);源码:  
  8. char[] value;  
  9. AbstractStringBuilder(int capacity) {  
  10.         value = new char[capacity];  
  11.     }  

新建StringBuilder()对象时候,默认是构建一个大小为16字节的字符数组char[],StringBuilder预先开辟了空间,append的时候只是向内存地址赋值。如果长度不够时候再重新开辟内存。 
影音先锋电影 http://www.iskdy .com/
3.StringBufffer 
StringBuffer与StringBuilder基本类似。 
StringBuilder和StringBuffer类拥有的成员属性以及成员方法基本相同,区别是StringBuffer类的成员方法前面多了一个关键字:synchronized。 
=>StringBuffer是线程安全的。 

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

这个文章里面的面试题可以参考下 
基本就这些,后续再补充吧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值