通常情况下,我们判断一个字符串中是否存在某值常常会用string.contains,其实判断一个字符串中存在某值的方法有很多种,最常用的就是前述所说的string.contains,相对来说比较常用的还有string.IndexOf和Regex.Match。直接上代码,后面在说些什么吧,通常情况下功能的实现最重要,作者的话,只对有心者有效。

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Text.RegularExpressions;namespaceExistsInString

{classProgram

{static void Main(string[] args)

{string str0 = "|456|";string str1 = "|444|";string str2 = "|111|222|333|444|555|666|777|888|999|000|";//------------------------------------------//String.Contains方法

if(str2.Contains(str0))

Console.WriteLine("String.Contains->true");elseConsole.WriteLine("String.Contains->false");if(str2.Contains(str1))

Console.WriteLine("String.Contains->true");elseConsole.WriteLine("String.Contains->false");//------------------------------------------//String.IndexOf方法

int val1 = str2.IndexOf(str0);//不存在返回-1

Console.WriteLine("String.IndexOf(no exists)->" +val1);int val2 = str2.IndexOf(str1);//存在返回str1首字符所在str2中的位置(>=0)

Console.WriteLine("String.IndexOf(exists)->" +val2);//------------------------------------------//正则匹配方法

if (Regex.Match(str2, "[|]456[|]").Success)

Console.WriteLine("Regex.Match(no exists)->true");elseConsole.WriteLine("Regex.Match(no exists)->false");if (Regex.Match(str2, "[|]444[|]").Success)

Console.WriteLine("Regex.Match(exists)->true");elseConsole.WriteLine("Regex.Match(exists)->false");

Console.ReadKey();/**如果上述三种方式都处理大量数据,效率如何呢?

*以下循环六组数据说明*/

int loopCount = (int)10e6;

DateTime lasttime=DateTime.Now;

DateTime nowtime=DateTime.Now;for (int loop = 1; loop < 7; loop++)

{

Console.WriteLine("\r\nloop" + loop + ">>>>>>>");//------------------------------------------//String.Contains方法//no exists

lasttime =DateTime.Now;for (int i = 0; i < loopCount; i++)if(str2.Contains(str0)) { };

nowtime=DateTime.Now;

TimeSpan tsStrConNoExists= nowtime -lasttime;//exists

lasttime =DateTime.Now;for (int i = 0; i < loopCount; i++)if(str2.Contains(str1)) { };

nowtime=DateTime.Now;

TimeSpan tsStrConExists= nowtime -lasttime;//------------------------------------------//String.IndexOf方法//no exists

lasttime =DateTime.Now;for (int i = 0; i < loopCount; i++)if (str2.IndexOf(str0) >= 0) { };//上述已经提到不存在返回-1,存在返回一个非负整数,这里为什么不用 == -1 ,而是用了 >= 0 ,这是一个值得深思的问题?

nowtime =DateTime.Now;

TimeSpan tsStrIndNoExists= nowtime -lasttime;//exists

lasttime =DateTime.Now;for (int i = 0; i < loopCount; i++)if (str2.IndexOf(str1) >= 0) { };

nowtime=DateTime.Now;

TimeSpan tsStrIndExists= nowtime -lasttime;//------------------------------------------//Regex.Match方法//no exists

Regex Reg0 = new Regex("[|]456[|]");

lasttime=DateTime.Now;for (int i = 0; i < loopCount; i++)if(Reg0.Match(str2).Success) { };

nowtime=DateTime.Now;

TimeSpan tsStrRegNoExists= nowtime -lasttime;//exists

Regex Reg1 = new Regex("[|]444[|]");

lasttime=DateTime.Now;for (int i = 0; i < loopCount; i++)if(Reg1.Match(str2).Success) { };

nowtime=DateTime.Now;

TimeSpan tsStrRegExists= nowtime -lasttime;

Console.WriteLine("no exists >>>");

Console.WriteLine("tsStrConNoExists =" +tsStrConNoExists.Milliseconds);

Console.WriteLine("tsStrIndNoExists =" +tsStrIndNoExists.Milliseconds);

Console.WriteLine("tsStrRegNoExists =" +tsStrRegNoExists.Milliseconds);

Console.WriteLine("exists >>>");

Console.WriteLine("tsStrConExists =" +tsStrConExists.Milliseconds);

Console.WriteLine("tsStrIndExists =" +tsStrIndExists.Milliseconds);

Console.WriteLine("tsStrRegExists =" +tsStrRegExists.Milliseconds);

}

Console.ReadKey();

}

}

}

输入结果:

String.Contains->false

String.Contains->true

String.IndexOf(no exists)->-1

String.IndexOf(exists)->12

Regex.Match(no exists)->false

Regex.Match(exists)->true

loop 1 >>>>>>>

no exists >>>

tsStrConNoExists = 796

tsStrIndNoExists = 687

tsStrRegNoExists = 171

exists >>>

tsStrConExists = 484

tsStrIndExists = 234

tsStrRegExists = 796

loop 2 >>>>>>>

no exists >>>

tsStrConNoExists = 46

tsStrIndNoExists = 671

tsStrRegNoExists = 234

exists >>>

tsStrConExists = 546

tsStrIndExists = 437

tsStrRegExists = 734

loop 3 >>>>>>>

no exists >>>

tsStrConNoExists = 62

tsStrIndNoExists = 875

tsStrRegNoExists = 171

exists >>>

tsStrConExists = 609

tsStrIndExists = 562

tsStrRegExists = 781

loop 4 >>>>>>>

no exists >>>

tsStrConNoExists = 78

tsStrIndNoExists = 921

tsStrRegNoExists = 218

exists >>>

tsStrConExists = 609

tsStrIndExists = 640

tsStrRegExists = 828

loop 5 >>>>>>>

no exists >>>

tsStrConNoExists = 156

tsStrIndNoExists = 268

tsStrRegNoExists = 265

exists >>>

tsStrConExists = 609

tsStrIndExists = 578

tsStrRegExists = 890

loop 6 >>>>>>>

no exists >>>

tsStrConNoExists = 109

tsStrIndNoExists = 46

tsStrRegNoExists = 546

exists >>>

tsStrConExists = 625

tsStrIndExists = 609

tsStrRegExists = 953

测试结果中不难发现,如果strA中不包括strB,使用strA.Contains(strB)更优;反之,如果strA中包括strB,使用strA.IndexOf(strB)更优。(Regex.Match在此方法中貌似没有体现出任何优势,它更适用于模糊匹配)

具体要使用string.Contains,或是string.IndexOf要看形势。

之前有看过string下很多方法实现的代码(微软的,非他人),string.Contains是基于string.IndexOf上的一个方法,使用string.Contains的时候,会调用

string.IndexOf,按原理,使用string.IndexOf的效率是要高于string.Contains的,但是这个测试结果让我大跌眼镜,应该是我在上述代码中使用的判断语句造成的这种非理想的测试结果,按照个人的意愿,还是希望多使用string.IndexOf。

其实一次微小的改变在当前可能影响不了什么,但是在日积月累中,它的优势就显而易见了。想要快速变得比他人更强,不需要多么费劲,只需要每天多做一点点(千分之一)

一年之后:(1 + 0.001)365=  1.44倍

十年之后(1 + 0.001)3650=  38.4倍

java contains 效率_字符串中判断存在的几种模式和效率(string.contains、string.IndexOf、Regex.Match)...相关推荐

  1. java取出字符串中的后四位_[原]Java面试题-将字符串中数字提取出来排序后输出...

    [Title][原]Java面试题-将字符串中数字提取出来排序后输出 [Date]2013-09-15 [Abstract]很简单的面试题,要求现场在纸上写出来. [Keywords]面试.Java. ...

  2. java 工具类-去除字符串中特殊字符、全角转为半脚、获取字符串中姓名/电话、姓名重复后追加a.b.c...aa,ab..

    java 工具类-去除字符串中特殊字符.全角转为半脚.获取字符串中姓名/电话.姓名重复后追加a.b.c-aa,ab- public class NameUtil {/*** 姓名重复后追加a.b.c. ...

  3. 每个java程序都至少有一个线程给主线程,java程序在主线程中判断各个子线程状态的操作,该如何解决...

    java程序在主线程中判断各个子线程状态的操作 每个子线程在队列为空时会wait等待其他线程添加新url到队列,到最后所有子线程都取不到url时也会都wait住,要在主线程中判断如果所有的子线程都是w ...

  4. java利用正则截取字符串中的数字

    java利用正则截取字符串中的数字 String str = "xxx第47297章33";String regex = "\\d*";Pattern p = ...

  5. java基础—对一个字符串中的数值进行从小到大的排序

    对一个字符串中的数值进行从小到大的排序 例如: String s = "8 96 88 58 44 52 12 13 39 96 6"; public class SortIntT ...

  6. MySQL 中判断奇数的 6 种方法

    MySQL 中判断奇数的 6 种方法: mod(x, 2) = 1 ,如果余数是 1 就是奇数. power(-1, x) = -1 , 如果结果是 -1 就是奇数 x % 2 = 1 ,如果余数是 ...

  7. 关于laravel模板中生成URL的几种模式总结

    1.通过url辅助函数(路由)生成: ? 1 location.href = "{{url('user/index2')}}"; 或者: ? 1 location.href = & ...

  8. VMware中GPU虚拟化的三种模式(1)–vSGA

    VMware中GPU虚拟化的三种模式(1)–vSGA 或者说,三种虚拟化图形加速类型 虚拟共享图形加速 (vSGA , virtual Shared Graphics Acceleration) 虚拟 ...

  9. unity2D学习(14)血条显示、Canvas中Render Mode的三种模式介绍

    1 血条素材处理 分割处理:对上一章画出来的血条图片做分割处理 整理素材格式: Sprite Mode选择Multiple:因为一张图片包含多个素材. Pixels Per Unit单位像素为16:与 ...

最新文章

  1. VMware Workstation Pro 共享文件夾
  2. python爬百度翻译-用python实现百度翻译
  3. AMD推Radeon HD 7790显卡 性价比突出下月开卖
  4. mybatis generator修改默认生成的sql模板
  5. 强化学习《基于价值 - DQN其他细节算法》
  6. 《深入理解Nginx:模块开发与架构解析》一3.3 如何将自己的HTTP模块编译进Nginx...
  7. 乱七八糟 Nodejs 系列一:试水
  8. Python 正则表达式模块详解
  9. ubuntu 移动硬盘复制小文件可以,复制大文件总是复制不成功
  10. deeping 系统连接外接显示器无法无法设置双屏(有可能是不同接口在不同显卡上)...
  11. 山东省大学生软件设计大赛
  12. INA230测量电压电流功率
  13. 建站分享:调整WordPress自带标签云参数
  14. 会员权益营销如何助力会员指数增长
  15. 华为自研设备明年都将升级鸿蒙系统,华为杨海松:明年部分华为自研设备升级鸿蒙系统...
  16. 1688关键词搜索api(附可用)
  17. 汽车电子行业 常见英文缩写
  18. 8090后苦于创业的我们
  19. 马云语录:骗子、疯子、狂人?
  20. 银行笔试题目汇总——英语能力测试

热门文章

  1. L学姐美团金融测开面经
  2. python取整(不同方法的取整)
  3. 达梦数据库常用SQL之公共同义词改为私有同义词
  4. ElasticSearch学习系列(一)关于ES数据库的和核心倒排索引的介绍
  5. 从浏览器键入url后分析网络请求过程
  6. java内省属性,内省操作javabean属性
  7. 欠揍的ffmpeg,调试android里的ffmpeg (1)
  8. 2019最近计算机毕业设计-题目汇总大全-系列3
  9. 苹果13pro更换听筒多少钱
  10. 装修工地现场工程队监控时间水印相机软件新利器