1

StringTokenizer と String のメソッド indexOf() に続いて substring() を使用して分割テストを実行しました。私が知っていなければならない結果の後、2番目のものは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したがって、変数が共有されていると仮定すると、2 番目のバージョンはスレッドセーフになります。

編集

あなたの最新の編集は2つのことを確認します:

  • あなたのクラスはステートレスです(インスタンス変数なし)
  • ローカル変数のみを使用します

したがって、どちらの方法もスレッドセーフであり、より単純で効率的な方法を選択する必要があります。

于 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 に答える