java中String类详解
- 一、概述
- 二、字段值
- 三、构造方法
- 四、常用方法
- 五、StringBuffer、StringBuilder类
- 1.StringBuffer
- 2.StringBuilder
一、概述
- java中String是一个final修饰的类,所以它不能被继承,代表不可变的字符序列;
- 所有字符串都是String的实例;
- String是常量,用双引号引来表示,它的值在创建后不可改变。
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
private final byte[] value;//内部存储数据的字符数组
private final byte coder;//用于对中的字节进行编码的编码的标识符
private int hash; // Default to 0,缓存字符串的hash值
...
}
二、字段值
static Comparator CASE_INSENSITIVE_ORDER
由compareToIgnoreCase订购String对象的比较compareToIgnoreCase 。 该比较器是可序列化的。
三、构造方法
- public String():初始化新创建的String对象,使其表示空字符序列。 请注意,由于字符串是不可变的,因此不必使用此构造函数
public String(){
this.value = "".value;
this.coder = "".coder;
}
- public String(String original):初始化新创建的String对象,使其表示与参数相同的字符序列; 换句话说,新创建的字符串是参数字符串的副本。
public String(String original) {
this.value = original.value;
this.coder = original.coder;
this.hash = original.hash;
}
- public String(char[] value):分配新的 String ,使其表示当前包含在字符数组参数中的字符序列。根据重载的构造方法来创建。
public String(char value[]) {
this(value, 0, value.length, null);//调用自身的构造方法
}
//构造器内调用的构造方法
String(char[] value, int off, int len, Void sig) {
if (len == 0) {
this.value = "".value;
this.coder = "".coder;
return;
}
if (COMPACT_STRINGS) {
byte[] val = StringUTF16.compress(value, off, len);
if (val != null) {
this.value = val;
this.coder = LATIN1;
return;
}
}
this.coder = UTF16;
this.value = StringUTF16.toBytes(value, off, len);
}
- Void类 是一个不可实例化的占位符类,用于保存对表示Java关键字的{@code Class}对象的引用
- String(char[] value, int offset, int count):分配新的String,使其表示参数字符数组的子数组的字符序列。
value - 作为字符源的数组
offset - 初始偏移量
count - 长度
public String(char value[], int offset, int count) {
this(value, offset, count, rangeCheck(value, offset, count));
}
//检查数组的区间合理,如果合理就返回null
private static Void rangeCheck(char[] value, int offset, int count) {
checkBoundsOffCount(offset, count, value.length);
return null;
}
//检查count长度越界问题
static void checkBoundsOffCount(int offset, int count, int length) {
if (offset < 0 || count < 0 || offset > length - count) {
throw new StringIndexOutOfBoundsException(
"offset " + offset + ", count " + count + ", length " + length);
}
}
- String(StringBuffer buffer):创建包含当前包含在字符串缓冲区buffer参数中的字符序列。
- String(StringBuilder builder):创建包含当前包含在builder参数中的字符序列。
- String(byte[] bytes):使用平台默认字符集解码字节数组bytes构造String
- String(byte[] bytes,String charsetName),String(byte[] bytes, int offset, int length, String charsetName):使用指定的字符集解码charsetName来解码字节并构造成String;
- String(byte[] bytes, Charset charset):构造一个新的String由指定用指定的字节的数组解码charset 。
四、常用方法
- charAt(int index):返回指定索引位置的char值
- length():返回字符串长度
- isEmpty():判断是否为空串
- toLowerCase():转为小写
- toUpperCase():转为大写
- trim() :返回字符串副本,忽略前导和尾部空白
- equals(Object obj):比较字符串内容
- equalsIgnoreCase(String otherString):与equals类似,但忽略大小写
- concat(String str):与+ 等同
- int compareTo(String otherString):按字典顺序比较两个字符串大小
- subString(int beginIndex):返回新的字符串,是对原字符串从beginIndex开始到最后的截取
- subString(int beginIndex,int endIndex)
返回新的字符串,是对原字符串从beginIndex开始到endIndex(不包含)的截取 - boolean endsWith(String suffix),startsWith(String prefix)
是否以指定的前缀开始或者指定的后缀结尾 - startsWith(String prefix,int offset)
测试此字符串从指定索引位置开始是以指定前缀开始的 - contains(CharSequence s)
判断此字符串是否包含指定char值,因为String实现了CharSequence,所以char传入字符串就可以 - indexOf(String str)
第一次出现字符串str的索引 - indexOf(String s,int fromIndex)
指定位置开始第一次出现s的索引 - lastIndexOf(String str)
最后一次,最右边出现str的索引 - replace(Char oldChar,Char newChar)
返回一个新字符串,将oldChar全部换为newChar - replace(CharSequence target,CharSequence replacement)
用后者替换前者,参数也为String - replaceAll(String regex,String replcement)
使用replacement替换所有匹配正则表达式的子字符串 - replaceFirst(String regex,String replacement)
使用replacement替换第一个匹配正则表达式的子字符串 - boolean matches(String regex)
告知此字符串是否符合正则表达式 - String[] split(String regex)
根据正则表达式拆分字符串 - String[] split(String regex,int limit)
根据正则表达式拆分字符串放到字符串数组中,最多不超过limit,超过的全放在最后一个数组中
五、StringBuffer、StringBuilder类
1.StringBuffer
- 概述:继承AbstractStringBuilder类
- 对字符串内容进行增删,不会产生新对象。
- 方法与String类似
- 作为参数传递时,方法内部可以改变值
- 线程安全
public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, Comparable<StringBuffer>, CharSequence
{
...
}
abstract class AbstractStringBuilder implements Appendable, CharSequence {
/**
* The value is used for character storage.
*/
byte[] value;没有final,可以扩容,改变
/**
* The id of the encoding used to encode the bytes in {@code value}.
*/
byte coder;
/**
* The count is the number of characters used.
*/
int count;记录有效字符个数
....
}
- 构造方法
三个构造器
- StringBuffer():初始容量为16的字符串缓冲区
- StringBuffer(int capacity):构造指定容量的字符串缓冲区
- StringBuffer(CharSequence seq)
StringBuffer(String str):将内容初始化为指定字符串内容
- 方法
- append:拼接
- delete(start,end):删除指定位置的内容
- replace(start,end,str):把指定位置替换为str
- insert(offset,xxx):在指定位置插入xxx
- reverse():当前字符序列逆转
- indexOf、substring、length、charAt、setCharAt
2.StringBuilder
StringBuilder和StringBuffer类似
String、StringBuild、StringBuffer区别
- String(jdk1.0):不可变字符序列
- StringBuffer(jdk1.0):可变字符系列、效率低、线程安全
- StringBuilder(jdk5.0):可变字符序列、效率高、线程不安全
作为参数传递,方法内部String不会改变值,其他两个会改变值