Java之String

mac2022-06-30  16

文章目录

一、底层实现三、方法展示1.创建一个String2.通用方法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值相减来得到先后顺序。

等待更新…

最新回复(0)