Comparable 接口的学习笔记

package java.lang;

import java.util.*;

源码分析 在阅读整个源码后 以下是自己的理解

首先 结构在lang包下 

类的功能解析部分

这个接口被标志为自然排序接口 这个排序接口属于java集合体系的一员 在实现了这个接口的类中 他的实例化对象在排序集合中就不需要指定对应的排序接口了 以及在进行Arrays.sort就可以直接执行排序 否则需要指定对应的比较器 这个在Arrays的sort方法中就可以体现

注意这个接口是泛型接口 T表示泛型 作用就是比较T元素的大小的

public interface Comparable<T> {

方法解析

 这个方法是个抽象方法 并未实例化 这个需要他的实例化类 去重写方法 官方强烈建议 所有类在实现这个方法的时候一定要 注意一点也就是 假设C类实现了这个方法 那么对于C类的两个实例化对象e1.equal(e2)方法 与e1.compareTo(e2)需要具有一定的联系 这个联系 是十分重要的 主要为 如果compareTo 方法确定这两个元素已经是相等的了 那么 equal方法一定要返回真 也就是equal也得认为两个元素是相等 反之也是一样

官方源码中提到一个 就是基本所有实现CompareTo方法的类都遵顼了这个原则

除了一个类 BigDecimal

实例化该方法的代码解析

这个是String实现的该方法

这两个首先获取底层String的byte数组 因为String的数据储存就是byte数组 但是在jdk较老的版本上的是char数组

这个方法的作用就是判断String类的实例化使用的是什么编码 然后调用对应的compareTo方法 未知

根据coder属性判断两个字符串的编码 编码有Utf16 和Latin1然后选择调用对应的比较方法

public int compareTo(String anotherString) {

        byte v1[] = value;

        byte v2[] = anotherString.value;

        byte coder = coder();

        if (coder == anotherString.coder()) {

            return coder == LATIN1 ? StringLatin1.compareTo(v1, v2)

                                   : StringUTF16.compareTo(v1, v2);

        }

        return coder == LATIN1 ? StringLatin1.compareToUTF16(v1, v2)

                               : StringUTF16.compareToLatin1(v1, v2);

     }

@IntrinsicCandidate

基本被String调用用于比较两个字符串的内部封装的数组是否相等 用于自然选择排序使用的

该方法计算对应的两个byte数组 的字符型长度 

@IntrinsicCandidate

    public static int compareToUTF16(byte[] value, byte[] other) {

        int len1 = length(value);

        int len2 = StringUTF16.length(other);

        return compareToUTF16Values(value, other, len1, len2);

}

比较算法 内层循环比较对应位置的字符受否相等 不等的话返回插值 如果循环结束时还没有执行内层循环体的return操作 

说明两个字符串要么是字串关系要么相等 如果相等 那么最后return的长度相减就是0 否则就是长度的差值

private static int compareToUTF16Values(byte[] value, byte[] other, int len1, int len2) {

        int lim = Math.min(len1, len2);

        for (int k = 0; k < lim; k++) {

            char c1 = getChar(value, k);

            char c2 = StringUTF16.getChar(other, k);

            if (c1 != c2) {

                return c1 - c2;

            }

        }

        return len1 - len2;

    }

本人水平有限对于一些知识模糊不清 如有错误欢迎指正

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值