java 源码之String篇

String类是final类,即不可以被继承.同时String类也实现了Serializable,Comparable,CharSequence;

首先,String类实现Serializable接口,说明String是可以被序列化的

实现Comparable接口,观察String类中compareTo方法:

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;
    }

可以看出,String类的对比逻辑为: 从两个字符串的头开始比较,如果字符不相等,则字符小的排在后面,如果相等,则对比下一位,如果都相等,则长的在前;例如:"abcdef","abcdefgh",则根据对比如果都相等,则长的在前,可以得出后一个字符串在对比的时候优先级高.

另外,String也可以通过比较器比较,但String自带的比较器CaseInsensitiveComparator类是给String中compareToIgnoreCase方法准备的,在java中的比较器中比较方法是这样的:

 public int compare(String s1, String s2) {
            int n1 = s1.length();
            int n2 = s2.length();
            int min = Math.min(n1, n2);
            for (int i = 0; i < min; i++) {
                char c1 = s1.charAt(i);
                char c2 = s2.charAt(i);
                if (c1 != c2) {
                    c1 = Character.toUpperCase(c1);
                    c2 = Character.toUpperCase(c2);
                    if (c1 != c2) {
                        c1 = Character.toLowerCase(c1);
                        c2 = Character.toLowerCase(c2);
                        if (c1 != c2) {
                            // No overflow because of numeric promotion
                            return c1 - c2;
                        }
                    }
                }
            }
            return n1 - n2;
        }

一开始看时有疑惑,为什么要比较后转化为大写比较,再转化为小写比较, 在网上查阅得知:

There are Unicode characters which are different in lowercase, but have the same uppercase form. For example the Greek letter Sigma - it has two lowercase forms (σ, and ς which is only used at the end of the word), but only one uppercase form (Σ).

意思就是希腊字母西格玛有两种形式的小写σ,ς大写则是Σ,所以才会有比完大写比小写的情况.

public boolean regionMatches(int toffset, String other, int ooffset,int len)

方法:regionMatches

regionMatches方法,比较两个字符串中一个区域,相等返回true,不相等返回false, 其中有4个参数, 意思分别为: toffset->第一个字符串起始位置, other->第二个字符串, ooffset->第二个字符串起始位置, len -> 比较长度,

regionMatches还有一个重载方法,在第一个参数前加了一个参数,是否忽略大小写.

方法:startWith和endWith,意思是是否已另一个字符串为开头或结尾, 判断开头时可以自定义起始位置,


方法:indexOf

indexOf有许多变体,

indexOf(int ch)是返回字符在String中第一次出现的位置,

indexOf(int ch,int formIndex) 可以设置初始位置

lastIndexOf 同indexOf 不过是从后向前查询

indexOf(String str) 返回一个字符串在此字符串中第一次出现的位置

indexOf终极版,参数有6个,char[],int,int,   char[], int, int 看参数应该能看出意思, 设置第一个字符数组的开始和长度,第二个的开始和长度, 然后返回第二个字符数组在第一个字符数组中第一次出现的位置.

方法:substring

相信大家都会用,substring(int beginIndex) 截取从deginIndex开始到结束,substring(int beginIndex,int endIndex)截取从beginIndex到endIndex

在返回值中会这样写: return (beginIndex==0)?this:new String(value,beginIndex,subLen);

可见String对截取字符串采用新new一个字符串作为返回值;

方法:concat(String str)

将str连接到本字符串的末尾


方法:replace(char oldChar,char newChar)

在String中 replace为替换, 将oldChar转化为newChar,在转化完成后,重新new一个新的字符串返回,

方法:matches

通过正则查询是否有匹配项

方法:contains

查询是否存在子序列

方法:split

切分字符串,但要注意, split的性能是比较低的,所以如果字符串的分割在程序中所占比例比较大时不推荐使用,

方法:join(CharSequence delimiter,CharSequence... elements)

CharSequence可以看做为String,join的意思为将elements每两个之间插入一个delimiter,然后返回单个字符串

方法:toLowerCase

将大写转化为小写,new一个新的返回,

方法:trim

将字符串两端字符unicode编码小于等于32的所有字符全部去掉

方法:format(String format,Object... args)

字符串格式化, 其实就是替换,将字符串中符合规则的子序列替换为后面的Object参数

唯一一个本地方法:intern()

具体可以查看以下内容:

https://blog.csdn.net/wjzhang5514/article/details/70209403

实验目的: 练习使用Java基本数据类型。使用JavaString类操作字符串和子串。 实验内容: 1.写一个程序提示用户键入某一货币数量(以分为单位),该程序应计算出如何用最少量的1元,50分,10分和1分硬币得到该数目。如195分最少可以用一个1元硬币,1个50分硬币,4个10分硬币和5个1分硬币组成。 注意不要用数组存放不同硬币的值。 2.写一个程序可以对两个字符串进行测试,得知第一个字符串是否包含在第二个字符串中。如字符串”PEN”包含在字符串“INDEPENDENT”中。 可以利用字符串类方法 boolean regionMatches(int toffset, String other, int ooffset, int len) toffset 指从被调用方法的字符串的第几个字符开始测试,如果是0,表明从字符串的首字符开始。other是指使用的另一个字符串。ooffset指从另一个字符串的第几个字符开始。len指要比较几个字符。该方法返回boolean值。 在本题中,ooffset为0,因为我们要测试整个短字符串;len是短字符串的长度;所以应该用 big.regionMatches(index, small, 0, small.length()) 如果big指“independent",small指"pen",则index=2时为假,index=4时为真 (b)改进程序,当第一个字符串包含在第二个字符串中时,显示第一个字符串在第二个字符串中的起始位置。 (c)改进程序,即使当用户输入顺序错误时(第一个是长字符串,第二个是短字符串),能自动在长字符串中搜寻短字符串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值