java.lang.String分析摘要:
<1>getBytes方法
<2>equals()
<3>contentEquals(StringBuffer sb)
<4>contentEquals(CharSeqence cs)
<5>nonSyncContentEquals(AbstractStringBuulder sb)
1.getBytes方法
该方法已经过时,因为非英文字母在char转成byte时,会有数据缺失
//【已过时】将字符串的某个节段的char转换成byte,赋给目标byte数组dest
//srcBegin:字符串开始转换的下标
//srcEnd:字符串结束转换的下标(不包含)
//dest[]:目标byte数组
//destBegin:目标byte数组开始复制的位置
@Deprecated
public void getBytes(int srcBegin, int srcEnd, byte dst[], int dstBegin) {
if (srcBegin < 0) {
throw new StringIndexOutOfBoundsException(srcBegin);
}
if (srcEnd > value.length) {
throw new StringIndexOutOfBoundsException(srcEnd);
}
if (srcBegin > srcEnd) {
throw new StringIndexOutOfBoundsException(srcEnd - srcBegin);
}
Objects.requireNonNull(dst);
int j = dstBegin;
int n = srcEnd;
int i = srcBegin;
char[] val = value; /* avoid getfield opcode */
while (i < n) {
dst[j++] = (byte)val[i++];
}
}
//用指定的编码集将字符串编码,然后将编码后的byte数组返回
//charSetName:字符集名称,用于将字符串编码
public byte[] getBytes(String charsetName) throws UnsupportedEncodingException {
if (charsetName == null)
throw new NullPointerException();
return StringCoding.encode(charsetName, value, 0, value.length);
}
//使用平台默认的字符集将字符串编码成字节序列,然后将其返回
public byte[] getBytes(){
return StringCoding.encode(value,0,value.length);
}
该方法的主要作用是:第一个重载方法getBytes(int srcBegin, int srcEnd, byte dest[] , int destBegin)方法中讲字符串编码是按照平台默认的Unicode字符集
方法来编码的,并且在转换的过程中,只会保留最低8位的数据,其他数据将会被舍弃。所以这个方法转换成byte是有问题的。
2. equals()方法
equals方法是Object中的方法,这边String类对equals进行了重写。
public boolean equals(Object anObject){
//如果比较的对象就是本身的话,返回true
if(this == anObject){
return true;
}
if(anObject istanceof String){
String anotherString = (String) anObject;
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;
}
}
}
}
return false;
}
这个方法是的属性有:public公有。
异常:NullPointerException
异常说明:如果this本身为null的话,调用该方法会抛出空指针异常。
返回值:boolean
返回值说明:如果字符串相等,则返回true,否则返回false
该方法的总结:String类的在调用这个方法的时候,要保证自身不为null,所以我们要自己注意一下,适当地做非null校验。
该源码的思路是:
<1>先判断实参是否属于本身,如果是则返回true。
<2>将实参强转成String对象,如果两者的长度不相等,则返回false。
<3>比较两者的value【char数组】,按顺序比较,一有不相等就返回false。
3.contentEquals(StringBuffer sb)
该方法是将字符串和实参StringBuffer中的缓冲字符进行比较。
public boolean contentEquals(StrngBuffer sb){
return contentEquals((charSequence)sb);
}
这个方法是的属性有:public公有。
返回值:boolean
返回值说明:当且仅当字符串和字符串缓冲实参具有相同字符序列时返回true。
该方法的注意点:该方法会调用contentEquals(charSequence cs)方法,如果传进来的StringBuffer对象,则会进行同步操作,保证多线程数据的安全性。如果传进来的是StringBuilder的话,则不会进行加锁操作保证多线程数据的安全性。
4. contentEquals(CharSequence cs)方法
该方法是比较字符串和实参是否具有相同的字符序列,有且仅当两者相同时返回true。
public boolean contentEquals(CharSequence cs){
//如果实参StringBuffer或StringBuilder
if(cs instanceof AbstractStringBuilder){
if(cs instanceof StringBuilder){
synchronized(cs){
return nonSyncContentEquals((AbstractStringBuilder)cs);
}
}else{
return nonSyncContentEquals((AbstractStringBuilder)cs);
}
}
//如果实参是String
if(cs instanceof String){
return equals(cs);
}
//如果实参是平常的字符序列
char[] v1 = value;
int n = v1.length;
if(n != cs.length()){
return false;
}
for(int i=0; i<n ; i++){
if(v1[i] != cs.charAt(i)){
return false;
}
}
return true;
}
这个方法是的属性有:public公有。
返回值:boolean
返回值说明:当且仅当字符串和实参的字符序列相等时返回true,否则返回false。
该方法的主要作用是:比较字符串和实参序列,如果相同,则返回true,否则返回false。
该方法的思路为:
<1>判断传进来的实参是否属于StringBuffer或S他ringBuild,如果是则调用nonSyncContentEquals(AbstractStringBuilder cs)方法。该方法见下个详解。
<2>判断传进来的实参是否属于String类,如果是调用equals()方法返回结果。
<3>判断传进来的实参是否属于普通的字符序列,如果是的话,比较两者的长度,如果长度不等则返回false。
<4>依次判断字符串和实参的字符序列是否相等,如果不等,则返回false。否则返回true。
5. nonSyncContentEquals(AbstractStringBuilder sb)方法
该方法是用来比较字符串和实参sb是否具有相同的字符顺序。
//该方法是私有的,要注意使用范围
//此方法对StringBuffer同步
private boolean nonSyncContentEquals(AbstractStringBuilder sb){
char[] v1 = value;
char[] v2 = sb.getValue();
int n = value.length;
if(n != sb.length()){
return false;
}
if(int i=0; i<n ;i++){
if(v1[i] != v2[i]){
return false;
}
}
}
这个方法是的属性有:private私有。
返回值:boolean
返回值说明:当且仅当字符串和实参的字符序列相等时返回true,否则返回false。
该方法的主要作用是:比较字符串和实参序列,如果相同,则返回true,否则返回false。
该方法的思路为:
<1>判断长度是否相等。
<2>依次判断每个字符是否相等,不相等返回false。
<3>若都不满足,则返回true。