效率(1) : String.indexOf与String.contains效率测试

    String.indexOf与String.contains都是判断字符串是否包含另一个字符串的方法。String.indexOf存在返回第一个字符索引位置,不存才返回-1;String.contains存在返回true,不存在返回false。

    现在测试两个方法的效率,不区分大小写判断。一个字符串判断是否含有48个单词中的单词,执行一百万次。

    结论 : String.indexOf 效率更高。 (或许我的测试方法有误,欢迎指正)

    先上结果,如下

1000000*48 次 String.contains 耗时:4691 ms
1000000*48 次 String.indexOf  耗时:31 ms
^str1:全部存在(小写)-------------------------------------------------------------------

1000000*48 次 String.contains 耗时:3735 ms
1000000*48 次 String.indexOf  耗时:17 ms
^str2:全部存在(大写)-------------------------------------------------------------------

1000000*48 次 String.contains 耗时:37 ms
1000000*48 次 String.indexOf  耗时:14 ms
^str3:部分存在------------------------------------------------------------------------

1000000*48 次 String.contains 耗时:17 ms
1000000*48 次 String.indexOf  耗时:14 ms
^str4:不存在(数字、字符、字母)----------------------------------------------------------

1000000*48 次 String.contains 耗时:16 ms
1000000*48 次 String.indexOf  耗时:16 ms
^str5:不存在(字母)--------------------------------------------------------------------

1000000*48 次 String.contains 耗时:17 ms
1000000*48 次 String.indexOf  耗时:14 ms
^str6:不存在(数字)--------------------------------------------------------------------

1000000*48 次 String.contains 耗时:17 ms
1000000*48 次 String.indexOf  耗时:14 ms
^str7:不存在(字符)--------------------------------------------------------------------

 

测试代码如下


/**
 * @Auther: liyue
 * @Date: 2019/11/8 10:04
 * @Description:
 */
public class StringContainsOrIndexOfVelocity {

    private static final String base = "article.add,article.update,article.delete,article.view," +
            "category.add,category.update,category.delete,category.view," +
            "user.add,user.update,user.delete,user.view," +
            "role.add,role.update,role.delete,role.view," +
            "news.add,news.update,news.delete,news.view," +
            "category.add,category.update,category.delete,category.view," +
            "Threading.add,Threading.update,Threading.delete,Threading.view," +
            "System.add,System.update,System.delete,System.view," +
            "Generic.add,Generic.update,Generic.delete,Generic.view," +
            "Collections.add,Collections.update,Collections.delete,Collections.view," +
            "Tasks.add,Tasks.update,Tasks.delete,Tasks.view," +
            "CslApp.add,CslApp.update,CslApp.delete,CslApp.view";

    private static final String[] bases = base.toUpperCase().split(",");

    private static final String str1 = base;
    private static final String str2 = base.toUpperCase();
    private static final String str3 = "ns.add,Collections.update,Collections.delete,Collections.ving.add,Threading.update,Threading.delete,Threading.add,role.update,role.delete,role.vietions.1";
    private static final String str4 = "klsjflsjdfoadsfi;jadls;fjoashgewnaiefahefoia274923472395674358920374uy3fh2f92yfh02ydsuhawe9f''''''//>>>>><<<~~~~!!@#$%^&&hrhfa8fewy7rt23984g23fhaiouf";
    private static final String str5 = "skdhlskdjfasd;faioegneohfaeofjaoeihfjaopihfeoasmgvlandihfawieughfyoiebfinlkjdsfoiajheiohioejfaesafkhjasdhflakdjsfasdfaldfadfsdjflsfjaldfjlajdflajldjflkaf";
    private static final String str6 = "239875824368517230941327041230740471674083295738473297589327492347239567435892037409827304203406324672937027394623764170324671324891748192374937489273489";
    private static final String str7 = "`--==-`-=-=-`=-`=-`==-@#$%^&*((*&^%$#$#$@#@##!@#$$%&^*()()())>><:;'''''''//>>>>><<<~~~~!!@#$%^&&*@#$%^&*()#$%^&*(*&^%$#@#$%^&*(*&^%$#@!@#$%^&*(*&^%$#";

    public static void main(String[] args) {
        int count = 1000000;
        test(str1, count);
        System.out.println("^str1:全部存在(小写)-------------------------------------------------------------------");
        System.out.println();
        test(str2, count);
        System.out.println("^str2:全部存在(大写)-------------------------------------------------------------------");
        System.out.println();
        test(str3, count);
        System.out.println("^str3:部分存在------------------------------------------------------------------------");
        System.out.println();
        test(str4, count);
        System.out.println("^str4:不存在(数字、字符、字母)----------------------------------------------------------");
        System.out.println();
        test(str5, count);
        System.out.println("^str5:不存在(字母)--------------------------------------------------------------------");
        System.out.println();
        test(str6, count);
        System.out.println("^str6:不存在(数字)--------------------------------------------------------------------");
        System.out.println();
        test(str7, count);
        System.out.println("^str7:不存在(字符)--------------------------------------------------------------------");

    }

    private static void test(String str, int count) {
        str = str.toUpperCase();
        long t = System.currentTimeMillis();
        for (int i = 0; i < count; i++) {
            for (String s : bases) {
                if (str.contains(s)) {

                }
            }
        }
        long t2 = System.currentTimeMillis();
        System.out.println(count + "*" + bases.length + " 次 String.contains 耗时:" + (t2 - t) + " ms");

        for (int i = 0; i < count; i++) {
            for (String s : bases) {
                if (str.indexOf(s) != -1) {

                }
            }
        }
        long t3 = System.currentTimeMillis();
        System.out.println(count + "*" + bases.length + " 次 String.indexOf  耗时:" + (t3 - t2) + " ms");
    }


}

 

引用\[1\]中的代码是Java中的String类的indexOf方法的实现。这个方法用于返回字符串中第一次出现指定子字符串的索引,从指定索引开始搜索。如果不存在这样的子字符串,则返回-1。在这个例子中,使用了indexOf(String str, int fromIndex)方法,其中str是要搜索的子字符串,fromIndex是开始搜索的索引。在这个例子中,字符串"abcdefgabcaaabc"中第一次出现"abc"的索引是1。所以输出结果是1。引用\[2\]中的代码也是String类的indexOf方法的实现,但是这个方法只接受一个参数,即要搜索的子字符串。在这个例子中,字符串"abcdefg"中第一次出现"b"的索引是1。所以输出结果是1。引用\[3\]解释了indexOf方法和contains方法的区别。indexOf方法返回的是子字符串的索引位置,如果不存在则返回-1;而contains方法返回的是一个布尔值,表示字符串是否包含指定的子字符串。所以,如果你想判断一个字符串是否包含另一个字符串,可以使用contains方法。 #### 引用[.reference_title] - *1* *2* [String.indexOf()的四种方法](https://blog.csdn.net/huohuo5211314/article/details/121718176)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [效率(1) : String.indexOfString.contains效率测试](https://blog.csdn.net/Lxinccode/article/details/102968376)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值