检查字符串内容?字符串长度vs空字符串
哪种方法对编译器更有效,并且是检查字符串是否为空的最佳实践?
- 检查字符串的长度是否== 0
- 检查字符串是否为空(strVar =="")
另外,答案是否取决于语言?
解决方案
回答
是的,这取决于语言,因为字符串存储在语言之间有所不同。
- Pascal类型的字符串:"长度= 0"。
- C风格的字符串:" [0] == 0"。
- .NET:
.IsNullOrEmpty
。
等等。
回答
在.Net中:
string.IsNullOrEmpty( nystr );
字符串可以为null,因此.Length有时会引发NullReferenceException
回答
实际上,IMO确定的最佳方法是字符串类的IsNullOrEmpty()方法。
http://msdn.microsoft.com/zh-CN/library/system.string.isnullorempty。
更新:我假设.Net在其他语言中可能有所不同。
回答
在使用C样式(以空字符结尾)字符串的语言中,与""
相比将更快。这是一个O(1)操作,而C风格字符串的长度为O(n)。
在将长度存储为字符串对象一部分的语言中(C#,Java等),检查长度也是O(1)。在这种情况下,直接检查长度会更快,因为它避免了构造新的空字符串的开销。
回答
在Java 1.6中,String类具有一个新方法isEmpty
还有一个具有isBlank方法的Jakarta Commons库。空白定义为仅包含空格的字符串。
回答
In this case, directly checking the length is faster, because it avoids the overhead of constructing the new empty string.
@DerekPark:并非总是如此。 ""是字符串文字,因此,在Java中,几乎可以肯定它已经被插入。
回答
对于C字符串,
if (s[0] == 0)
会比任何一个都快
if (strlen(s) == 0)
或者
if (strcmp(s, "") == 0)
因为我们将避免函数调用的开销。
回答
In languages that use C-style (null-terminated) strings, comparing to "" will be faster
实际上,最好检查字符串中的第一个字符是否为'\ 0':
char *mystring; /* do something with the string */ if ((mystring != NULL) && (mystring[0] == 'Actually, it may be better to check if the first char in the string is '')) { /* the string is empty */ }if (inputString == null || inputString == String.Empty) { // String is null or empty, do something clever here. Or just expload. }':
在Perl中,还有第三个选项,即字符串未定义。这仅与C中的NULL指针有所不同,仅是因为我们不会因访问未定义的字符串而出现分段错误。
回答
@内森
#define IS_EMPTY(s) ((s)[0]==0)
我几乎提到了这一点,但是最后还是把它遗漏了,因为用空字符串调用strcmp()
并直接检查字符串中的第一个字符都是O(1)。基本上,我们只需支付一个额外的函数调用,这是相当便宜的。但是,如果我们确实需要绝对的最佳速度,则可以直接进行从第一个字符到0的比较。
老实说,我总是使用strlen()== 0
,因为我从未编写过一个实际上是可衡量的性能问题的程序,而且我认为这是表达支票最易读的方式。
回答
String.IsNullOrEmpty()
仅适用于.net 2.0及更高版本,对于.net 1 / 1.1,我倾向于使用:
Module Module1 Sub Main() Dim myString = "" Dim a, b, c, d As Long Console.WriteLine("Way 1...") a = Now.Ticks For index = 0 To 10000000 Dim isEmpty = myString = "" Next b = Now.Ticks Console.WriteLine("Way 2...") c = Now.Ticks For index = 0 To 10000000 Dim isEmpty = myString.Length = 0 Next d = Now.Ticks Dim way1 = b - a, way2 = d - c Console.WriteLine("way 1 took {0} ticks", way1) Console.WriteLine("way 2 took {0} ticks", way2) Console.WriteLine("way 1 took {0} ticks more than way 2", way1 - way2) Console.Read() End Sub End Module
我使用String.Empty而不是"",因为""会创建一个对象,而String.Empty我不会知道它的小而琐碎,但是当我不需要它们时,id仍然不会创建对象! (来源)
回答
同样,如果不知道语言,就无法分辨。
但是,我建议我们选择最适合随后的维护程序员并且必须维护工作的技术。
我建议编写一个明确执行我们想要的功能的函数,例如
Way 1... Way 2... way 1 took 624001 ticks way 2 took 468001 ticks way 1 took 156000 ticks more than way 2
或者可比。现在毫无疑问,我们正在检查。
回答
假设问题是.NET:
如果还要验证字符串是否为空,请使用IsNullOrEmpty,如果已经知道字符串不为空,例如在检查TextBox.Text等时,请勿使用IsNullOrEmpty,然后出现问题。
因此,我认为String.Length的性能不如字符串比较。
我对其进行了事件测试(我也对C#进行了测试,结果相同):
##代码##结果:
##代码##这意味着比较比字符串长度检查更重要。