Java String、StringBuffer、stringbuilder介绍

Java中String和StringBuffer的区别

在Java中,StringStringBuffer都用于处理字符串,但它们之间有一些重要的区别:

1. 不可变性

String是不可变的,意味着一旦创建了一个String对象,它的值就不能被修改。任何对String的操作都会返回一个新的String对象,而不会修改原始对象。这可以提高字符串的安全性和线程安全性。
StringBuffer是可变的,它允许你修改其内部字符序列,而不必创建新的对象。这在需要频繁修改字符串内容时更加高效。

2. 线程安全性

String是线程安全的,因为它是不可变的。多个线程可以同时访问相同的String对象,而不会引发竞态条件。
StringBuffer是线程安全的,因为它的方法都被标记为synchronized,这意味着在多线程环境下,它的方法会被锁定以防止多个线程同时修改字符串内容。然而,这也可能导致性能下降,因为每个方法都需要获取锁。

3. 性能

String在连接、拼接和修改时性能较差,因为每次操作都会创建新的字符串对象,这可能导致大量的对象分配和垃圾回收开销。
StringBuffer在连接和修改大量字符串时性能较好,因为它可以就地修改字符串内容,而不会频繁创建新的对象。如果在单线程环境下进行大量字符串操作,StringBuffer通常比String更高效。
总之,选择使用String还是StringBuffer取决于你的需求。如果你需要一个不可变的字符串,或者在多线程环境中使用,那么String是一个不错的选择。如果你需要频繁修改字符串内容,或者在单线程环境中执行大量字符串操作,那么StringBuffer可能更适合。此外,Java还提供了一个不可变的、性能更好的替代品StringBuilder,它在单线程环境中通常比StringBuffer更快,因为它没有同步开销。但请注意,StringBuilder不是线程安全的。

Java中String为什么是引用数据类型

  • 在Java中,String是引用数据类型(也称为引用类型、对象类型),而不是基本数据类型(也称为值类型)。这是因为String在Java中被设计为一个类(java.lang.String),而不是像基本数据类型(如int、char等)那样的原始数据类型
  • Java中的基本数据类型是存储在栈(Stack)中的,而引用数据类型则是存储在堆(Heap)中的对象。在Java中,栈和堆是两种不同的内存区域,用于存储不同类型的数据。

String作为引用数据类型,有以下几个原因:

1、动态内存分配

引用数据类型的对象需要在堆中进行动态内存分配,可以在运行时根据需要创建和销毁对象。而基本数据类型在栈中分配,其大小是固定的,不能动态调整。

2、对象特性和方法

引用数据类型的对象可以具有属性(字段)和方法,可以调用对象的方法来执行各种操作。例如,String类提供了许多用于处理字符串的方法,如拼接、替换、截取等操作。

(1)length(): 返回字符串的长度。
(2)charAt(int index): 返回字符串指定索引位置的字符。
(3)indexOf(int ch): 返回指定字符在字符串中第一次出现的位置索引。
(4)substring(int beginIndex): 返回从指定索引开始到字符串结尾的子字符串。
(5)substring(int beginIndex, int endIndex): 返回从指定索引开始到指定索引结束的子字符串。
(5)toUpperCase(): 将字符串转换为大写形式。
(6)toLowerCase(): 将字符串转换为小写形式。
(7)trim(): 去除字符串两端的空格。
(8)startsWith(String prefix): 判断字符串是否以指定的前缀开始。
(9)endsWith(String suffix): 判断字符串是否以指定的后缀结束。
(10)replace(char oldChar, char newChar): 将字符串中的所有指定字符替换为新的字符。
(11)replaceAll(String regex, String replacement): 使用指定的替换字符串替换与给定的正则表达式匹配的字符串。
(12)split(String regex): 使用指定的正则表达式分割字符串,并返回分割后的字符串数组。
(13)equals(Object anObject): 判断字符串是否与指定的对象相等。
(14)compareTo(String anotherString): 按字典顺序比较两个字符串。
(15)contains(CharSequence s): 判断字符串是否包含指定的字符序列。
(16)isEmpty():判断字符串是否为空。

3、可空性

引用数据类型的对象可以具有null值,表示对象引用不指向任何有效的对象。而基本数据类型不具有null值,因为基本数据类型的变量总是有一个默认值。

4、对象引用

  • 引用数据类型的变量存储的是对象的引用(即内存地址),而不是实际的对象本身。这使得可以通过引用来共享对象,并在多个地方引用同一个对象。
  • 需要注意的是,虽然String是引用数据类型,但在Java中对String对象进行一些特定的操作时,会有一些优化措施,例如字符串常量池(String Pool)的使用,以提高性能和内存使用效率。这使得String对象在某些情况下的行为更类似于基本数据类型。但从Java语言规范的角度来看,String仍然被视为引用数据类型。

stringbuilder介绍

  • 当对字符串进行修改的时候,需要使用StringBuffer和StringBuilder类。
  • 和String类不同的是,StringBuffer和StringBuilder类的对象能够被多次的修改,并且不产生新的未使用对象。
  • 它和StringBuffer之间的最大不同在于StringBuilder的方法不是线程安全的。
  • 由于StringBuilder相较于StringBuffer有速度优势,所以多数情况下建议使用 StringBuilder类。

常用方法

String的常用方法如下:

length()	返回字符串的长度。
charAt(int index) 	返回字符串指定索引位置的字符。
substring(int beginIndex) 	返回从指定索引开始到字符串结尾的子字符串。
substring(int beginIndex, int endIndex) 	返回从指定索引开始到指定索引结束的子字符串。
toUpperCase()	将字符串转换为大写形式。
toLowerCase()	将字符串转换为小写形式。
trim()	去除字符串两端的空格。
startsWith(String prefix)	判断字符串是否以指定的前缀开始(实习的时候用过)
endsWith(String suffix) 	判断字符串是否以指定的后缀结束。
split(String regex) 	使用指定的正则表达式分割字符串,并返回分割后的字符串数组。
equals(Object anObject)	判断字符串是否与指定的对象相等。
contains(CharSequence s)	判断字符串是否包含指定的字符序列。
isEmpty()	判断字符串是否为空。

String对字符串进行排序:

Char[] array = str.toArrayChar();
Arrays.sort(array); 

StringBuilder、StringBuffer的常用方法如下:

public StringBuffer append(String s)	将指定的字符串追加到此字符序列。
public StringBuffer reverse()	将此字符序列用其反转形式取代。
public delete(int start, int end)	移除此序列的子字符串中的字符。
public insert(int offset, int i)	将 int 参数的字符串表示形式插入此序列中。
insert(int offset, String str)	将 str 参数的字符串插入此序列中。
replace(int start, int end, String str)	使用给定 String 中的字符替换此序列的子字符串中的字符。

上述内容均为自己理解总结,如有错误,欢迎批评纠正

posted @ 2023-11-18 15:36  技术小白求安排  阅读(87)  评论(0)    收藏  举报