关闭

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

标签: stringstringbuilderstringbuffer
165人阅读 评论(0) 收藏 举报
分类:

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


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

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

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

String类

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

public final class String
extends Object
implements 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 Object
implements 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。


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




0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:6245次
    • 积分:184
    • 等级:
    • 排名:千里之外
    • 原创:12篇
    • 转载:6篇
    • 译文:0篇
    • 评论:0条
    文章分类