黑马程序员——java中String、StringBuffer、StringBuilder学习总结

原创 2015年07月08日 22:15:10

提前声明:小弟初出茅庐,在学习了String,StringBuffer,StringBuider类后总结一些知识点,便于以后深度理解,初学者可以借鉴学习,还请高手大神请指点,谢谢!


前几天参加一次面试,被问到一个小问题:

String str="How "+"are "+"you";
System.out.println(str);

问这个输出什么?欣喜这当然是字符串组合了;然而接着问道:开发中这个需要怎么优化?当时回答到:用New 创建字符产,具体为什么当时说不明白,回来后又仔细学习了String类。

String类

API中对String类是这样描述的:

public final class String
extends Objectimplements Serializable, Comparable<String>, CharSequence

String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。

字符串是常量;它们的值在创建之后不能更改字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。例如:

     String str = "abc";

等效于:

     char data[] = {'a', 'b', 'c'};
     String str = new String(data);
 

下面给出了一些如何使用字符串的更多示例:

     System.out.println("abc");
     String cde = "cde";
     System.out.println("abc" + cde);
     String c = "abc".substring(2,3);
     String d = cde.substring(1, 2);
API描述了字符串是是常量,及初始化之后就不能更改。

回到问题: String str="How "+"are "+"you";       System.out.println(str);怎么优化???

分析为什么需要优化?

问题在于:字符串是常量。

执行 String str="How "+"are "+"you";,首先在常量池中开辟了三块内存,分别用于存储字符串:"How "、"are 、"you" ,当执行"How "+"are "时,字符串连接,系统为其创建新的字符串对象How are,How和are所占的内存成为系统垃圾,继续执行相加操作字符串连接,系统再次为其创建字符串对象,Howare所占内存成为系统垃圾,执行完毕将地址传给Str。分析得知,这样不断创建字符串进行连接时,所有的子字符串都会成为系统垃圾,优化的原因就在于此!

分析我的回答对不对呢?

首先我们要搞明白以下两种方式创建字符串的区别?

String str="hello"; //该方式创建字符串时,jvm会在常量池中寻找是否存在该字符串,存在:直接返回,不存在:在常量池中创建该字符串。故str在内存中只有一个对象,不会存在第二个。

String str1=new String("hello"); //该方式创建字符串时,首先在堆内存中创建字符串对象,用该对象在堆内存的引用传递到栈内存中,初始化Str1, 故 在内存中存在两个对象。

综合以上两种方式做两个列子,更深的理解两种创建方式。

String str1="how";
String str2="how";
System.out.println(str1==str2); //输出 true
分析:通过比较地址,第一种方式说明:常量池中不会存在相同的两个对象。
String str3=new String("how");
String str4=new String("how");
System.out.println(str3==str4);//输出 false

分析:通过比较地址,第二种方式说明:堆内存中创建了不同地址的两个对象。

原归正转:如何优化的问题!

通过回顾学习Java课程和查阅API,再次学习了StringBuffer类和StringBuilder类。

StringBuffer类学习总结:

StringBuffer是一个字符串缓冲区,作为字符串的容器,

特点是:

1.该容器的长度是可变的,可以增加。

2.缓冲区中的内容可通过方法修改。

3.容器对象具备对无元素的操作功能。

4.缓冲区可以存储不同类型的数据,单最终转为字符串。


构造方法说明:

StringBuffer()
          构造一个其中不带字符的字符串缓冲区,初始容量为 16 个字符。
StringBuffer(CharSequence seq)
          public java.lang.StringBuilder(CharSequence seq) 构造一个字符串缓冲区,它包含与指定的 CharSequence 相同的字符。
StringBuffer(int capacity)
          构造一个不带字符,但具有指定初始容量的字符串缓冲区。
StringBuffer(String str)
          构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。


缓冲区的常用方法:

StringBuffer append(各种类型的数据):该方法将给定数据转化成字符串追加到字符串缓冲区末尾。

StringBuffer insert (int index,各种类型的数据):该方法在指定位置index后追加数据。

StringBuffer delete (int star,int end):该方法删除缓冲区指定位置上的字符串。

说明:当如果追加后超出缓冲区长度是,缓冲区会分配新的缓冲区数组。

注意:什么时候用到字符串缓冲区?

当存储的数据多,数据类型个数不确定,最后都需要转化成字符串时用到StringBulider.

当学习完StringBuffer时,优化的问题迎刃而解。

使用StringBuffer优化上述String str=“How”+"are"+"you"问题;

过程: 1.创建字符串缓冲区对象

StringBuffer sb = new StringBufferr(); 

2.存储要组成的元素转化成字符串。

String str= sb.append("How").append("are").append("you").toString; 

该优化的问题的到很好的解决,这次面试题就当是学习的动力长知识了。


StringBuilder学习总结

API 描述:

public final class StringBuilder
extends Objectimplements Serializable, CharSequence

一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比StringBuffer 要快。

StringBuilder 上的主要操作是 appendinsert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符添加或插入到字符串生成器中。append 方法始终将这些字符添加到生成器的末端;而insert 方法则在指定的点添加字符。

例如,如果 z 引用一个当前内容为“start”的字符串生成器对象,则该方法调用z.append("le") 将使字符串生成器包含“startle”,而 z.insert(4, "le") 将更改字符串生成器,使之包含“starlet”。

通常,如果 sb 引用 StringBuilder 的实例,则 sb.append(x)sb.insert(sb.length(), x) 具有相同的效果。 每个字符串生成器都有一定的容量。只要字符串生成器所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区。如果内部缓冲区溢出,则此容量自动增大。

StringBuilder 的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用StringBuffer

总结一点:

StringBuilder是一个可变的字符序列,StringBuffer是与线程同步的,StringBuilder是线程不同步的。

速度快,字符串缓冲区被单个线程使用的时候,建议采用StringBuilder。


学习总结完成,如有不对请指出,谢谢!




String StringBuilder StringBuffer 对比 总结得非常好

转自:http://www.iteye.com/topic/522167 作者:每次上网冲杯Java时,都能看到关于String无休无止的争论。还是觉得有必要让这个讨厌又很可爱的Stri...
  • clam_clam
  • clam_clam
  • 2011年09月28日 19:00
  • 33215

Java中String,StringBuffer,StringBuilder区别与联系

Java中String,StringBuffer,StringBuilder区别与联系
  • u012965373
  • u012965373
  • 2017年12月13日 14:55
  • 105

java中的StringBuilder类的使用, String、StringBuilder、StringBuffer的区别

一、String 和 StringBuilder、StringBuffer的区别一:string是不可变序列,StringBuilder和StringBuffer是可变序列。 1、而StringBui...
  • Iloveyougirls
  • Iloveyougirls
  • 2016年09月17日 11:16
  • 307

java面试题String,StringBuilder,StringBuffer

String StringBuffer StringBuilder面试题
  • dfdsggdgg
  • dfdsggdgg
  • 2016年05月09日 22:39
  • 2749

Java基础之String、StringBuffer与StringBuilder的区别及应用场景

1 String、StringBuffer与StringBuilder (1)String 字符串常量; /** Strings are constant; their values cann...
  • chenliguan
  • chenliguan
  • 2016年07月14日 18:35
  • 6248

String、StringBuffer与StringBuilder之间区别-----(java复习)

1.三者在执行速度方面的比较:StringBuilder >  StringBuffer  >  String  2.String 的原因     String:字符串常量     Strin...
  • qq_27093465
  • qq_27093465
  • 2016年03月23日 14:45
  • 1377

Java中String、StringBuffer、StringBuilder简述及区别

容我喝杯82年的Java压压惊~~~如有欢迎指正。 1.String:由多个字符组成的一串数据,相当与...
  • MAGIC_JSS
  • MAGIC_JSS
  • 2016年05月10日 23:35
  • 1365

Java中String,StringBuffer,StringBuilder常用方法及使用实例

package stringtest; public class StringOpera { public static void main(String[] args) { Strin...
  • u012768347
  • u012768347
  • 2017年03月12日 16:33
  • 474

Java常考面试题7 深刻认识String、StringBuilder、StringBuffer

深刻认识String、StringBuilder、StringBuffer
  • HZ_LIZX
  • HZ_LIZX
  • 2017年02月10日 10:22
  • 508

java中String,StringBuffer,StringBuilder拼接效率对比

比较JAVA中String ,StringBuffer,SrtingBuilder三个对象连接字符串的效率。 我们经常都听有经验的人说,避免使用String通过“+”连接字符串,特 ...
  • liu136313
  • liu136313
  • 2016年03月10日 23:48
  • 3941
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:黑马程序员——java中String、StringBuffer、StringBuilder学习总结
举报原因:
原因补充:

(最多只允许输入30个字)