String的使用很广泛,基本哪里都会碰见他的踪影,所以我对String进行一次较为深入的学习,并且记录下来,希望帮助到大家。本片博客主要是自己的String方法的使用,以及个别方法的源码剖析,希望能与大家共同进步。
public char charAt(int index):获取第几个字符。
String method_c = new String(“ ABCDEF”);
System.out.println(method_c.charAt(1)); //B
源码:判断下标有没有溢出,返回下标所指引的值。
public char charAt(int index) {
if ((index < 0) || (index >= value.length)) {
throw new StringIndexOutOfBoundsException(index);
}
return value[index];
}
public int offsetByCodePoints(int index, int codePointOffset):index是下标,codePointOffset是偏移量。
public int codePointAt(int index):返回下标所指引的字符的Unicode码。
String method_c = new String("ABCDEF");
System.out.println(method_c.codePointAt(1)); //66
源码:判断有没有溢出,调用Character.codePointAtImpl()返回Unicode码
public int codePointAt(int index) {
if ((index < 0) || (index >= value.length)) {
throw new StringIndexOutOfBoundsException(index);
}
return Character.codePointAtImpl(value, index, value.length);
}
int codePointBefore(inr index):返回下标index-1的字符Unicode码。
String method_c = new String("ABCDEF");
System.out.println(method_c.codePointBefore(1)); //65
源码:这里很明显看到对象是针对index-1来判断是否溢出。
public int codePointBefore(int index) {
int i = index - 1;
if ((i < 0) || (i >= value.length)) {
throw new StringIndexOutOfBoundsException(index);
}
return Character.codePointBeforeImpl(value, index, 0);
}
int compareTo(String antherString):返回的是第一个有差异的字符的Unicode的差值。若无差异,返回字符串长度差。
String method_c = new String(“ ABCDEF”);
System.out.println(method_c.compareTo( “DBCdEF”)); // - 3
源码:一遇到有差异的字符则立即返回他们的统一码的差值。
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;
}
public int compareToIgnoreCase(String str) :忽略大小写之后再进行比较,比较差异,第一个字符差异马上返回差值。
String method_c = new String("ABCDEF");
System.out.println(method_c.compareToIgnoreCase("bbcdeF")); //-1
public String concat(String str):在尾部添加拼接字符串。
String method_c = new String("ABCDEF");
System.out.println(method_c.concat("GHIJ"));
源码:用字符串先开辟一个char[]字符数组,再将新的字符串添加到char[]中,再用这个合并的字符数组创建一个新的字符串对象。
public String concat(String str) {
int otherLen = str.length();
if (otherLen == 0) {
return this;
}
int len = value.length;
char buf[] = Arrays.copyOf(value, len + otherLen);
str.getChars(buf, len);
return new String(buf, true);
}
public boolean contains(CharSequence s):判断是否包含该字符,区别大小写
String method_c = new String(“ ABCDEF”);
System.out.println(method_c.contains("F")); //true
System.out.println(method_c.contains("f")); //false
public boolean contentEquals(CharSequence cs):true如果这个 String表示与指定序列相同的char值序列.
System.out.println(method_c.contentEquals("ABCDEF")); //true
System.out.println(method_c.contentEquals("aBCDEF")); //false
源码:就是先比较一下长度,再比较一下每个字符是否相等。
public boolean contentEquals(StringBuffer sb):只是参数类型换了,而且他的源码只是强转一下数据类型然后就调用上一个方法的源码。
public boolean equals(Object anObject) :这是大家最熟悉的比较内容的方法了
System.out.println(method_c.equals("ABCDEF")); //true
源码;首先比较是否引用同一个内存地址,如果不是则将两个字符串转成char[],再逐一比较。
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof 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;
i++;
}
return true;
}
}
return false;
}
public boolean startsWith(String prefix):判断是否以某个字符开头。
public boolean startsWith(String prefix, int toffset):从某个位置开始,判断是否为某个字符开头。
public boolean endsWith(String suffix):判断是否以该字符结尾。
System.out.println(method_c.endsWith("F")); //ture
源码:就是将字符串的取值定在对比字符串的开头,再调用startsWith的源码进行处理。
public boolean endsWith(String suffix) {
return startsWith(suffix, value.length - suffix.value.length);
}
public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin):这个就是复制字符串的的某些部分到char[]指定的位置中去,可以替换char[]的某些字符。
char[] chars = new char[6];
//String开始复制的位置,String结束复制的位置,char[],开始插入的位置。
method_c.getChars(0,6,chars,0);
System.out.println(chars);//ABCDEF
public int hashCode():返回一个hash值,之后就不知道有什么用了。
System.out.println(method_c.hashCode());//1923910755
public int indexOf():返回顺序查找到第一个的char或者String的下标。
public int lastIndexOf():返回逆序查找到第一个的char或者String的下标。
public boolean isEmpty():判断是不是为空值,源码是判断长度是否为0,所以“ ”这种只有空格的字符串的返回值是false。
public boolean regionMatches(int toffset, String other, int ooffset,int len):原字符串的起始位置,对比的字符串,对比字符串的起始位置,对比长度。 比较某一范围的内容是否相同。
String method_c = new String("ABCDEF");
System.out.println(method_c.regionMatches(1,"ABF",1,2));//false
public boolean regionMatches(boolean ignoreCase, int toffset,String other, int ooffset, int len):相上面的那个就是会不会忽略大小写的影响。
public String[] split(String regex):按某字符分隔开字符串。注意:. 以小数点作为分隔符会失败的。
public String[] split(String regex, int limit) ::按某字符分隔开字符串,后面一个参数limit是限定分割成几块的。注意:. 以小数点作为分隔符会失败的。
public String substring(int beginIndex):分割某个位置到最后的子字符串。以创建一个新的String进行返回。
public String substring(int beginIndex, int endIndex) :分割某一段区域的子字符串。以创建一个新的String进行返回。
public String trim():去除字符串两边的空格。