检查字符串内容?字符串长度vs空字符串

时间:2020-03-05 18:39:27  来源:igfitidea点击:

哪种方法对编译器更有效,并且是检查字符串是否为空的最佳实践?

  • 检查字符串的长度是否== 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 '
if (inputString == null || inputString == String.Empty)
{
    // String is null or empty, do something clever here. Or just expload.
}
':
')) { /* the string is empty */ }

在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#进行了测试,结果相同):

##代码##

结果:

##代码##

这意味着比较比字符串长度检查更重要。