美文网首页
Android Collections.sort()填坑

Android Collections.sort()填坑

作者: Provider | 来源:发表于2020-12-28 10:20 被阅读0次
复现

错误代码如下

Collections.sort(dataList, new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o1 > o2 ? 1 : -1;
    }
});

这里看着也没啥问题啊,相同的代码运行在不同手机上为啥有的报错有的不报错呢?根据错误提示Comparison method violates its general contract!去查看源码后找到抛出导致这个错误代码的具体位置

if (len1 == 1) {
    assert len2 > 0;
    System.arraycopy(a, cursor2, a, dest, len2);
    a[dest + len2] = tmp[cursor1];
} else if (len1 == 0) {
    throw new IllegalArgumentException("Comparison method violates its general contract!");
} else {
    assert len2 == 0;
    assert len1 > 1;
    System.arraycopy(tmp, cursor1, a, dest, len1);
}

查阅相关资料后发现说这种写法在Java JDK6中没有问题。在Java JDK6以后,Comparator要满足自反性、传递性、对称性,不然Arrays.sort、Collections.sort会报IllegalArgumentException异常。说明:

  • 自反性:x,y 的比较结果和y,x的比较结果相反。
  • 传递性:x > y,y > z,则x > z。
  • 对称性:x = y,则x,z比较结果和y,z比较结果相同。

然而错误写法:o1 > o2 ? 1 : -1,并没有处理相等的情况,所以在实际使用中可能会出现异常。

斗罗小剧场
小舞:哥,这里我有个疑问了,运行的环境都是Java JDK8的,为啥有的手机不会闪退有的手机会闪退呢?
小三:额......这......
小三:小舞,哥现在修为等级还不够,等我魂力到达90级或许可以帮你解决这个问题!!!

总结

根据上面的分析,在Java JDK6以后,Comparator要满足自反性、传递性、对称性。所以正确的写法应该是

Collections.sort(list, new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
            //return o1 - o2或者return o1.compareTo(o2)
            return o1.compareTo(o2);
    }
});

相关文章

  • Android Collections.sort()填坑

    复现 错误代码如下 这里看着也没啥问题啊,相同的代码运行在不同手机上为啥有的报错有的不报错呢?根据错误提示Comp...

  • android8.0之程序员开发时的填坑经历

    填坑一: 实现手动更新apk时的填坑历程,两个步骤: 步骤1)读写权限申请: 从Android6.0开始,在更新a...

  • Android Locale填坑

    最近实际项目中,需要获取手机系统国家地区来做一些特殊逻辑。很简单嘛,Locale#getDefault#getCo...

  • Android填坑记录

    主要记录Android开发当中一些容易引起错误的,又不容易发现的问题。 Activity方面 1,onWindow...

  • Android 填坑记录

    1.使用Fresco时,根据图片url获取缓存文件 2.使用Fresco时,如何实现缩放效果(PhotoView)...

  • Android填坑手册

    1.starActivityForResult的坑 在 onActivityResult的switch里面应该填的...

  • android填坑目录

    Android进阶过程中遇到的问题,解决方案,容易忽略的基础知识,以及自我的思考。 目录 app开发 ✅ ap...

  • 阿坑,是你们吗?持续更新ing

    Android 获取 PackageInfo 引发 Crash 填坑 UI小姐姐要的纤细的粗1.02.0 Andr...

  • 开发工具总结(4)之Android Studio3.0填坑指南

    序言 上篇讲了: 全面总结Android Studio2.X的填坑指南 这篇讲一下AS3.0的坑。。 作为这个世界...

  • 再挖个坑,明天填,push的

    再挖个坑,明天填,push的 再挖个坑,明天填,push的 再挖个坑,明天填,push的 再挖个坑,明天填,pus...

网友评论

      本文标题:Android Collections.sort()填坑

      本文链接:https://www.haomeiwen.com/subject/ujnbnktx.html