2012-09-29 61 views
1

在Java中,由于我有一个带有5个分隔符的字符串,例如“abc; 123; 123; abc; 123”,通常是相同的字符串长度。我需要验证每个项目,而不是太冗长。stringtokenizer java - performance

速度更快?

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

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

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

或使用split()

+2

您确定这很重要吗?代码已被分析过,而这部分是瓶颈的位置? –

+0

只需要知道理论;-) – user1320651

+2

我对理论的理解是,我会建议避免浪费时间浪费这样的微观优化尝试,而将重点放在更重要的问题上,比如为什么'String#split(...)'是一般推荐使用StringTokenizer(根据API)。 –

回答

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   

}

选项

选项1 2 & 3中给出(花括号是相同的字节码)

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

public class stringtok2 
{ 
    public static void main(String[] argv) 
    throws Exception 
    { 
     String data="ABC"; 
     final StringTokenizer stoken=new StringTokenizer(data.toString(),";"); 
     if (!stoken.hasMoreTokens()) throw new ParseException("Some msg",0); 
     final String test=stoken.nextToken(); 
    } 

} 

产生在字节码

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   
} 

因此,答案是选项2 & 3,因为它们在理论上是较少字节代码指令。

有人可以确认