Java之String

一、底层实现

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 - 1index - 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值相减来得到先后顺序。

等待更新…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值