线程安全字符串拆分

时间:2013-01-02 16:55:04

标签: java performance split

我已经使用StringTokenizer和String的方法indexOf()以及substring()运行了拆分测试。结果我必须知道,第二个比StringTokenizer更快。但我的问题是哪个最适合线程安全?

使用StringTokenizer分割字符串:

String sample=null;
StringTokenizer tokens = new StringTokenizer("FF#Mukil","#");

if(tokens.hasMoreTokens())
{
    sample= tokens.nextToken();
    System.out.println(sample);
}

使用String方法分割字符串:

String sample= "FF#Mukil";
int pos=sample.indexOf('#');
System.out.println(sample.substring(0,pos));

在这些示例中,示例是全局变量 提前致谢

编辑: 在上一个第一个例子如下面

StringTokenizer tokens = new StringTokenizer("FF#Mukil","#");

    if(tokens.hasMoreTokens())
    {
        String sample= tokens.nextToken();
        System.out.println(sample);
    }

我已经改变了它,如下面

String sample=null;
StringTokenizer tokens = new StringTokenizer("FF#Mukil","#");

    if(tokens.hasMoreTokens())
    {
        sample= tokens.nextToken();
        System.out.println(sample);
    }

编辑:添加了java文件源。

//FileName=MySplitUtil.java
import javax.servlet.http.HttpServletRequest;
import java.util.StringTokenizer;
public class MySplitUtil
{
    public static void setUsername_locale(HttpServletRequest request)
    {
        String value = (String) request.getAttribute("userLocale"); // userLocale's sample value looks like ffmukil$en_US
        splite1(value,request);
        splite2(value,request);
    }
    private static void splite1(String value,HttpServletRequest request)
    {
        StringTokenizer tokens = new StringTokenizer(value,"$");
        String username=null;
        String locale=null;
        if(tokens.hasMoreTokens())
        {
            username = tokens.nextToken();
            locale = tokens.nextToken();
        }
        request.setAttribute("usrName",username);
        request.setAttribute("usr_Locale",locale);
    }
    private static  void splite2(String value,HttpServletRequest request)
    {
        int pos = value.indexOf('$');
        String username = value.substring(0,pos);
        String locale = value.substring(pos+1,value.length());
        request.setAttribute("usrName",username);
        request.setAttribute("usr_Locale",locale);
    }
}

3 个答案:

答案 0 :(得分:6)

由于您只使用局部变量,因此无论您使用哪个版本,这两个版本都非常安全......

要遇到线程安全问题,您需要(不正确地)跨线程共享内容。在你的例子中没有任何东西可以分享。

更一般地说,字符串是不可变的,因此线程安全。所以第二个版本,假设共享sample变量,将是线程安全的。

修改

您的最新编辑确认了两件事:

  • 你的班级是无国籍的(没有实例变量)
  • 您只使用本地变量

因此,这两种方法都是线程安全的,您应该选择更简单和/或更高效的方法。

答案 1 :(得分:1)

在java中,Strings是不可变的,没有任何东西会影响原始字符串。

这种不变性使Strings线程安全。可以同时访问多个StringTokenizerstring.substring,而不会出现任何问题。

然而,问题可能来自类StringTokenizer,你不应该同时在几个字符串上使用它。但是,正如其他人所指出的,在您的代码中,您只使用局部变量,因此您不会遇到线程安全问题。

答案 2 :(得分:0)

根据Javadoc:“StringTokenizer对象在内部维护字符串中的当前位置以进行标记化。某些操作会使当前位置超过处理的字符。”

所以它不是线程安全的。你为什么要分享呢?只需将其变为局部变量即可。