String,StringBuilder , StringBuffer分析 和 区别

1、String

String类代表字符串。 Java程序中的所有字符串文字(例如"hello" )都被实现为此类的实例。

字符串不变; 它们的值在创建后不能被更改。 字符串缓冲区支持可变字符串。 因为String对象是不可变的,它们可以被共享。

例如:

     String str = "hello";
 

相当于:

     char d[] = {'h', 'e', 'l', 'l', 'o'};
     String str = new String(d);

       构造方法:

String()

初始化新创建的 String对象,使其表示空字符序列。

String(byte[] bytes)

通过使用平台的默认字符集解码指定的字节数组来构造新的 String

String(byte[] bytes, Charset charset)

构造一个新的String由指定用指定的字节的数组解码charset

String(byte[] ascii, int hibyte)已弃用

此方法无法将字节正确转换为字符。 从JDK 1.1开始,首选的方法是通过String构造函数获取Charset ,字符集名称,或者使用平台的默认字符集。

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

通过使用平台的默认字符集解码指定的字节子阵列来构造新的 String

String(byte[] bytes, int offset, int length, Charset charset)

构造一个新的String通过使用指定的指定字节子阵列解码charset

String(byte[] ascii, int hibyte, int offset, int count)已弃用

此方法无法将字节正确转换为字符。 从JDK 1.1开始,首选的方式是通过String构造函数获取Charset ,字符集名称,或使用平台的默认字符集。

String(byte[] bytes, int offset, int length, String charsetName)

构造一个新的 String通过使用指定的字符集解码指定的字节子阵列。

String(byte[] bytes, String charsetName)

构造一个新的String由指定用指定的字节的数组解码charset

String(char[] value)

分配一个新的 String ,以便它表示当前包含在字符数组参数中的字符序列。

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

分配一个新的 String ,其中包含字符数组参数的子阵列中的字符。

String(int[] codePoints, int offset, int count)

分配一个新的 String ,其中包含 Unicode code point数组参数的子阵列中的 字符

String(String original)

初始化新创建的String对象,使其表示与参数相同的字符序列; 换句话说,新创建的字符串是参数字符串的副本。

String(StringBuffer buffer)

分配一个新的字符串,其中包含当前包含在字符串缓冲区参数中的字符序列。

String(StringBuilder builder)

分配一个新的字符串,其中包含当前包含在字符串构建器参数中的字符序列。

       方法:

char charAt(int index)

返回 char指定索引处的值。

int codePointAt(int index)

返回指定索引处的字符(Unicode代码点)。

int codePointBefore(int index)

返回指定索引之前的字符(Unicode代码点)。

int codePointCount(int beginIndex, int endIndex)

返回此 String指定文本范围内的Unicode代码点数。

int compareTo(String anotherString)

按字典顺序比较两个字符串。

int compareToIgnoreCase(String str)

按字典顺序比较两个字符串,忽略病例差异。

String concat(String str)

将指定的字符串连接到该字符串的末尾。

boolean contains(CharSequence s)

当且仅当此字符串包含指定的char值序列时才返回true。

boolean contentEquals(CharSequence cs)

将此字符串与指定的CharSequence进行 CharSequence

boolean contentEquals(StringBuffer sb)

将此字符串与指定的StringBuffer进行 StringBuffer

static String copyValueOf(char[] data)

相当于 valueOf(char[])

static String copyValueOf(char[] data, int offset, int count)

相当于 valueOf(char[], int, int)

boolean endsWith(String suffix)

测试此字符串是否以指定的后缀结尾。

boolean equals(Object anObject)

将此字符串与指定对象进行比较。

boolean equalsIgnoreCase(String anotherString)

将此 String与其他 String比较,忽略案例注意事项。

static String format(Locale l, String format, Object... args)

使用指定的区域设置,格式字符串和参数返回格式化的字符串。

static String format(String format, Object... args)

使用指定的格式字符串和参数返回格式化的字符串。

byte[] getBytes()

使用平台的默认字符集将此 String编码为字节序列,将结果存储到新的字节数组中。

byte[] getBytes(Charset charset)

使用给定的charset将该String编码为字节序列,将结果存储到新的字节数组中。

void getBytes(int srcBegin, int srcEnd, byte[] dst, int dstBegin)已弃用

此方法无法将字符正确转换为字节。 从JDK 1.1开始,首选的方法是通过getBytes()方法,该方法使用平台的默认字符集。

byte[] getBytes(String charsetName)

使用命名的字符集将此 String编码为字节序列,将结果存储到新的字节数组中。

void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)

将此字符串中的字符复制到目标字符数组中。

int hashCode()

返回此字符串的哈希码。

int indexOf(int ch)

返回指定字符第一次出现的字符串内的索引。

int indexOf(int ch, int fromIndex)

返回指定字符第一次出现的字符串内的索引,以指定的索引开始搜索。

int indexOf(String str)

返回指定子字符串第一次出现的字符串内的索引。

int indexOf(String str, int fromIndex)

返回指定子串的第一次出现的字符串中的索引,从指定的索引开始。

String intern()

返回字符串对象的规范表示。

boolean isEmpty()

返回 true如果,且仅当 length()0

static String join(CharSequence delimiter, CharSequence... elements)

返回一个新的字符串,由 CharSequence elements的副本组成,并附有指定的delimiter的 delimiter

static String join(CharSequence delimiter, Iterable<? extends CharSequence> elements)

返回一个新 String的副本组成 CharSequence elements与指定的副本一起加入 delimiter

int lastIndexOf(int ch)

返回指定字符的最后一次出现的字符串中的索引。

int lastIndexOf(int ch, int fromIndex)

返回指定字符的最后一次出现的字符串中的索引,从指定的索引开始向后搜索。

int lastIndexOf(String str)

返回指定子字符串最后一次出现的字符串中的索引。

int lastIndexOf(String str, int fromIndex)

返回指定子字符串的最后一次出现的字符串中的索引,从指定索引开始向后搜索。

int length()

返回此字符串的长度。

boolean matches(String regex)

告诉这个字符串是否匹配给定的 regular expression

int offsetByCodePoints(int index, int codePointOffset)

返回此 String内的指数,与 index codePointOffset代码点。

boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len)

测试两个字符串区域是否相等。

boolean regionMatches(int toffset, String other, int ooffset, int len)

测试两个字符串区域是否相等。

String replace(char oldChar, char newChar)

返回从替换所有出现的导致一个字符串 oldChar在此字符串 newChar

String replace(CharSequence target, CharSequence replacement)

将与字面目标序列匹配的字符串的每个子字符串替换为指定的字面替换序列。

String replaceAll(String regex, String replacement)

用给定的替换替换与给定的 regular expression匹配的此字符串的每个子字符串。

String replaceFirst(String regex, String replacement)

用给定的替换替换与给定的 regular expression匹配的此字符串的第一个子字符串。

String[] split(String regex)

将此字符串分割为给定的 regular expression的匹配。

String[] split(String regex, int limit)

将这个字符串拆分为给定的 regular expression的匹配。

boolean startsWith(String prefix)

测试此字符串是否以指定的前缀开头。

boolean startsWith(String prefix, int toffset)

测试在指定索引处开始的此字符串的子字符串是否以指定的前缀开头。

CharSequence subSequence(int beginIndex, int endIndex)

返回一个字符序列,该序列是该序列的子序列。

String substring(int beginIndex)

返回一个字符串,该字符串是此字符串的子字符串。

String substring(int beginIndex, int endIndex)

返回一个字符串,该字符串是此字符串的子字符串。

char[] toCharArray()

将此字符串转换为新的字符数组。

String toLowerCase()

将所有在此字符 String使用默认语言环境的规则,以小写。

String toLowerCase(Locale locale)

将所有在此字符 String ,以降低使用给定的规则情况下 Locale

String toString()

此对象(已经是字符串!)本身已被返回。

String toUpperCase()

将所有在此字符 String使用默认语言环境的规则大写。

String toUpperCase(Locale locale)

将所有在此字符 String使用给定的规则,大写 Locale

String trim()

返回一个字符串,其值为此字符串,并删除任何前导和尾随空格。

static String valueOf(boolean b)

返回 boolean参数的字符串 boolean形式。

static String valueOf(char c)

返回 char参数的字符串 char形式。

static String valueOf(char[] data)

返回 char数组参数的字符串 char形式。

static String valueOf(char[] data, int offset, int count)

返回 char数组参数的特定子阵列的字符串 char形式。

static String valueOf(double d)

返回 double参数的字符串 double形式。

static String valueOf(float f)

返回 float参数的字符串 float形式。

static String valueOf(int i)

返回 int参数的字符串 int形式。

static String valueOf(long l)

返回 long参数的字符串 long形式。

static String valueOf(Object obj)

返回 Object参数的字符串 Object形式。

2、StringBuilder

java.lang.Object

java.lang.StringBuilder

1.一个可变的字符序列。 此类提供与StringBuffer的API,但不保证同步。StringBuilder的主要StringBuilderappendinsert方法,它们是重载的,以便接受任何类型的数据。 每个都有效地将给定的数据转换为字符串,然后将该字符串的字符附加或插入字符串构建器。 append方法始终在构建器的末尾添加这些字符; insert方法将insert添加到指定点。

2.StringBuilder的StringBuilder不能安全使用多线程。 如果需要同步, 那么建议使用StringBuffer

3.除非另有说明,否则将null参数传递给null中的构造函数或方法将导致抛出NullPointerException

构造方法:

StringBuilder()

构造一个没有字符的字符串构建器,初始容量为16个字符。

StringBuilder(CharSequence seq)

构造一个包含与指定的相同字符的字符串构建器 CharSequence

StringBuilder(int capacity)

构造一个没有字符的字符串构建器,由 capacity参数指定的初始容量。

StringBuilder(String str)

构造一个初始化为指定字符串内容的字符串构建器。

方法:​​​​​​​

StringBuilder append(boolean b)

boolean参数的字符串表示附加到序列中。

StringBuilder append(char c)

char参数的字符串表示附加到此序列。

StringBuilder append(char[] str)

char数组参数的字符串表示追加到此序列。

StringBuilder append(char[] str, int offset, int len)

char数组参数的子阵列的字符串表示附加到此序列。

StringBuilder append(CharSequence s)

将指定的字符序列追加到此 Appendable 。

StringBuilder append(CharSequence s, int start, int end)

追加指定的序列 CharSequence的序列。

StringBuilder append(double d)

double参数的字符串表示法附加到此序列。

StringBuilder append(float f)

float参数的字符串表示附加到此序列。

StringBuilder append(int i)

int参数的字符串表示法附加到此序列。

StringBuilder append(long lng)

long参数的字符串表示法附加到此序列。

StringBuilder append(Object obj)

追加 Object参数的字符串 Object形式。

StringBuilder append(String str)

将指定的字符串附加到此字符序列。

StringBuilder append(StringBuffer sb)

将指定 StringBuffer这个序列。

StringBuilder appendCodePoint(int codePoint)

codePoint参数的字符串表示附加到此序列。

int capacity()

返回当前容量。

char charAt(int index)

返回 char在指定索引在这个序列值。

int codePointAt(int index)

返回指定索引处的字符(Unicode代码点)。

int codePointBefore(int index)

返回指定索引之前的字符(Unicode代码点)。

int codePointCount(int beginIndex, int endIndex)

返回此序列指定文本范围内的Unicode代码点数。

StringBuilder delete(int start, int end)

删除此序列的子字符串中的字符。

StringBuilder deleteCharAt(int index)

删除 char在这个序列中的指定位置。

void ensureCapacity(int minimumCapacity)

确保容量至少等于规定的最小值。

void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)

字符从该序列复制到目标字符数组 dst

int indexOf(String str)

返回指定子字符串第一次出现的字符串内的索引。

int indexOf(String str, int fromIndex)

返回指定子串的第一次出现的字符串中的索引,从指定的索引开始。

StringBuilder insert(int offset, boolean b)

boolean参数的字符串表示插入到此序列中。

StringBuilder insert(int offset, char c)

在此序列中插入 char参数的字符串表示形式。

StringBuilder insert(int offset, char[] str)

在此序列中插入 char数组参数的字符串表示形式。

StringBuilder insert(int index, char[] str, int offset, int len)

在此序列中插入 str数组参数的子阵列的字符串表示形式。

StringBuilder insert(int dstOffset, CharSequence s)

将指定的 CharSequence这个序列。

StringBuilder insert(int dstOffset, CharSequence s, int start, int end)

将指定的CharSequence的子 CharSequence插入到此序列中。

StringBuilder insert(int offset, double d)

在此序列中插入 double参数的字符串表示形式。

StringBuilder insert(int offset, float f)

在此序列中插入 float参数的字符串表示形式。

StringBuilder insert(int offset, int i)

将第二个 int参数的字符串表示插入到此序列中。

StringBuilder insert(int offset, long l)

在此序列中插入 long参数的字符串表示形式。

StringBuilder insert(int offset, Object obj)

Object参数的字符串表示插入到此字符序列中。

StringBuilder insert(int offset, String str)

将字符串插入到此字符序列中。

int lastIndexOf(String str)

返回指定子字符串最右边出现的字符串内的索引。

int lastIndexOf(String str, int fromIndex)

返回指定子字符串最后一次出现的字符串中的索引。

int length()

返回长度(字符数)。

int offsetByCodePoints(int index, int codePointOffset)

返回此序列中与 indexcodePointOffset代码点偏移的索引。

StringBuilder replace(int start, int end, String str)

用指定的String中的字符替换此序列的子字符串中的 String

StringBuilder reverse()

导致该字符序列被序列的相反代替。

void setCharAt(int index, char ch)

指定索引处的字符设置为 ch

void setLength(int newLength)

设置字符序列的长度。

CharSequence subSequence(int start, int end)

返回一个新的字符序列,该序列是该序列的子序列。

String substring(int start)

返回一个新的 String ,其中包含此字符序列中当前包含的字符的子序列。

String substring(int start, int end)

返回一个新的 String ,其中包含此序列中当前包含的字符的子序列。

String toString()

返回表示此顺序中的数据的字符串。

void trimToSize()

尝试减少用于字符序列的存储。

3、StringBuffer

java.lang.Object

java.lang.StringBuffer

线程安全,可变的字符序列。 字符串缓冲区就像一个String ,但可以修改。 在任何时间点,它包含一些特定的字符序列,但可以通过某些方法调用来更改序列的长度和内容。

字符串缓冲区可以安全地被多个线程使用。 这些方法在必要时进行同步,以便任何特定实例上的所有操作都按照与所涉及的各个线程所执行的方法调用顺序一致的顺序发生。

StringBuffer的主要StringBufferappendinsert方法,它们被重载以便接受任何类型的数据。 每个都有效地将给定的数据转换为字符串,然后将该字符串的字符附加或插入到字符串缓冲区。 append方法总是在缓冲区的末尾添加这些字符; insert方法将insert添加到指定点。

每当涉及源序列(例如从源序列追加或插入)的操作发生时,该类仅在执行操作的字符串缓冲器上进行同步,而不在源上。 请注意,虽然StringBuffer被设计为可以安全地从多个线程并发使用,但如果构造函数或appendinsert操作被传递通过线程共享的源序列,则调用代码必须确保该操作具有一致且不变的视图在操作期间的源序列。 呼叫者通过使用不可变的源序列,或者不跨线程共享源序列,可以在呼叫期间持有锁来满足这一点。

每个字符串缓冲区都有一个容量。 只要字符串缓冲区中包含的字符序列的长度不超过容量,就不必分配新的内部缓冲区数组。 如果内部缓冲区溢出,则会自动变大。

除非另有说明,否则将null参数传递给null中的构造函数或方法将导致抛出NullPointerException

构造方法:​​​​​​​

StringBuffer()

构造一个没有字符的字符串缓冲区,初始容量为16个字符。

StringBuffer(CharSequence seq)

构造一个包含与指定的相同字符的字符串缓冲区 CharSequence

StringBuffer(int capacity)

构造一个没有字符的字符串缓冲区和指定的初始容量。

StringBuffer(String str)

构造一个初始化为指定字符串内容的字符串缓冲区。

方法:​​​​​​​

StringBuffer append(boolean b)

boolean参数的字符串表示附加到序列中。

StringBuffer append(char c)

char参数的字符串表示附加到此序列。

StringBuffer append(char[] str)

char数组参数的字符串表示附加到此序列。

StringBuffer append(char[] str, int offset, int len)

char数组参数的子阵列的字符串表示附加到此序列。

StringBuffer append(CharSequence s)

追加指定的 CharSequence到这个序列。

StringBuffer append(CharSequence s, int start, int end)

追加指定的序列 CharSequence到这个序列。

StringBuffer append(double d)

double参数的字符串表示附加到此序列。

StringBuffer append(float f)

float参数的字符串表示附加到此序列。

StringBuffer append(int i)

int参数的字符串表示附加到此序列。

StringBuffer append(long lng)

long参数的字符串表示附加到此序列。

StringBuffer append(Object obj)

追加 Object参数的字符串表示。

StringBuffer append(String str)

将指定的字符串附加到此字符序列。

StringBuffer append(StringBuffer sb)

将指定 StringBuffer这个序列。

StringBuffer appendCodePoint(int codePoint)

codePoint参数的字符串表示法附加到此序列。

int capacity()

返回当前容量。

char charAt(int index)

返回 char在指定索引在这个序列值。

int codePointAt(int index)

返回指定索引处的字符(Unicode代码点)。

int codePointBefore(int index)

返回指定索引之前的字符(Unicode代码点)。

int codePointCount(int beginIndex, int endIndex)

返回此序列指定文本范围内的Unicode代码点数。

StringBuffer delete(int start, int end)

删除此序列的子字符串中的字符。

StringBuffer deleteCharAt(int index)

删除 char在这个序列中的指定位置。

void ensureCapacity(int minimumCapacity)

确保容量至少等于规定的最小值。

void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)

字符从该序列复制到目标字符数组 dst

int indexOf(String str)

返回指定子字符串第一次出现的字符串内的索引。

int indexOf(String str, int fromIndex)

返回指定子串的第一次出现的字符串中的索引,从指定的索引开始。

StringBuffer insert(int offset, boolean b)

在此序列中插入 boolean参数的字符串表示形式。

StringBuffer insert(int offset, char c)

在此序列中插入 char参数的字符串表示形式。

StringBuffer insert(int offset, char[] str)

在此序列中插入 char数组参数的字符串表示形式。

StringBuffer insert(int index, char[] str, int offset, int len)

在此序列中插入 str数组参数的子阵列的字符串表示形式。

StringBuffer insert(int dstOffset, CharSequence s)

将指定的 CharSequence这个序列。

StringBuffer insert(int dstOffset, CharSequence s, int start, int end)

将指定的子序列 CharSequence这个序列。

StringBuffer insert(int offset, double d)

在此序列中插入 double参数的字符串表示形式。

StringBuffer insert(int offset, float f)

在此序列中插入 float参数的字符串表示形式。

StringBuffer insert(int offset, int i)

将第二个 int参数的字符串表示插入到此序列中。

StringBuffer insert(int offset, long l)

在此序列中插入 long参数的字符串表示形式。

StringBuffer insert(int offset, Object obj)

Object参数的字符串表示插入到此字符序列中。

StringBuffer insert(int offset, String str)

将字符串插入到此字符序列中。

int lastIndexOf(String str)

返回指定子字符串最右边出现的字符串内的索引。

int lastIndexOf(String str, int fromIndex)

返回指定子字符串最后一次出现的字符串中的索引。

int length()

返回长度(字符数)。

int offsetByCodePoints(int index, int codePointOffset)

返回此序列中与 indexcodePointOffset代码点偏移的索引。

StringBuffer replace(int start, int end, String str)

用指定的String中的字符替换此序列的子字符串中的 String

StringBuffer reverse()

导致该字符序列被序列的相反代替。

void setCharAt(int index, char ch)

指定索引处的字符设置为 ch

void setLength(int newLength)

设置字符序列的长度。

CharSequence subSequence(int start, int end)

返回一个新的字符序列,该序列是该序列的子序列。

String substring(int start)

返回一个新的 String ,其中包含此字符序列中当前包含的字符的子序列。

String substring(int start, int end)

返回一个新的 String ,其中包含此序列中当前包含的字符的子序列。

String toString()

返回表示此顺序中的数据的字符串。

void trimToSize()

尝试减少用于字符序列的存储。

三者的区别:

         1)对于直接相加字符串,效率很高,因为在编译器便确定了它的值,也就是说形如"I"+"love"+"java"; 的字符串相加,在编译期间便被优化成了"Ilovejava"。这个可以用javap -c命令反编译生成的class文件进行验证。

  对于间接相加(即包含字符串引用),形如s1+s2+s3; 效率要比直接相加低,因为在编译器不会对引用变量进行优化。

  2)String、StringBuilder、StringBuffer三者的执行效率:

  StringBuilder > StringBuffer > String

  当然这个是相对的,不一定在所有情况下都是这样。

  比如String str = "hello"+ "world"的效率就比 StringBuilder st  = new StringBuilder().append("hello").append("world")要高。

  因此,这三个类是各有利弊,应当根据不同的情况来进行选择使用:

  当字符串相加操作或者改动较少的情况下,建议使用 String str="hello"这种形式;

  当字符串相加操作较多的情况下,建议使用StringBuilder,如果采用了多线程,则使用StringBuffer。

参考文章:https://www.cnblogs.com/dolphin0520/p/3778589.html

猜你喜欢

转载自blog.csdn.net/weixin_40879743/article/details/88927276