String的几种比较方法对比(Compare,CompareTo, CompareOrdinal、Equals)

String类字符串比较大概有4种方法:Compare(),CompareTo(), CompareOrdinal()和Equals(). Compare()方法是CompareTo()的静态版本.而Equals()与"=="是等价的,只要使用"=="运算符,就会调用Equals()方法.CompareOrdinal()对两个字符串进行比较,不考虑本地化语言和文化。


测试比较代码:

  1. const int Num = 10000000;  
  2.             string s1 = "abcdefgh";  
  3.             string s2 = "abcdefgh";  
  4.   
  5.             //string s1 = "abcdefgh";  
  6.             //string s2 = "amklklkl";  
  7.             int end;  
  8.             //Compare  
  9.             int start = Environment.TickCount;  
  10.             for (int i = 0; i < Num; i++)  
  11.             {  
  12.                 string.Compare(s1, s2);  
  13.             }  
  14.             end=Environment.TickCount;  
  15.             Console.WriteLine("Compare : " + (end - start));  
  16.   
  17.             //CompareTo  
  18.             start = Environment.TickCount;  
  19.             for (int i = 0; i < Num; i++)  
  20.             {  
  21.                 s1.CompareTo(s2);  
  22.             }  
  23.             end = Environment.TickCount;  
  24.             Console.WriteLine("CompareTo : " + (end - start));  
  25.   
  26.             //CompareOrdinal  
  27.             start = Environment.TickCount;  
  28.             for (int i = 0; i < Num; i++)  
  29.             {  
  30.                 string.CompareOrdinal(s1, s2);  
  31.             }  
  32.             end = Environment.TickCount;  
  33.             Console.WriteLine("CompareOrdinal : " + (end - start));  
  34.   
  35.             //静态Equals  
  36.             start = Environment.TickCount;  
  37.             for (int i = 0; i < Num; i++)  
  38.             {  
  39.                 string.Equals(s1, s2);  
  40.             }  
  41.             end = Environment.TickCount;  
  42.             Console.WriteLine("静态Equals : " + (end - start));  
  43.   
  44.             //实例Equals  
  45.             start = Environment.TickCount;  
  46.             for (int i = 0; i < Num; i++)  
  47.             {  
  48.                 s1.Equals(s2);  
  49.             }  
  50.             end = Environment.TickCount;  
  51.             Console.WriteLine("实例Equals : " + (end - start));  
其中,s1和s2分相等和不相等两种情况. 看结果:

 

1、Compare会通过传递进来的文化信息来调用对应的比较,CompareTo则会调用与当前线程相关联的文化信息,这就意味着,如果我们进行国际化的时候,字符串比较必须使用String.Compare静态方法。而且Compare方法因为是静态的,要比CompareTo快一些,因为建议尽可能地使用String.Compare方法来代替CompareTo方法!。


2.CompareOrdinal是将整个字符串每5个字符(10个字节)分成一组,然后逐个比较,找到第一个不相同的ASCII码后退出循环。并且求出两者的ASCII码的差。不过我很费解的是微软为什么要把这个实现的如此麻烦。但是在CLR via C#上有这样的话:这个方法比其他方法都要快。我想应该是有一定道理的吧。

所以当我们比较大小的时候,尽量使用CompareOrdinal方法。



3.Equals由于是非安全代码的比较,所以效率要比我们用安全代码高得多。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值