文章目录
- 一、底层实现
- 三、方法展示
- 1.创建一个String
- 2.通用方法
- isEmpty()
- int length()
- char charAt(int index)
- int codePointAt(int index)
- int codePointBefore(int index)
- int codePointCount(int beginIndex, int endIndex)
- int offsetByCodePoints(int index, int codePointOffset)
- boolean equals(Object anObject)
- boolean contentEquals(CharSequence cs)
- boolean equalsIgnoreCase(String anotherString)
- int compareTo(String anotherString)
一、底层实现
private final char value[];
String类型是基于字符数组实现的。
三、方法展示
1.创建一个String
2.通用方法
isEmpty()
public boolean isEmpty() {
return value.length == 0;
}
它只能判断是否存在字符, 不能判断是否存在空格的情况.
String src = " ";
System.out.println(src.isEmpty()); // false
可以使用StringUtils的方法进行判空。
int length()
length是最常用到的方法, 它通常用于计算String的长度。注释:
The length is equal to the number of Unicode code units in the string.
就是说字符串的长度等于代码单元的长度。通常情况下, 一个代码单元可以表示大部分的字符, 但是别忘了增补字符的存在, 增补字符需要用2个char类型表示。
// 从其它博客copy的例子
String sentence = "\u03C0 \uD835\uDD6B"; // 该字符串的第二个(从一开始计)字符是空格
System.out.println(sentence); //π ?
int lengthU = sentence.length();
System.out.println(lengthU); // 4
See? 其实只有3个字符, 但是length方法计算的是代码单元, 因此得到4。 ===> 当字符串中没有增补字符, length()才等于字符的个数。
可以调用Character.codePointCount来查看unicode代码点的数量 ==> 字符的数量=代码点的数量。
char[] chars = {'\u03C0', ' ','\uD835', '\uDD6B'};
System.out.println(Character.codePointCount(chars, 0, chars.length)); //3
从1.5开始, 代码点表示与字符集中某个字符对应的数字, 通常用16进制来表示这个值。
char charAt(int index)
显示索引处的字符, 注意假如该字符的代码点在代理范围内, 则不会正常显示.
char[] chars = {'\u03C0', ' ','\uD835', '\uDD6B'};
System.out.println(chars[3]);
输出:
?
int codePointAt(int index)
查看索引处的代码点。假如索引i处为高代理范围的代码点, i+1为低代理范围代码点, 则返回该增补字符的代码点。
String testSentence = "\u03C0 \uD835\uDD6B";
int cp = testSentence.codePointAt(2);
System.out.println(cp);
System.out.println("\\uD835的十进制为:" + (int)'\uD835');
输出:
120171
\uD835的十进制为:55349
int codePointBefore(int index)
查看索引index - 1的代码点, 假如index - 1为低代理范围, index - 2为高代理范围, 则返回index - 1和index - 2表示的增补字符的代码点。
// testSentence = "\u03C0 \uD835\uDD6B"
int cp = testSentence.codePointBefore(testSentence.length());
System.out.println(cp);
int codePointCount(int beginIndex, int endIndex)
查看代码点的数量
// testSentence = "\u03C0 \uD835\uDD6B"
int cp = testSentence.codePointCount(0, testSentence.length());
System.out.println(cp); // 3
假如字符串的范围不存在代理对, 那么每个字符对应一个代码点
// testSentence = "\u03C0 \uD835"
int cp = testSentence.codePointCount(0, testSentence.length());
System.out.println(cp); // 3
int offsetByCodePoints(int index, int codePointOffset)
从索引index处偏移codePointOffset个代码点得到的索引
// testSentence = "\u03C0 \uD835\uDD6B\u03C0";
int cp = testSentence.offsetByCodePoints(0, 3);
System.out.println(cp); //4
当存在增补字符时该方法才会有明显的效果
boolean equals(Object anObject)
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;
}
比较的思路是:
1.参数是否String的实例
2.按顺序比较数组的字符
boolean contentEquals(CharSequence cs)
// CharSequence 是一个接口, 表示char值的可读序列。
// 实现类有:CharBuffer、String、StringBuffer、StringBuilder..
String src = "abc";
String dst = "abc";
StringBuilder sb = new StringBuilder().append('a').append('b').append('c');
System.out.println(src.contentEquals(dst)); // true
System.out.println(src.contentEquals(sb)); // true
boolean equalsIgnoreCase(String anotherString)
比较思路——
1.比较数值
2.转为大写比较
3.转为小写比较
while (len-- > 0) {
char c1 = ta[to++];
char c2 = pa[po++];
if (c1 == c2) {
continue;
}
if (ignoreCase) {
char u1 = Character.toUpperCase(c1);
char u2 = Character.toUpperCase(c2);
if (u1 == u2) {
continue;
}
if (Character.toLowerCase(u1) == Character.toLowerCase(u2)) {
continue;
}
}
return false;
}
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;
将每个位置的char值相减来得到先后顺序。
等待更新…