
一、常用方法:
1.构造方法:
可指定offset和length
char数组
可指定offset和count
String
StringBuffer
StrngBuilder
2. 实例方法:
获取字符/码点/字节
charAt(int index char
codePointAt(int index int
getBytes( byte[]
getChars(int srcBegin,int srcEnd,char[] dst,int dstBegin void
toCharArray( char[]
长度
length( int
codePointCount(int beginIndex,int endIndex int
字符串操作
concat(String str String
substring(int beginIndex,int endIndex String
split(String regex String[]
trim( String
toUpperCase(/toLowerCase String
replace(char oldChar,char newChar String
replace(CharSequence target,CharSquence replacement String
replaceAll(String regex,String replacement String
replaceFirst(String regex,String replacement String
判断
contains(CharSequence s boolean
endsWith(String suffix/startsWith(String prefix boolean
equals(Object anObject boolean
public boolean equals(Object anObject {
if (this == anObject {
return true;
}
if (anObject instanceof String {
String anotherString = (StringanObject;
int n = value.length;
if (n == anotherString.value.length {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0 {
if (v1[i] != v2[i]
return false;
i++;
}
return true;
}
}
return false;
} matches(String regex boolean
序号
indexOf(int ch/String str/lastIndexOf(
3. 静态方法:
String.format(String format,Obect... args String
String.valueOf(xxx String
二、底层实现:
jdk1.8中String类型底层就是一个char数组:
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
}三、不可变性:
String最为人所津津乐道的便是它的不可变性(immutable,这里就引出两个问题,String如何做到不可变的,以及不可变的好处。
1. 如何实现不可变:
char数组final,不可变
没有提供任何可以修改数组内容的方法
2. 不可变的好处:
不可变,线程绝对安全
作为参数不可变,更安全
字符串常量池的需要,可以共享而不用担心被谁改变
hash值不可变,只要算一次,可以缓存hash
3. String和StringBuffer和StringBuilder的区别:
String不可变,线程安全
StringBuilder可变,线程不安全
四、缓存池:
1.字符串常量池(String pool)里存放着所有的字符串字面量
String a="aaa";
String b="aaa";
//a,b引用到的String pool里的同一个对象
a==b//true2. new 出来的String对象放在堆区
String a=new String("aaa";
String b=new String("aaa";
a==b//false
a=="aaa"//false
//这里实际是先创建字面量"aaa",再去创建对象的new创建字符串时首先查看池中是否有相同值的字符串,如果有,则拷贝一份到堆中,然后返回堆中的地址;如果池中没有,则在堆中创建一份,然后返回堆中的地址(注意,此时不需要从堆中复制到池中,否则,将使得堆中的字符串永远是池中的子集,导致浪费池的空间)!
public String(String original { this.value = original.value; this.hash = original.hash; }
String str=new String("123"创建了几个对象的问题
在类加载的过程中,确实在运行时常量池中创建了一个"abc"对象,而在代码执行过程中确实只创建了一个String对象(堆上。
3. intern(方法
先判断字符串常量池里是否已经有了这个字符串,如果有就返回常量池中该字符串的引用,没有就在常量池中添加并返回常量池中的引用。
String a=new String("aaa";
a=="aaa"//false
a=a.intern(
a=="aaa"//true