String、StringBuffer、StringBuilder笔记

String

一、String的结构类图

be318f1cf22b423a9b72f8228005fca5.png

二、String的基本概念

1.String对象用于保存字符串,也就是一组字符的序列。

2.字符串常量对象是用双引号括起来的字符序列。

3.字符串的 字符使用unicode字符编码,一个字符占两个字节。

4.String类实现了Serializable接口,可以实现串行化,即可以在网络传输。实现了Comparable接口,可以进行比较。

5.String类被final修饰,不能被继承。

6.String类中有一个private final char[] value属性,用于存放字符串的内容。value被final修饰,不可以被更改,即value不能指向新的地址,但是单个字符的内容可以被修改。

三、String的两种创建方式

1.直接赋值 String s = ”zhang“;

先从常量池查找是否有zhang数组空间,如果有直接指向,如果没有则重新创建然后指向。最终s指向的是常量池的空间地址。

2.调用构造器 String s2 = new String(”zhang“);

现在堆中创建对象,里面有value属性,value属性指向常量池的zhang数组空间。如果常量池没有zhang则重新创建然后指向,如果有,直接通过value属性指向。最终s2指向的是堆中的空间地址。

425938cd29f94257b4cd84d4c8a0d0f5.png

四、字符串特性

1.String是一个final类,代表不可变的字符序列。

2.字符串是不可变的,一个字符串对象一旦被分配,其内容是不可变的。

f8a6bbb8621f411c84f20e904f2da77c.png

 5d415b35d24f46f9a5392706805df2ac.png

五、String类常用方法

 

0adc6f73844d489f91e59ca7450f3858.png

1e1c850cefcd40a6951b6ec50562e4bd.png

8b3e1919e5354b33adda54d409074b31.png

StringBuffer

一、StringBuffer的结构类图

bc22577a50ad4503ba527e05fa033cbf.png

二、StringBuffer的基本概念

1.StringBuffer的直接父类是AbstractStringBuilder。

2.StringBuffer实现了Serializable接口,即StringBuffer对象可以串行化。

3.在父类中AbstractStringBuilder的char[] value没有被final修饰,则value存放的字符串内容存放在堆中。

4.StringBuffer类被final修饰,不能被继承。
 

三、String和StringBuffer的区别

1.String保存的是字符串常量,里面的值不能被更改每次String类的更新实际上就是更改地址,效率较低。

2.StringBuffer保存的是字符串变量,里面的值可以更改。每次StringBuffer的更新实际上可以更新内容。不用每次更新地址,效率较高。

四、StringBuffer的四种构造器 

f1e913c6234f4e24bb4b2c7e6b3706ca.png

五、String和StringBuffer的转换

 

六、StringBuffer常用方法

c6f202aa2aaf4a1a9aa71541eb6c85c0.png

七、测试题

c0aa9df6693d42f8bf6a05aaaa111e15.png

StringBuilder

一、结构类图

ae2cae7d673e4bd6855a65edd53d152c.png

二、StringBuilder的基本概念

1.一个可变的字符序列,此类提供了一个与StringBuffer兼容的API,但不保证同步(StringBuilder不是线程安全)。该类设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果在单线程情况下,使用StringBuilder会比StringBuffer效率更高。

2.在StringBuilder上的主要操作是append和insert方法,可重载这些方法以接受任意类型的数据。

3.StringBuilder继承AbstractStringBuilder类。

4.实现了Serializable接口,说明StringBuilder的对象可以串行化(对象可以网络传输,保存到文件)

5.StringBuilder被final修饰,不能够被继承。

6.StringBuilder对象字符序列仍然存放在父类的char[] value,因此字符序列在堆中。

7.StringBuilder的方法没有做互斥的处理,即没有synchronized关键字,因此在单线程情况下使用。 

三、String、StringBuffer、StringBuilder的区别比较

1.StringBuffer和StringBuilder非常类似,均代表可变的字符序列,而且方法也一样。

2.StringBuffer 可变字符序列,效率较高(增删),线程安全。

3.StringBuilder 可变字符序列,效率最高(增删),线程不安全。

4.String 不可变字符序列,效率较低,但是复用性较高。

String s = ”hello“创建了一个字符串,s += ”123“,实际上原来的hello字符串已经丢弃了,现在又产生了一个字符串”hello123“,如果多次执行这些改变内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作存在循环中,会极大影响程序性能。因此,对String做大量修改时,不要再使用String,而是把String转换成StringBuffer或StringBuilder对象,单线程使用StringBuilder,多线程使用StringBuffer。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值