源码分析篇之String源码分析二

    前面已经分析过String源码为什么是不可变的,同时通过我们常用的String的相关的类StringBuffer和StringBuilder,我们可以发现String类中字段名被定义为了final类型,这样的话将只能被赋值一次。接下来,继续看String源码实现的接口

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {

    可以看到接口包括Serializable,Comparable和CharSequence 3个接口,其中Serializable接口就是一个标识,主要用于在http的传输过程中的序列化。而Comparable这个接口在我看来就比较特殊了。这个接口是一个用来比较大小的接口。下面看源码

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实现comparable接口的具体方法。这个方法返回值 0 代表等于,正数代表大于,负数代表小于。在学习这个方法的过程中以前我从来都不知道collects.sort()方法究竟是通过什么来进行排序的,我们可以发现只有实现了这个接口的集合才能通过collects.sort()方法进行排序。这个也是为什么我们可以对String进行排序的原因。

第二点就是comparable和comparator之间的区别,这2个方法都是比较器,在我看来最大的区别在于comparable的实现类在类的内部。有些人认为这样子实现并不好,所以就想到了使用comparator这个方法。这个方法其实是创建一个新的类,这个类专门用来作为某个类的比较类。这也就是二者之间的区别。

接下来是charsequence接口,其实字符串全部都是用字符在进行表示。而这个接口我还没有看出有什么特别的,只是能够知道这里相当于是把对于字符串常用的功能给抽象出来了。从StringBuffer和StringBuilder这2个类可以看到都实现了这个接口。这里谈到StringBuffer和StringBuilder的话就不得不提下这2者之间的区别其实非常的简单。StringBuffer线程安全,而StringBuilder线程不安全而具体的实现方式的话其实StringBuffer和StringBuilder中的实现方式都是一样的,不同的是StringBuffer实现的时候会加上一个synchronized也就达到了线程安全的目的。

其实在这里我还是有那么一丢丢的困扰的,比如说明明父类已经实现了charsequence接口,为什么子类stringBuffer和StringBuilder类还是要去实现charsequence接口呢,这个原因是什么呢。这个问题我下期进行解答。下期会说些String的常用方法比如equals方法等等。同时讲讲stringbuilder的append的实现。这都是在开发中经常用到的方法。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值