String,StringBuilder,StringBuff之间的联系和区别

一.String

1.

String表示字符串类型,属于 引用数据类型,不属于基本数据类型。

2.

对于String来说,是把数据存放在了常量池中,因为所有的String,默认都是以常量形式保存,且由final修饰,因此在线程池中它是线程安全的。因为每一个String当被创建好了以后,他就不再发生任何变化,但是它的执行速度是最差的。
我们要创建String的时候,他在常量池中对这些信息进行处理,如果在程序中出现了大量字符串拼接的工作,效率是非常底下的。
因此使用场景是在少量字符串操作的时候才建议直接使用String来操作。

3.

构造方法:
在这里插入图片描述

4.

方法:
char charAt(int index) 返回指定位置的字符
int compareTo(String anotherString) 比较两个字符串。相等返回0;前大后小返回1;前小后大返回-1
boolean contains(CharSequence s) 判断字符串是否包含s
boolean endsWith(String suffix) 判断字符串是否以suffix结尾
boolean equals(Object anObject) 判断两个串是否相等
boolean equalsIgnoreCase(String anotherString) 忽略大小写判断两个串是否相等
byte[] getBytes() 将字符串串变成字节数组返回
int indexOf(String str) 返回str在字符串第一次出现的位置
boolean isEmpty() 字符串是否为空
int length() 字符串长度
int lastIndexOf(String str) 返回str最后一次出现的位置
String replace(CharSequence target, CharSequence replacement) 用replacement替换字符串target的字符
String[] split(String regex) 将字符串以regex分割
boolean startsWith(String prefix) 判断字符串是否以prefix开始
String substring(int beginIndex) 从beginIndex开始截取字串
String substring(int beginIndex, int endIndex) 截取beginIndex到endIndex - 1的字符串
char[] toCharArray() 将字符串转换乘char数组
String toLowerCase() 字符串转小写
String toUpperCase() 字符串转大写
String trim() 去除字符串两边空格
静态方法 static String valueOf(int i) 将 i 转换成字符串
不完全只有这些。

二.StringBuilder

1.

字符串变量(线程不安全)。在内部,StringBuilder 对象被当作是一个包含字符序列的变长数组。它是一个可变的字符串类,可以看做一个容器,可变的是指它对象中的内容是可变的。

2.

ava.lang.StringBuilder 是一个可变的字符序列,是 JDK5.0 新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。

3.

StringBuffer相对于StringBuilder效率要相对低一点,但也远比String要高的多。效率低的原因:对于StringBuffer来说更多的考虑到了多线程的情况,在进行字符串操作的时候,它使用了synchronize关键字,对方法进行了同步处理。
因此StringBuffer适用于多线程环境下的大量操作。

4.

构造方法:
public StringBuilder(): 创建一个空白可变的字符串对象,不含有任何内容
public StringBuilder(): 根据字符串内容,来创建可变字符串对象
在这里插入图片描述

三.StringBuff

1.

StringBuffer 类是可变字符串类,创建 StringBuffer 类的对象后可以随意修改字符串的内容。每个 StringBuffer 类的对象都能够存储指定容量的字符串,如果字符串的长度超过了 StringBuffer 类对象的容量,则该对象的容量会自动扩大。因此在内存上要优于String对象.

2.

StringBuffer和String之间的相互转化

对于StringBuffer而言不可直接强制类型转化,即StringBuffer a=(StringBuffer)‘ac’是错误的使用方法。
对于StringBuffer转化为String可使用 String b=a.toString(),对于String转为StringBuffer可使用StringBuffer b=new StringBuffer(string)

3.

(常用)方法
在这里插入图片描述

4.

构造方法
StringBuffer() :构造一个没有任何字符的StringBuffer类。
StringBuffer(int length) : :构造一个没有任何字符的StringBuffer类,并且,其长度为length。
StringBuffer(String str) :以str为初始值构造一个StringBuffer类。

5.

在大部分情况下,StringBuilder > StringBuffer。这主要是由于前者不需要考虑线程安全

四.三者区别:

1.

String 类型和 StringBuffer 的主要性能区别:String 是不可变的对象, 因此在每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,性能就会降低。

2.

使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。所以多数情况下推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。

3.

在某些特别情况下, String 对象的字符串拼接其实是被 Java Compiler 编译成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢

4.

StringBuilder 一般使用在方法内部来完成类似 + 功能,因为是线程不安全的,所以用完以后可以丢弃。StringBuffer 主要用在全局变量中。

5.

相同情况下使用 StringBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。而在现实的模块化编程中,负责某一模块的程序员不一定能清晰地判断该模块是否会放入多线程的环境中运行,因此:除非确定系统的瓶颈是在 StringBuffer 上,并且确定你的模块不会运行在多线程模式下,才可以采用 StringBuilder;否则还是用 StringBuffer。
可能还有其他区别,只是总结一部分的…

五.相互转换

1.

StringBuilder转换为String
public String toString():通过 toString() 就可以实现把 StringBuilder 转换为 String

2.

String转换为StringBuilder
public StringBuilder(String s):通过构造方法就可以实现把 String 转换为 StringBuilder

3.

String转换成StringBuffer:
构造法:
String s=“Hello”;
StringBuffer str=new StringBuffer(s);

append法
String s=“Hello”;
StringBuffer str=new StringBuffer();
str.append(s)

4.

StringBuffer转换成String:
构造法
StringBuffer str=new StringBuffer(“java”);
String s=new String(str);

toString( )法
StringBuffer str=new StringBuffer(“java”);
String s=str.toString();

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值