1

我已经使用 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);
    }
}
4

3 回答 3

6

由于您只使用局部变量,因此无论您对它们做什么,这两个版本都是非常安全的......

要遇到线程安全问题,您需要(不正确地)跨线程共享某些内容。在您的示例中无法共享任何内容。

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

编辑

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

  • 你的类是无状态的(没有实例变量)
  • 你只使用局部变量

所以这两种方法都是线程安全的,你应该选择更简单和/或更有效的一种。

于 2013-01-02T16:57:15.880 回答
1

在java中,Strings都是不可变的,没有什么会影响原来的字符串。

这种不变性使Strings线程安全。可以多人访问,也可以同时访问,StringTokenizer没有string.substring任何问题。

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

于 2013-01-02T17:09:29.170 回答
0

根据 Javadoc:“StringTokenizer 对象在内部维护要标记的字符串中的当前位置。一些操作将当前位置推进到处理的字符之外。”

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

于 2013-01-02T16:57:15.217 回答