1,Java中的String位于lang包下,通过阅读源码可知
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[]; /** Cache the hash code for the string */ private int hash; // Default to 0
String实现了三个接口,并且由final修饰,final修饰符保证了此类不会被继承,也就是说不能通过子类改变此欸中的方法或者属性,保证了其安全性
2,查看api文档,可知
-
String
类代表字符串。 Java程序中的所有字符串文字(例如"abc"
)都被实现为此类的实例。
- 字符串不变; 它们的值在创建后不能被更改。 字符串缓冲区支持可变字符串。 因为String对象是不可变的,它们可以被共享。 例如:
String str = "abc";
相当于
char data[] = {'a', 'b', 'c'}; String str = new String(data);
并且通过源码可知,Java中String实质上相当于字符数组,
api中还有一句话
Java语言为字符串连接运算符(+)提供特殊支持,并为其他对象转换为字符串。 字符串连接是通过StringBuilder
(或StringBuffer
)类及其append
方法实现的。
可知通过 '+'号来拼接字符串实质上是通过StringBuilder或者StringBuffer两个字符缓冲数组来拼接,而StringBuilder或StringBuffer两个方法实质上是由一个新创建的字符数组,通过System包下的arraycopy方法将原来字符串的重新拷贝得到的。方法源码如下
* @param src the source array. * @param srcPos starting position in the source array. * @param dest the destination array. * @param destPos starting position in the destination data. * @param length the number of array elements to be copied. public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
3,String的一些常用方法
构造方法
String(char[] value)
String
,以便它表示当前包含在字符数组参数中的字符序列。 int compareTo(String anotherString) //按字典顺序比较两个字符串。
此方法因继承comparable接口得来
源码如下
public int compareTo(String anotherString) { int len1 = value.length; int len2 = anotherString.value.length; int lim = Math.min(len1, len2); char v1[] = value; char v2[] = anotherString.value; int k = 0; while (k < lim) { char c1 = v1[k]; char c2 = v2[k]; if (c1 != c2) { return c1 - c2; } k++; } return len1 - len2; }
通过字符数组的一个个字符相减来判断是否一致,一旦一个结果不为0则返回相减的结果、
String[] split(String regex) //将此字符串分割为给定的正则表达式的匹配。
String[] split(String regex, int limit) //将此字符串分割为给定的正则表达式的匹配。例如limit为2,那么数组的长度最长为2
String substring(int beginIndex)返回一个字符串,该字符串是此字符串的子字符串。
String
substring(int beginIndex, int endIndex) //
4,String, StringBuffer,StringBuilder
StringBuffer,StringBuilder是一个字符缓冲数组,当然String通过 '+' 来拼接字符串,也是通过 StringBuffer或者StringBuilder
通过查看StringBuffer源码得知
/**
* Constructs a string buffer with no characters in it and an
* initial capacity of 16 characters.
*/
public StringBuffer() {
super(16);
}
进入父类构造
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
无参构造创建了一个容量为16的字符数组
查看其append方法源码,加了synchronized关键字,所以线程安全,用在多线程环境中,而
@Override public synchronized StringBuffer append(String str) { toStringCache = null; super.append(str); return this; }
而StringBuilder的append方法没有synchronized关键字所以线程不安全,用在单线程环境中,当然,相比较,StringBuilder比StringBuffer更高,应为没有锁
@Override public StringBuilder append(String str) { super.append(str); return this; }