String、StringBuffer以及StringBuilder的比较

简介: .String类1.1String类的理解和创建对象(1)String对象用于保存字符串,也就是一组字符序列(2)字符串常量对象是用双引号括起来的字符序列(3)字符串的字符使用Unicode字符编码。一个字符(不区分字母还是汉字)占两个字节(4)String是final类,不能被其他类继承(5)String有属性 private final char value[];用于存放字符串内容注意:value是一个final类型,不可以修改(即value不能指向新的地址,但是单个字符内容是可以改变的)




1.String类


1.1String类的理解和创建对象


(1)String对象用于保存字符串,也就是一组字符序列


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


(3)字符串的字符使用Unicode字符编码。一个字符(不区分字母还是汉字)占两个字节


(4)String是final类,不能被其他类继承


(5)String有属性 private final char value[];用于存放字符串内容


注意:value是一个final类型,不可以修改(即value不能指向新的地址,但是单个字符内容是可以改变的)


 final char[] value = {'a', 'b', 'c', 'd'};
        char[] v = {'t', 'o', 'm'};
        value[0] = 'H';
       // value = v; 会报错


(6)String类的常用构造方法


①String(): 初始化一个新创建的 String 对象,使其表示一个空字符序列。


②String(String original): 初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;

换句话说,新创建的字符串是该参数字符串的副本。


③String(char[] value)

分配一个新的 String,使其表示字符数组参数中当前包含的字符序列。


④String(char[] value, int offset, int count):

分配一个新的 String,它包含取自字符数组参数一个子数组的字符。


⑤String(byte[] bytes):

通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。


⑥String(byte[] bytes, int offset, int length):

通过使用平台的默认字符集解码指定的 byte 子数组,构造一个新的 String。


(7)String类的继承关系


288d8a4bc0004fe0b00b9f0e3dac8b1f.png


①实现Serializable接口:说明String可以串行化

②实现Comparable接口:说明String对象可以相互比较


1.2 两种创建String对象的区别


方式一:直接赋值 String s = "hsp";


方式二:调用构造器 String s2 = new String("hsp");

(1)方式一:先从常量池查看是否有“hsp”数据空间,如果有,直接指向;如果没有,则重新创建,然后指向。

s最终指向的是常量池的空间地址。


(2)方式二:先在堆中创建空间,里面维护了value属性,指向常量池的hsp空间。如果常量池没有“hsp”,重新创建;

如果有,直接通过value指向。最终指向堆中的空间地址。


012cc257db7a4b26af97dd80b0706ec6.png


1.3 String类的常用方法


(1)equals // 区分大小写,判断内容是否相等


(2)equalsIgnoreCase // 忽略大小写,判断内容是否相等


(3)length // 获取字符的个数,即字符串的长度


(4)indexOf // 获取字符在字符串中第一次出现的索引,索引从0开始,如果找不到,返回-1


(5)lastIndexOf //获取字符在字符串中最后一次出现的索引,索引从0开始,如果找不到,返回-1


(6)substring // 截取指定范围的字符


(7)trim // 去掉前后空格


(8)charAt // 获取某索引处的字符


Sring类是保存字符串常量的。每次更新都需要重新开辟空间,效率较低。因此,Java设计者还提供了StringBuilder和StringBuffer来增强String的功能,并提高效率。


2.StringBuffer类


(1)java.lang.StringBuffer代表可变的字符序列,可以对字符串内容进行增删。

(2)很多方法和String相同,但StringBuffer是可变长度。

(3)StringBuffer是一个容器。


2.1 StringBuffer类的理解


fb552cf79b8a4029b10419db73f8f725.png


(1)StringBuffer的直接父类是AbstractStringBuilder

(2)StringBuffer实现了Serializable,即StringBuffer的对象可以串行化

(3)在父类中,AbstractStringBuilder 有属性 char[] value,不是final;

该value数组存放字符串内容,该字符串内容存是放在堆中的

(4)StringBuffer是一个final类,不能被继承

(5)因为StringBuffer字符内容是存在 char[] value,所以再变化(增加/删除),

不用每次都更换地址(即不用每次都创建新对象),所以效率高于String


2.2 String与StringBuffer的对比


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

//private final char value[]

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

// char[] value; 放在堆中


2.3 String与StringBuffer的相互转换


//  (1) String --> StringBuffer
        String str = "hello tom";
//     方式1: 使用构造器
//     注意:返回的是StringBuffer对象,对str本身没有影响
        StringBuffer stringBuffer = new StringBuffer(str);
//     方式2: 使用append方法
        StringBuffer stringBuffer1 = new StringBuffer();
        stringBuffer1 = stringBuffer1.append(str);
//  (2) StringBuffer --> String
        StringBuffer buffer1 = new StringBuffer("hi jerry");
//       方式1: 使用StringBuffer提供的 toString方法
        String s = buffer1.toString();
//      方式2: 使用构造器来搞定
        String s1 = new String(buffer1);


3.StringBuilder类的理解


(1)一个可变的字符序列。此类提供了一个与StringBuffer兼容的API,但不保证同步(不是线程安全的)。该类被设计用作

StringBuffer的一个简易替换,用在字符串被单个线程使用的时候。如果可能,建议优先采用该类,因为在

大多数实现中,它比StringBuffer要快。


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


04b8a4d1b78e43a591fe7be28a3c7259 (1).png


4.三者比较


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


(2)String:不可变字符序列,效率低,但是复用率高(常量池中的数据可以共用)


(3)StringBuffer:可变字符序列、效率较高(增删)、线程安全


(4)StringBuilder:可变字符序列、效率最高、线程不安全



目录
相关文章
|
3月前
|
安全 Java API
【Java字符串操作秘籍】StringBuffer与StringBuilder的终极对决!
【8月更文挑战第25天】在Java中处理字符串时,经常需要修改字符串,但由于`String`对象的不可变性,频繁修改会导致内存浪费和性能下降。为此,Java提供了`StringBuffer`和`StringBuilder`两个类来操作可变字符串序列。`StringBuffer`是线程安全的,适用于多线程环境,但性能略低;`StringBuilder`非线程安全,但在单线程环境中性能更优。两者基本用法相似,通过`append`等方法构建和修改字符串。
65 1
|
5天前
|
安全
String、StringBuffer、StringBuilder的区别
String 由 char[] 数组构成,使用了 final 修饰,对 String 进行改变时每次都会新生成一个 String 对象,然后把指针指向新的引用对象。 StringBuffer可变并且线程安全;有一定缓冲区容量,字符串大小没超过容量,不会重新分配新的容量,适合多线程操作字符串; StringBuiler可变并且线程不安全。速度比StringBuffer更快,适合单线程操作字符串。 操作少量字符数据用 String;单线程操作大量数据用 StringBuilder;多线程操作大量数据用 StringBuffer
|
2月前
|
安全 Java
String、StringBuffer、StringBuilder的区别
这篇文章讨论了Java中String、StringBuffer和StringBuilder的区别。String是不可变的,每次操作都会产生新的对象,效率低且浪费内存。StringBuilder可以在原字符串基础上进行操作,不开辟额外内存,弥补了String的缺陷。StringBuffer和StringBuilder类似,但StringBuffer的方法是线程安全的。文章还列举了StringBuffer的常用方法,并提供了使用示例代码。最后总结了这三者的主要区别。
String、StringBuffer、StringBuilder的区别
|
1月前
|
canal 安全 索引
(StringBuffer和StringBuilder)以及回文串,字符串经典习题
(StringBuffer和StringBuilder)以及回文串,字符串经典习题
35 5
|
27天前
|
存储 安全 Java
String、StringBuffer 和 StringBuilder 的区别
【10月更文挑战第21天】String、StringBuffer 和 StringBuilder 都有各自的特点和适用场景。了解它们之间的区别,可以帮助我们在编程中更合理地选择和使用这些类,从而提高程序的性能和质量。还可以结合具体的代码示例和实际应用场景,进一步深入分析它们的性能差异和使用技巧,使对它们的理解更加全面和深入。
16 0
|
2月前
|
安全 Java
Java StringBuffer 和 StringBuilder 类详解
在 Java 中,`StringBuffer` 和 `StringBuilder` 用于操作可变字符串,支持拼接、插入、删除等功能。两者的主要区别在于线程安全性和性能:`StringBuffer` 线程安全但较慢,适用于多线程环境;`StringBuilder` 非线程安全但更快,适合单线程环境。选择合适的类取决于具体的应用场景和性能需求。通常,在不需要线程安全的情况下,推荐使用 `StringBuilder` 以获得更好的性能。
|
3月前
|
API C# 开发者
WPF图形绘制大师指南:GDI+与Direct2D完美融合,带你玩转高性能图形处理秘籍!
【8月更文挑战第31天】GDI+与Direct2D的结合为WPF图形绘制提供了强大的工具集。通过合理地使用这两种技术,开发者可以创造出性能优异且视觉效果丰富的WPF应用程序。在实际应用中,开发者应根据项目需求和技术背景,权衡利弊,选择最合适的技术方案。
151 0
|
2月前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
39 0
java基础(13)String类
|
1月前
|
Java
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
本文深入探讨了Java中方法参数的传递机制,包括值传递和引用传递的区别,以及String类对象的不可变性。通过详细讲解和示例代码,帮助读者理解参数传递的内部原理,并掌握在实际编程中正确处理参数传递的方法。关键词:Java, 方法参数传递, 值传递, 引用传递, String不可变性。
57 1
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
|
1月前
|
安全 Java 测试技术
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
26 2