为什么Java Set.contains()比String.contains()更快?

问题描述 投票:0回答:1

关于在2个字符串之间查找公共字符的问题,起初我使用了直接的String.contains()方法:

static String twoStrings(String s1, String s2) {
    boolean subStringFound = false;
    for(int i = 0; i < s2.length(); i++){
        if(s1.contains(Character.toString(s2.charAt(i)))) {
            subStringFound = true;
            break;
        }
    }
    return subStringFound?"YES":"NO";
}

但是,它通过了大多数测试用例的5/7测试用例,但是面临2个真正长字符串的用例的超时。

然后我尝试使用Set.contains():

static String twoStrings(String s1, String s2) {
    boolean subStringFound = false;
    HashSet<Character> set = new HashSet<>();
    for(int i = 0; i < s1.length(); i++){
        set.add(s1.charAt(i));
    }

    for(int i = 0; i < s2.length(); i++){
        if(set.contains(s2.charAt(i))) {
            subStringFound = true;
            break;
        }
    }
    return subStringFound?"YES":"NO";
}

尽管我正在运行附加循环来创建Set,但它通过了所有测试。造成运行时显着差异的主要原因是什么?

[为了在2个字符串之间查找公共字符的问题,首先我使用了直接的String.contains()方法:静态字符串twoStrings(String s1,String s2){boolean subStringFound = ...

java string algorithm runtime hashset
1个回答
1
投票

您必须查看所使用的JDK中的实现,但最有可能String.containslinear search


1
投票

因为它们是不同的数据结构,并且在它们上实现的size方法也不同。

© www.soinside.com 2019 - 2024. All rights reserved.