有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (5) 个答案

  1. # 1 楼答案

    在可读性没有差异的地方(如本例),最好使用只搜索字符的版本。lastIndexOf需要做的工作更少——在列表中查找单个元素比查找子列表更容易(这实际上就是搜索字符串所要做的)

  2. # 2 楼答案

    就性能而言,可能会略有不同。对于搜索单个字符,使用char而不是String更快或更相等

  3. # 3 楼答案

    字符串有额外的开销,不管它的长度是多少(除非你有一个非常智能的编译器,可以将单个字符串文本优化为字符常量:),所以如果你只搜索单个字符,你应该更喜欢字符版本。这并不是一个邪恶的优化,因为无论哪种方式,它都是可以理解的等价物

  4. # 4 楼答案

    意见不错,但数据更好。我写了一个快速基准:

    测试代码

    public static void main(String[] args)
    {
      System.out.println("Starting perfo test");
    
      final long NUM_TESTS = 100000000L;
    
      String wibble = "<blah> blah blah </blah>.... <wibble>"
                    + " blah wibble blah </wibble> some more test here";
      int x = -1;
      Stopwatch sw = new Stopwatch();
    
      System.out.println("--perfo test with " + NUM_TESTS + " iterations--");
    
      sw.start();
      for(long i = 0; i < NUM_TESTS; i++)
        x = wibble.lastIndexOf(">");
      sw.stop();
      System.out.println("String first pass: " + sw + " seconds");
    
      sw.start();
      for(long i = 0; i < NUM_TESTS; i++)
        x = wibble.lastIndexOf('>');
      sw.stop();
      System.out.println("Char first pass: " + sw + " seconds");
    
      sw.start();
      for(long i = 0; i < NUM_TESTS; i++)
        x = wibble.lastIndexOf('>');
      sw.stop();
      System.out.println("Char second pass: " + sw + " seconds");
    
      sw.start();
      for(long i = 0; i < NUM_TESTS; i++)
        x = wibble.lastIndexOf(">");
      sw.stop();
      System.out.println("String second pass: " + sw + " seconds");
    
      //Compiler warning said x was never read locally.. this is to
      //ensure the compiler doesn't optimize "x" away..
      System.out.println(x); 
    }
    

    输出

    Starting perfo test
    --perfo test with 100000000 iterations--
    String first pass: 8.750 seconds
    Char first pass: 6.500 seconds
    Char second pass: 6.437 seconds
    String second pass: 8.610 seconds
    63

    结论

    带有字符的版本大约快25%,但两个版本都执行得非常快,所以它可能永远不会成为代码中的瓶颈

  5. # 5 楼答案

    实际上,您可以查看String类的源代码。似乎lastIndex(char)和lastIndex(String)实际上是分开编写的。字符串类也应该有开销。所以char版本可能会快一点,但我怀疑是否会有任何显著的性能差异

    http://www.docjar.com/html/api/java/lang/String.java.html