1、String
-
public final class String extends Object implements Serializable, Comparable<String>, CharSequence
String
类代表字符串。 Java程序中的所有字符串文字(例如"hello"
)都被实现为此类的实例。
字符串不变; 它们的值在创建后不能被更改。 字符串缓冲区支持可变字符串。 因为String对象是不可变的,它们可以被共享。
例如:
String str = "hello";
相当于:
char d[] = {'h', 'e', 'l', 'l', 'o'}; String str = new String(d);
构造方法:
String() 初始化新创建的 |
String(byte[] bytes) 通过使用平台的默认字符集解码指定的字节数组来构造新的 |
String(byte[] bytes, Charset charset) 构造一个新的 |
String(byte[] ascii, int hibyte) 已弃用 此方法无法将字节正确转换为字符。 从JDK 1.1开始,首选的方法是通过 |
String(byte[] bytes, int offset, int length) 通过使用平台的默认字符集解码指定的字节子阵列来构造新的 |
String(byte[] bytes, int offset, int length, Charset charset) 构造一个新的 |
String(byte[] ascii, int hibyte, int offset, int count) 已弃用 此方法无法将字节正确转换为字符。 从JDK 1.1开始,首选的方式是通过 |
String(byte[] bytes, int offset, int length, String charsetName) 构造一个新的 |
String(byte[] bytes, String charsetName) 构造一个新的 |
String(char[] value) 分配一个新的 |
String(char[] value, int offset, int count) 分配一个新的 |
String(int[] codePoints, int offset, int count) 分配一个新的 |
String(String original) 初始化新创建的 |
String(StringBuffer buffer) 分配一个新的字符串,其中包含当前包含在字符串缓冲区参数中的字符序列。 |
String(StringBuilder builder) 分配一个新的字符串,其中包含当前包含在字符串构建器参数中的字符序列。 |
方法:
char |
charAt(int index) 返回 |
int |
codePointAt(int index) 返回指定索引处的字符(Unicode代码点)。 |
int |
codePointBefore(int index) 返回指定索引之前的字符(Unicode代码点)。 |
int |
codePointCount(int beginIndex, int endIndex) 返回此 |
int |
compareTo(String anotherString) 按字典顺序比较两个字符串。 |
int |
compareToIgnoreCase(String str) 按字典顺序比较两个字符串,忽略病例差异。 |
String |
concat(String str) 将指定的字符串连接到该字符串的末尾。 |
boolean |
contains(CharSequence s) 当且仅当此字符串包含指定的char值序列时才返回true。 |
boolean |
contentEquals(CharSequence cs) 将此字符串与指定的CharSequence进行 |
boolean |
contentEquals(StringBuffer sb) 将此字符串与指定的StringBuffer进行 |
static String |
copyValueOf(char[] data) 相当于 |
static String |
copyValueOf(char[] data, int offset, int count) |
boolean |
endsWith(String suffix) 测试此字符串是否以指定的后缀结尾。 |
boolean |
equals(Object anObject) 将此字符串与指定对象进行比较。 |
boolean |
equalsIgnoreCase(String anotherString) 将此 |
static String |
format(Locale l, String format, Object... args) 使用指定的区域设置,格式字符串和参数返回格式化的字符串。 |
static String |
format(String format, Object... args) 使用指定的格式字符串和参数返回格式化的字符串。 |
byte[] |
getBytes() 使用平台的默认字符集将此 |
byte[] |
getBytes(Charset charset) 使用给定的charset将该 |
void |
getBytes(int srcBegin, int srcEnd, byte[] dst, int dstBegin) 已弃用 此方法无法将字符正确转换为字节。 从JDK 1.1开始,首选的方法是通过 |
byte[] |
getBytes(String charsetName) 使用命名的字符集将此 |
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() 返回 |
static String |
join(CharSequence delimiter, CharSequence... elements) 返回一个新的字符串,由 |
static String |
join(CharSequence delimiter, Iterable<? extends CharSequence> elements) 返回一个新 |
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) 返回此 |
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) 返回从替换所有出现的导致一个字符串 |
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 |
toLowerCase(Locale locale) 将所有在此字符 |
String |
toString() 此对象(已经是字符串!)本身已被返回。 |
String |
toUpperCase() 将所有在此字符 |
String |
toUpperCase(Locale locale) 将所有在此字符 |
String |
trim() 返回一个字符串,其值为此字符串,并删除任何前导和尾随空格。 |
static String |
valueOf(boolean b) 返回 |
static String |
valueOf(char c) 返回 |
static String |
valueOf(char[] data) 返回 |
static String |
valueOf(char[] data, int offset, int count) 返回 |
static String |
valueOf(double d) 返回 |
static String |
valueOf(float f) 返回 |
static String |
valueOf(int i) 返回 |
static String |
valueOf(long l) 返回 |
static String |
valueOf(Object obj) 返回 |
2、StringBuilder
java.lang.StringBuilder
1.一个可变的字符序列。 此类提供与StringBuffer
的API,但不保证同步。StringBuilder的主要StringBuilder
是append
和insert
方法,它们是重载的,以便接受任何类型的数据。 每个都有效地将给定的数据转换为字符串,然后将该字符串的字符附加或插入字符串构建器。 append
方法始终在构建器的末尾添加这些字符; insert
方法将insert
添加到指定点。
2.StringBuilder的StringBuilder
不能安全使用多线程。 如果需要同步, 那么建议使用StringBuffer
。
3.除非另有说明,否则将null
参数传递给null
中的构造函数或方法将导致抛出NullPointerException
构造方法:
StringBuilder() 构造一个没有字符的字符串构建器,初始容量为16个字符。 |
StringBuilder(CharSequence seq) 构造一个包含与指定的相同字符的字符串构建器 |
StringBuilder(int capacity) 构造一个没有字符的字符串构建器,由 |
StringBuilder(String str) 构造一个初始化为指定字符串内容的字符串构建器。 |
方法:
StringBuilder |
append(boolean b) 将 |
StringBuilder |
append(char c) 将 |
StringBuilder |
append(char[] str) 将 |
StringBuilder |
append(char[] str, int offset, int len) 将 |
StringBuilder |
append(CharSequence s) 将指定的字符序列追加到此 Appendable 。 |
StringBuilder |
append(CharSequence s, int start, int end) 追加指定的序列 |
StringBuilder |
append(double d) 将 |
StringBuilder |
append(float f) 将 |
StringBuilder |
append(int i) 将 |
StringBuilder |
append(long lng) 将 |
StringBuilder |
append(Object obj) 追加 |
StringBuilder |
append(String str) 将指定的字符串附加到此字符序列。 |
StringBuilder |
append(StringBuffer sb) 将指定 |
StringBuilder |
appendCodePoint(int codePoint) 将 |
int |
capacity() 返回当前容量。 |
char |
charAt(int index) 返回 |
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) 删除 |
void |
ensureCapacity(int minimumCapacity) 确保容量至少等于规定的最小值。 |
void |
getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 字符从该序列复制到目标字符数组 |
int |
indexOf(String str) 返回指定子字符串第一次出现的字符串内的索引。 |
int |
indexOf(String str, int fromIndex) 返回指定子串的第一次出现的字符串中的索引,从指定的索引开始。 |
StringBuilder |
insert(int offset, boolean b) 将 |
StringBuilder |
insert(int offset, char c) 在此序列中插入 |
StringBuilder |
insert(int offset, char[] str) 在此序列中插入 |
StringBuilder |
insert(int index, char[] str, int offset, int len) 在此序列中插入 |
StringBuilder |
insert(int dstOffset, CharSequence s) 将指定的 |
StringBuilder |
insert(int dstOffset, CharSequence s, int start, int end) 将指定的CharSequence的子 |
StringBuilder |
insert(int offset, double d) 在此序列中插入 |
StringBuilder |
insert(int offset, float f) 在此序列中插入 |
StringBuilder |
insert(int offset, int i) 将第二个 |
StringBuilder |
insert(int offset, long l) 在此序列中插入 |
StringBuilder |
insert(int offset, Object obj) 将 |
StringBuilder |
insert(int offset, String str) 将字符串插入到此字符序列中。 |
int |
lastIndexOf(String str) 返回指定子字符串最右边出现的字符串内的索引。 |
int |
lastIndexOf(String str, int fromIndex) 返回指定子字符串最后一次出现的字符串中的索引。 |
int |
length() 返回长度(字符数)。 |
int |
offsetByCodePoints(int index, int codePointOffset) 返回此序列中与 |
StringBuilder |
replace(int start, int end, String str) 用指定的String中的字符替换此序列的子字符串中的 |
StringBuilder |
reverse() 导致该字符序列被序列的相反代替。 |
void |
setCharAt(int index, char ch) 指定索引处的字符设置为 |
void |
setLength(int newLength) 设置字符序列的长度。 |
CharSequence |
subSequence(int start, int end) 返回一个新的字符序列,该序列是该序列的子序列。 |
String |
substring(int start) 返回一个新的 |
String |
substring(int start, int end) 返回一个新的 |
String |
toString() 返回表示此顺序中的数据的字符串。 |
void |
trimToSize() 尝试减少用于字符序列的存储。 |
3、StringBuffer
java.lang.StringBuffer
线程安全,可变的字符序列。 字符串缓冲区就像一个String
,但可以修改。 在任何时间点,它包含一些特定的字符序列,但可以通过某些方法调用来更改序列的长度和内容。
字符串缓冲区可以安全地被多个线程使用。 这些方法在必要时进行同步,以便任何特定实例上的所有操作都按照与所涉及的各个线程所执行的方法调用顺序一致的顺序发生。
StringBuffer的主要StringBuffer
是append
和insert
方法,它们被重载以便接受任何类型的数据。 每个都有效地将给定的数据转换为字符串,然后将该字符串的字符附加或插入到字符串缓冲区。 append
方法总是在缓冲区的末尾添加这些字符; insert
方法将insert
添加到指定点。
每当涉及源序列(例如从源序列追加或插入)的操作发生时,该类仅在执行操作的字符串缓冲器上进行同步,而不在源上。 请注意,虽然StringBuffer
被设计为可以安全地从多个线程并发使用,但如果构造函数或append
或insert
操作被传递通过线程共享的源序列,则调用代码必须确保该操作具有一致且不变的视图在操作期间的源序列。 呼叫者通过使用不可变的源序列,或者不跨线程共享源序列,可以在呼叫期间持有锁来满足这一点。
每个字符串缓冲区都有一个容量。 只要字符串缓冲区中包含的字符序列的长度不超过容量,就不必分配新的内部缓冲区数组。 如果内部缓冲区溢出,则会自动变大。
除非另有说明,否则将null
参数传递给null
中的构造函数或方法将导致抛出NullPointerException
构造方法:
StringBuffer() 构造一个没有字符的字符串缓冲区,初始容量为16个字符。 |
StringBuffer(CharSequence seq) 构造一个包含与指定的相同字符的字符串缓冲区 |
StringBuffer(int capacity) 构造一个没有字符的字符串缓冲区和指定的初始容量。 |
StringBuffer(String str) 构造一个初始化为指定字符串内容的字符串缓冲区。 |
方法:
StringBuffer |
append(boolean b) 将 |
StringBuffer |
append(char c) 将 |
StringBuffer |
append(char[] str) 将 |
StringBuffer |
append(char[] str, int offset, int len) 将 |
StringBuffer |
append(CharSequence s) 追加指定的 |
StringBuffer |
append(CharSequence s, int start, int end) 追加指定的序列 |
StringBuffer |
append(double d) 将 |
StringBuffer |
append(float f) 将 |
StringBuffer |
append(int i) 将 |
StringBuffer |
append(long lng) 将 |
StringBuffer |
append(Object obj) 追加 |
StringBuffer |
append(String str) 将指定的字符串附加到此字符序列。 |
StringBuffer |
append(StringBuffer sb) 将指定 |
StringBuffer |
appendCodePoint(int codePoint) 将 |
int |
capacity() 返回当前容量。 |
char |
charAt(int index) 返回 |
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) 删除 |
void |
ensureCapacity(int minimumCapacity) 确保容量至少等于规定的最小值。 |
void |
getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 字符从该序列复制到目标字符数组 |
int |
indexOf(String str) 返回指定子字符串第一次出现的字符串内的索引。 |
int |
indexOf(String str, int fromIndex) 返回指定子串的第一次出现的字符串中的索引,从指定的索引开始。 |
StringBuffer |
insert(int offset, boolean b) 在此序列中插入 |
StringBuffer |
insert(int offset, char c) 在此序列中插入 |
StringBuffer |
insert(int offset, char[] str) 在此序列中插入 |
StringBuffer |
insert(int index, char[] str, int offset, int len) 在此序列中插入 |
StringBuffer |
insert(int dstOffset, CharSequence s) 将指定的 |
StringBuffer |
insert(int dstOffset, CharSequence s, int start, int end) 将指定的子序列 |
StringBuffer |
insert(int offset, double d) 在此序列中插入 |
StringBuffer |
insert(int offset, float f) 在此序列中插入 |
StringBuffer |
insert(int offset, int i) 将第二个 |
StringBuffer |
insert(int offset, long l) 在此序列中插入 |
StringBuffer |
insert(int offset, Object obj) 将 |
StringBuffer |
insert(int offset, String str) 将字符串插入到此字符序列中。 |
int |
lastIndexOf(String str) 返回指定子字符串最右边出现的字符串内的索引。 |
int |
lastIndexOf(String str, int fromIndex) 返回指定子字符串最后一次出现的字符串中的索引。 |
int |
length() 返回长度(字符数)。 |
int |
offsetByCodePoints(int index, int codePointOffset) 返回此序列中与 |
StringBuffer |
replace(int start, int end, String str) 用指定的String中的字符替换此序列的子字符串中的 |
StringBuffer |
reverse() 导致该字符序列被序列的相反代替。 |
void |
setCharAt(int index, char ch) 指定索引处的字符设置为 |
void |
setLength(int newLength) 设置字符序列的长度。 |
CharSequence |
subSequence(int start, int end) 返回一个新的字符序列,该序列是该序列的子序列。 |
String |
substring(int start) 返回一个新的 |
String |
substring(int start, int end) 返回一个新的 |
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。