Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
stringtokenizer java-性能_Java_String_Stringtokenizer - Fatal编程技术网

stringtokenizer java-性能

stringtokenizer java-性能,java,string,stringtokenizer,Java,String,Stringtokenizer,在Java中,假设我有一个带有5个delims的字符串,例如“abc;123;123;abc;123”,并且通常具有相同的字符串长度。我需要验证每个项目,不要太冗长 什么更快 if (stoken.hasMoreTokens()) { final String test=stoken.nextToken(); } else { throw new ParseException("Some msg",0); } 或 或 或者使用split() 选项1已给出 import java

在Java中,假设我有一个带有5个delims的字符串,例如“abc;123;123;abc;123”,并且通常具有相同的字符串长度。我需要验证每个项目,不要太冗长

什么更快

if (stoken.hasMoreTokens()) {
    final String test=stoken.nextToken();
} else {
    throw new ParseException("Some msg",0);
}


或者使用
split()

选项1已给出

import java.text.ParseException;
import java.util.StringTokenizer;

public class stringtok
{ 
  public static void main(String[] argv)
  throws Exception
  {
      String data="ABC";
      final StringTokenizer stoken=new StringTokenizer(data.toString(),";");
      if (stoken.hasMoreTokens()) {
          final String test=stoken.nextToken();
      } else {
          throw new ParseException("Some msg",0);
      }
  }
} 
以字节码生成

Compiled from "stringtok.java"
public class stringtok {
public stringtok();
  Code:
     0: aload_0       
     1: invokespecial #1                  // Method java/lang/Object."<init>":()V
     4: return        

public static void main(java.lang.String[]) throws java.lang.Exception;
  Code:
     0: ldc           #2                  // String ABC
     2: astore_1      
     3: new           #3                  // class java/util/StringTokenizer
     6: dup           
     7: aload_1       
     8: invokevirtual #4                  // Method java/lang/String.toString:()Ljava/lang/String;
    11: ldc           #5                  // String ;
    13: invokespecial #6                  // Method java/util/StringTokenizer."<init>":(Ljava/lang/String;Ljava/lang/String;)V
    16: astore_2      
    17: aload_2       
    18: invokevirtual #7                  // Method java/util/StringTokenizer.hasMoreTokens:()Z
    21: ifeq          32
    24: aload_2       
    25: invokevirtual #8                  // Method java/util/StringTokenizer.nextToken:()Ljava/lang/String;
    28: astore_3      
    29: goto          43
    32: new           #9                  // class java/text/ParseException
    35: dup           
    36: ldc           #10                 // String Some msg
    38: iconst_0      
    39: invokespecial #11                 // Method java/text/ParseException."<init>":(Ljava/lang/String;I)V
    42: athrow        
    43: return        
Compiled from "stringtok2.java"
public class stringtok2 {
  public stringtok2();
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return        

  public static void main(java.lang.String[]) throws java.lang.Exception;
    Code:
       0: ldc           #2                  // String ABC
       2: astore_1      
       3: new           #3                  // class java/util/StringTokenizer
       6: dup           
       7: aload_1       
       8: invokevirtual #4                  // Method java/lang/String.toString:()Ljava/lang/String;
      11: ldc           #5                  // String ;
      13: invokespecial #6                  // Method java/util/StringTokenizer."<init>":(Ljava/lang/String;Ljava/lang/String;)V
      16: astore_2      
      17: aload_2       
      18: invokevirtual #7                  // Method java/util/StringTokenizer.hasMoreTokens:()Z
      21: ifne          35
      24: new           #8                  // class java/text/ParseException
      27: dup           
      28: ldc           #9                  // String Some msg
      30: iconst_0      
      31: invokespecial #10                 // Method java/text/ParseException."<init>":(Ljava/lang/String;I)V
      34: athrow        
      35: aload_2       
      36: invokevirtual #11                 // Method java/util/StringTokenizer.nextToken:()Ljava/lang/String;
      39: astore_3      
      40: return        
}
以字节码生成

Compiled from "stringtok.java"
public class stringtok {
public stringtok();
  Code:
     0: aload_0       
     1: invokespecial #1                  // Method java/lang/Object."<init>":()V
     4: return        

public static void main(java.lang.String[]) throws java.lang.Exception;
  Code:
     0: ldc           #2                  // String ABC
     2: astore_1      
     3: new           #3                  // class java/util/StringTokenizer
     6: dup           
     7: aload_1       
     8: invokevirtual #4                  // Method java/lang/String.toString:()Ljava/lang/String;
    11: ldc           #5                  // String ;
    13: invokespecial #6                  // Method java/util/StringTokenizer."<init>":(Ljava/lang/String;Ljava/lang/String;)V
    16: astore_2      
    17: aload_2       
    18: invokevirtual #7                  // Method java/util/StringTokenizer.hasMoreTokens:()Z
    21: ifeq          32
    24: aload_2       
    25: invokevirtual #8                  // Method java/util/StringTokenizer.nextToken:()Ljava/lang/String;
    28: astore_3      
    29: goto          43
    32: new           #9                  // class java/text/ParseException
    35: dup           
    36: ldc           #10                 // String Some msg
    38: iconst_0      
    39: invokespecial #11                 // Method java/text/ParseException."<init>":(Ljava/lang/String;I)V
    42: athrow        
    43: return        
Compiled from "stringtok2.java"
public class stringtok2 {
  public stringtok2();
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return        

  public static void main(java.lang.String[]) throws java.lang.Exception;
    Code:
       0: ldc           #2                  // String ABC
       2: astore_1      
       3: new           #3                  // class java/util/StringTokenizer
       6: dup           
       7: aload_1       
       8: invokevirtual #4                  // Method java/lang/String.toString:()Ljava/lang/String;
      11: ldc           #5                  // String ;
      13: invokespecial #6                  // Method java/util/StringTokenizer."<init>":(Ljava/lang/String;Ljava/lang/String;)V
      16: astore_2      
      17: aload_2       
      18: invokevirtual #7                  // Method java/util/StringTokenizer.hasMoreTokens:()Z
      21: ifne          35
      24: new           #8                  // class java/text/ParseException
      27: dup           
      28: ldc           #9                  // String Some msg
      30: iconst_0      
      31: invokespecial #10                 // Method java/text/ParseException."<init>":(Ljava/lang/String;I)V
      34: athrow        
      35: aload_2       
      36: invokevirtual #11                 // Method java/util/StringTokenizer.nextToken:()Ljava/lang/String;
      39: astore_3      
      40: return        
}
从“stringtok2.java”编译而来
公共类stringtok2{
公共关系2();
代码:
0:aload_0
1:invokespecial#1//方法java/lang/Object。“:()V
4:返回
publicstaticvoidmain(java.lang.String[])抛出java.lang.Exception;
代码:
0:ldc#2//字符串ABC
2:astore_1
3:新的#3//类java/util/StringTokenizer
6:dup
7:aload_1
8:invokevirtual#4//方法java/lang/String.toString:()Ljava/lang/String;
11:ldc#5//字符串;
13:invokespecial#6//方法java/util/StringTokenizer。”“:(Ljava/lang/String;Ljava/lang/String;)V
16:astore_2
17:aload_2
18:invokevirtual#7//方法java/util/StringTokenizer.hasMoreTokens:()Z
21:ifne 35
24:new#8//classjava/text/ParseException
27:dup
28:ldc#9//串一些味精
30:iconst_0
31:invokespecial#10//方法java/text/ParseException.“:(Ljava/lang/String;I)V
34:athrow
35:aload_2
36:invokevirtual#11//方法java/util/StringTokenizer.nextToken:()Ljava/lang/String;
39:astore_3
40:返回
}
因此答案是选项2和3,因为它们在理论上比字节码指令少


有人能确认一下吗?有人能确认一下吗

选项1已给出

import java.text.ParseException;
import java.util.StringTokenizer;

public class stringtok
{ 
  public static void main(String[] argv)
  throws Exception
  {
      String data="ABC";
      final StringTokenizer stoken=new StringTokenizer(data.toString(),";");
      if (stoken.hasMoreTokens()) {
          final String test=stoken.nextToken();
      } else {
          throw new ParseException("Some msg",0);
      }
  }
} 
以字节码生成

Compiled from "stringtok.java"
public class stringtok {
public stringtok();
  Code:
     0: aload_0       
     1: invokespecial #1                  // Method java/lang/Object."<init>":()V
     4: return        

public static void main(java.lang.String[]) throws java.lang.Exception;
  Code:
     0: ldc           #2                  // String ABC
     2: astore_1      
     3: new           #3                  // class java/util/StringTokenizer
     6: dup           
     7: aload_1       
     8: invokevirtual #4                  // Method java/lang/String.toString:()Ljava/lang/String;
    11: ldc           #5                  // String ;
    13: invokespecial #6                  // Method java/util/StringTokenizer."<init>":(Ljava/lang/String;Ljava/lang/String;)V
    16: astore_2      
    17: aload_2       
    18: invokevirtual #7                  // Method java/util/StringTokenizer.hasMoreTokens:()Z
    21: ifeq          32
    24: aload_2       
    25: invokevirtual #8                  // Method java/util/StringTokenizer.nextToken:()Ljava/lang/String;
    28: astore_3      
    29: goto          43
    32: new           #9                  // class java/text/ParseException
    35: dup           
    36: ldc           #10                 // String Some msg
    38: iconst_0      
    39: invokespecial #11                 // Method java/text/ParseException."<init>":(Ljava/lang/String;I)V
    42: athrow        
    43: return        
Compiled from "stringtok2.java"
public class stringtok2 {
  public stringtok2();
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return        

  public static void main(java.lang.String[]) throws java.lang.Exception;
    Code:
       0: ldc           #2                  // String ABC
       2: astore_1      
       3: new           #3                  // class java/util/StringTokenizer
       6: dup           
       7: aload_1       
       8: invokevirtual #4                  // Method java/lang/String.toString:()Ljava/lang/String;
      11: ldc           #5                  // String ;
      13: invokespecial #6                  // Method java/util/StringTokenizer."<init>":(Ljava/lang/String;Ljava/lang/String;)V
      16: astore_2      
      17: aload_2       
      18: invokevirtual #7                  // Method java/util/StringTokenizer.hasMoreTokens:()Z
      21: ifne          35
      24: new           #8                  // class java/text/ParseException
      27: dup           
      28: ldc           #9                  // String Some msg
      30: iconst_0      
      31: invokespecial #10                 // Method java/text/ParseException."<init>":(Ljava/lang/String;I)V
      34: athrow        
      35: aload_2       
      36: invokevirtual #11                 // Method java/util/StringTokenizer.nextToken:()Ljava/lang/String;
      39: astore_3      
      40: return        
}
以字节码生成

Compiled from "stringtok.java"
public class stringtok {
public stringtok();
  Code:
     0: aload_0       
     1: invokespecial #1                  // Method java/lang/Object."<init>":()V
     4: return        

public static void main(java.lang.String[]) throws java.lang.Exception;
  Code:
     0: ldc           #2                  // String ABC
     2: astore_1      
     3: new           #3                  // class java/util/StringTokenizer
     6: dup           
     7: aload_1       
     8: invokevirtual #4                  // Method java/lang/String.toString:()Ljava/lang/String;
    11: ldc           #5                  // String ;
    13: invokespecial #6                  // Method java/util/StringTokenizer."<init>":(Ljava/lang/String;Ljava/lang/String;)V
    16: astore_2      
    17: aload_2       
    18: invokevirtual #7                  // Method java/util/StringTokenizer.hasMoreTokens:()Z
    21: ifeq          32
    24: aload_2       
    25: invokevirtual #8                  // Method java/util/StringTokenizer.nextToken:()Ljava/lang/String;
    28: astore_3      
    29: goto          43
    32: new           #9                  // class java/text/ParseException
    35: dup           
    36: ldc           #10                 // String Some msg
    38: iconst_0      
    39: invokespecial #11                 // Method java/text/ParseException."<init>":(Ljava/lang/String;I)V
    42: athrow        
    43: return        
Compiled from "stringtok2.java"
public class stringtok2 {
  public stringtok2();
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return        

  public static void main(java.lang.String[]) throws java.lang.Exception;
    Code:
       0: ldc           #2                  // String ABC
       2: astore_1      
       3: new           #3                  // class java/util/StringTokenizer
       6: dup           
       7: aload_1       
       8: invokevirtual #4                  // Method java/lang/String.toString:()Ljava/lang/String;
      11: ldc           #5                  // String ;
      13: invokespecial #6                  // Method java/util/StringTokenizer."<init>":(Ljava/lang/String;Ljava/lang/String;)V
      16: astore_2      
      17: aload_2       
      18: invokevirtual #7                  // Method java/util/StringTokenizer.hasMoreTokens:()Z
      21: ifne          35
      24: new           #8                  // class java/text/ParseException
      27: dup           
      28: ldc           #9                  // String Some msg
      30: iconst_0      
      31: invokespecial #10                 // Method java/text/ParseException."<init>":(Ljava/lang/String;I)V
      34: athrow        
      35: aload_2       
      36: invokevirtual #11                 // Method java/util/StringTokenizer.nextToken:()Ljava/lang/String;
      39: astore_3      
      40: return        
}
从“stringtok2.java”编译而来
公共类stringtok2{
公共关系2();
代码:
0:aload_0
1:invokespecial#1//方法java/lang/Object。“:()V
4:返回
publicstaticvoidmain(java.lang.String[])抛出java.lang.Exception;
代码:
0:ldc#2//字符串ABC
2:astore_1
3:新的#3//类java/util/StringTokenizer
6:dup
7:aload_1
8:invokevirtual#4//方法java/lang/String.toString:()Ljava/lang/String;
11:ldc#5//字符串;
13:invokespecial#6//方法java/util/StringTokenizer。”“:(Ljava/lang/String;Ljava/lang/String;)V
16:astore_2
17:aload_2
18:invokevirtual#7//方法java/util/StringTokenizer.hasMoreTokens:()Z
21:ifne 35
24:new#8//classjava/text/ParseException
27:dup
28:ldc#9//串一些味精
30:iconst_0
31:invokespecial#10//方法java/text/ParseException.“:(Ljava/lang/String;I)V
34:athrow
35:aload_2
36:invokevirtual#11//方法java/util/StringTokenizer.nextToken:()Ljava/lang/String;
39:astore_3
40:返回
}
因此答案是选项2和3,因为它们在理论上比字节码指令少


有人能确认一下吗?

你确定这很重要吗?代码已经过分析,这一部分是瓶颈所在吗?我对理论的理解是,我建议避免像这样浪费时间的微观优化尝试,而是将重点放在更重要的问题上,比如为什么
String#split(…)
一般建议优于StringTokenizer(根据API)。了解拆分速度要慢得多,我很想知道当我需要节省宝贵的毫秒时,拆分会产生什么影响。我仔细阅读了这两个代码,并很好地掌握了它们,我不需要返回数组,也不需要担心空的标记。slit使用正则表达式,这可能有点慢。这三个代码片段做的事情完全相同。花括号的存在与否没有任何区别,无论您测试的是正常情况还是异常情况都无关紧要。选择你认为可读性和可维护性最好的。你确定这很重要吗?代码已经过分析,这一部分是瓶颈所在吗?我对理论的理解是,我建议避免像这样浪费时间的微观优化尝试,而是专注于更重要的问题,比如为什么一般推荐使用
String#split(…)
而不是StringTokenizer(根据API)。了解split的速度要慢得多,我很想知道当我需要节省宝贵的毫秒时,它会有什么不同。我仔细阅读了这两个代码,并很好地掌握了它们,我不需要返回数组,也不需要担心空的标记。slit使用正则表达式,这可能有点慢。这三个代码片段做的事情完全相同。花括号的存在与否没有任何区别,无论您测试的是正常情况还是异常情况都无关紧要。选择您认为可读性和可维护性最好的内容。