String的源码分析
从一段代码说起
|
|
下面我们从源码看String的具体实现(本文是jdk1.8)。
String的初始化
String类的属性包含一个不可变的char数组用来存放字符串,一个int型的变量hash用来存放计算后的哈希值
|
|
String构造函数
public String()
public String(String original)
public String(char value[])
public String(char value[], int offset, int count)
public String(int[] codePoints, int offset, int count)
public String(byte bytes[], int offset, int length, Charset charset)
public String(byte bytes[], int offset, int length, String charsetName)
public String(byte bytes[], int offset, int length, Charset charset)
public String(byte bytes[], String charsetName)
public String(byte bytes[], Charset charset)
public String(byte bytes[], int offset, int length)
public String(byte bytes[])
public String(StringBuffer buffer)
public String(StringBuilder builder)
String(char[] value, boolean share)
String常用方法
equals方法
|
|
equals的判断规则:
内存地址相同,则为真。
如果对象类型不是String类型,则为假。否则继续判断。
如果对象长度不相等,则为假。否则继续判断。
从后往前,判断String类中char数组value的单个字符是否相等,有不相等则为假。如果一直相等直到第一个数,则返回真。
compareTo 方法
|
|
先从0开始判断字符大小,如果两个对象能比较字符的地方比较完了还相等,就直接返回自身长度减被比较对象长度,如果两个字符串长度相等,则返回的是0,巧妙地判断了三种情况。
startsWith方法
boolean startsWith(String prefix)
boolean startsWith(String prefix, int toffset)
boolean endsWith(String suffix)
|
|
hashCode方法
|
|
substring方法
String substring(int beginIndex)
String substring(int beginIndex, int endIndex)
|
|
concat方法
|
|
replace方法
|
|
contains方法
|
|
split方法
|
|
trim方法
|
|
toCharArray方法
|
|
valueOf方法
|
|
intern方法
|
|
intern方法是Native调用,它的作用是在方法区中的常量池里通过equals方法寻找等值的对象,如果没有找到则在常量池中开辟一片空间存放字符串并返回该对应String的引用,否则直接返回常量池中已存在String对象的引用。
|
|
其他方法
|
|
String对象的三种比较方式:
==内存比较:直接对比两个引用所指向的内存值,精确简洁直接明了。
equals字符串值比较:比较两个引用所指对象字面值是否相等。
hashCode字符串数值化比较:将字符串数值化。两个引用的hashCode相同,不保证内存一定相同,不保证字面值一定相同。