String俩种排序方式分析

本文对比分析了使用compareTo()和hashCode()方法对字符串集合进行排序的效率。通过源码解析和实验,发现compareTo()更适合长字符串比较,而hashCode()在短字符串集合中表现更优。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    public static void main(String[] args){
        List<String> strList = getStrList();
        System.out.println("方法一开始时间:" + System.currentTimeMillis());
        List<String> strList2 =  strList.stream().sorted(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.compareTo(o2);
            }
        }).collect(Collectors.toList());
        System.out.println("方法一结束时间:" + System.currentTimeMillis());
        System.out.println("-----------------------------");
        System.out.println("方法二开始时间:" + System.currentTimeMillis());
        List<String> strList3 =  strList.stream().sorted(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.hashCode() - o2.hashCode();
            }
        }).collect(Collectors.toList());
        System.out.println("方法二结束时间:" + System.currentTimeMillis());

    }

    public static List<String> getStrList(){
        List<String> resultStrList = new ArrayList<>();
        for(int i = 0 ; i <= 100000; i ++){
            resultStrList.add(System.currentTimeMillis() + "");
        }
        return resultStrList;
    }

方法一排序是利用compareTo()方法,方法二是根据hash值来判断.俩者会存在效率问题.只能通过看源码来推测效率问题

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.hashCode()源码

    public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;

            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }

分析

compareTo()是根据string转char数字后的Unicode进行比较,只涉及加减,无乘法;hashCode()是遍历char数组转成hash值,有加法和乘法.从循环次数来看,compareTo()循环了 min(str1.length,str2.length),hashCode()循环了str1.length + str2.length;从比较次数来看,compareTo()比较了min(str1.length,str2.length),hashCode()比较了一次.

带着分析结果执行了上面排序代码

发现当数组集合小于100W(没有认真看是多少范围)的时候,hashCode()方法比compareTo()方法效率要稍微高一点,当数据大小超过500W(也可能是我电脑问题)的时候,hashCode()方法比compcompareTo()方法效率要稍微低.

以上就是string集合的俩种比较方式分析.有兴趣的同学可以自己尝试一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值