我已经使用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);
}
}
答案 0 :(得分:6)
由于您只使用局部变量,因此无论您使用哪个版本,这两个版本都非常安全......
要遇到线程安全问题,您需要(不正确地)跨线程共享内容。在你的例子中没有任何东西可以分享。
更一般地说,字符串是不可变的,因此线程安全。所以第二个版本,假设共享sample
变量,将是线程安全的。
修改强>
您的最新编辑确认了两件事:
因此,这两种方法都是线程安全的,您应该选择更简单和/或更高效的方法。
答案 1 :(得分:1)
在java中,Strings
是不可变的,没有任何东西会影响原始字符串。
这种不变性使Strings
线程安全。可以同时访问多个StringTokenizer
或string.substring
,而不会出现任何问题。
然而,问题可能来自类StringTokenizer
,你不应该同时在几个字符串上使用它。但是,正如其他人所指出的,在您的代码中,您只使用局部变量,因此您不会遇到线程安全问题。
答案 2 :(得分:0)
根据Javadoc:“StringTokenizer对象在内部维护字符串中的当前位置以进行标记化。某些操作会使当前位置超过处理的字符。”
所以它不是线程安全的。你为什么要分享呢?只需将其变为局部变量即可。