[ターン] Javaでの文字列操作(String、StringBuiler、StringBufferを比較)

著者:@Yuchao Huang

元のリンク:https://cnblogs.com/misterchaos/p/12782986.html

著作権表示:無料で転載-非営利-クリエイティブ・コモンズ表示4.0

I.はじめに

私が最初にJavaを学び始めたとき、C言語しか知らない初心者として、Javaでの文字列操作にショックを受けました。対照的に、C言語は文字列を表すためにバイト配列に末尾の\ 0を保存します。文字列のスプライシングを実装する場合は、strcpyライブラリ関数を呼び出すか、配列を手動でコピーする必要があります。これは非常に面倒です。他の複雑な操作について言及すると、Javaは、Stringクラスを介して文字列操作を非常に簡単で便利にします。さらに、stringbuilderなどのこれらのクラスの支援があるため、この記事では、String、StringBuiler、およびStringBufferの違いから始めて、Javaでの文字列操作について説明します。

二、文字列、StringBuiler和StringBuffer

2.1文字列クラス

Javaは、文字列を作成および操作するためのStringクラスを提供します。ソースコードで**を確認できます。Stringクラスの内部実装もバイト配列**です。この配列は最終型であるため、** Stringは不変オブジェクトです。Stringが毎回変更されます。クラスが変更されました。新しい文字列オブジェクト**を生成し、ポインタを新しい文字列オブジェクトにポイントします。

2.2StringBuilerクラス

Stringクラスとは異なり、StringBuilderクラスのオブジェクトは、新しいオブジェクトを生成せずに複数回変更できますこの機能の重要性は、多数の文字列操作を実行する場合、Stringクラスを使用するとパフォーマンスが大幅に消費され、StringBuilderがこの問題を回避できることです。

2.3StringBufferクラス

StringBufferとStringBuilerの最大の違いは、StringBuilderのメソッドスレッドセーフではないことです。

StringBuilderはStringBufferに比べて速度が優れているため、ほとんどの場合、StringBuilderクラスを使用することをお勧めします。ただし、アプリケーションでスレッドセーフが必要な場合は、StringBufferクラスを使用する必要があります。

2.4 String、StringBuiler、StringBufferの比較(C / C ++との比較)

操作タイプ 説明 変数 スレッドセーフ パフォーマンス
Javaの文字列 Stringクラスのfinalキーワードを使用して文字配列を変更し、文字列を保存します 不変 スレッドセーフ
JavaのStringBuffer 文字列変数 変数 スレッドセーフ 一般
JavaのStringBuilder 文字列変数 変数 スレッドセーフではありません 一般
C / C ++でのChar *操作 char *は、文字列の配列を指すことができるポインタです。 変数 わからない 高い
C / C ++の文字配列 文字配列を使用して文字列を格納する 不変 わからない 高い
C / C ++の文字列ラッパークラス 文字列は、文字を要素とする一種のコンテナと見なすことができます。 変数 同時読み取り操作はスレッドセーフです より高い

第三に、さまざまな文字列操作の効率テスト

3.1テストコード

    @Test
    public void test() {
    
    
        int count = 100000;

        long startTime = System.currentTimeMillis();
        String str = "";
        for(int i = 0; i< count; i++){
    
    
            str += i;
        }
        System.out.println("执行"+count+"次  String 耗时:"+ getRunTime(startTime));

        startTime = System.currentTimeMillis();
        StringBuilder stringBuilder = new StringBuilder("");
        for (int i = 0; i < count; i++) {
    
    
            stringBuilder.append(i);
        }
        System.out.println("执行"+count+"次  StringBuilder 耗时:"+ getRunTime(startTime));

        startTime = System.currentTimeMillis();
        StringBuffer stringBuffer = new StringBuffer("");
        for (int i = 0; i < count; i++) {
    
    
            stringBuffer.append(i);
        }
        System.out.println("执行"+count+"次  StringBuffer 耗时:"+ getRunTime(startTime));

    }

3.2テスト結果

执行100000次  String 耗时:32s
执行100000次  StringBuilder 耗时:2ms
执行100000次  StringBuffer 耗时:4ms

3.3まとめ

StringクラスのパフォーマンスはStringBuilerおよびStringBufferのパフォーマンスよりもはるかに低く、このテストではStringBuilerによってStringbufferのパフォーマンスが50%向上していることがわかります。

4つ、Java文字列と正規表現

4.1テストコード

    @Test
    public void test0(){
    
    
        //邮政编码
        String postCode = "[1-9]\\d{5}";
        //区号-座机号码
        String areaCode = "\\d{3}-\\d{8}|\\d{4}-\\d{7}";
        //手机号码
        String phone = "(?:13\\d|15\\d|18\\d)\\d{5}(\\d{3}|\\*{3})";

        String text = "邮政编码:440834"+
                      "区号-座机号码: 020-12345678"+
                      "手机号:13536373839"+
                      "邮政编码:440833"+
                      "区号-座机号码: 010-12345678"+
                      "手机号:13536373739";

        Pattern p = Pattern.compile(postCode);
        Matcher m = p.matcher(text);
        System.out.println("文本中包含邮政编码:");
        while (m.find()){
    
    
            System.out.println(m.group());
        }

        p = Pattern.compile(areaCode);
        m= p.matcher(text);
        System.out.println("文本中包含区号-座机号码:");
        while (m.find()){
    
    
            System.out.println(m.group());
        }

        p = Pattern.compile(phone);
        m= p.matcher(text);
        System.out.println("文本中包含手机号:");
        while (m.find()){
    
    
            System.out.println(m.group());
        }
    }

4.2テスト結果

文本中包含邮政编码:
440834
123456
135363
440833
123456
135363
文本中包含区号-座机号码:
020-12345678
010-12345678
文本中包含手机号:
13536373839
13536373739

五数要約

テストと比較の結果、Javaでの同じ文字列操作が、実装の背後にある原則が異なるため、結果として生じるパフォーマンスの違いも非常に大きいことがわかります。対照的に、C / C ++での文字列操作の方がパフォーマンスが高くなります。StringクラスのパフォーマンスはStringBuilerおよびStringBufferのパフォーマンスよりもはるかに低く、StringBuilerのパフォーマンスはStringbufferのパフォーマンスよりもわずかに高くなっています。パフォーマンス調査の最後に、使用シーンに戻る必要があります。文字列操作が含まれない場合は、Stringクラスが最初の選択肢であると結論付けることができます。関連する文字列操作にスレッドセーフの問題がない場合は、 StringBuilder。文字列操作に関連する文字にスレッドセーフの問題がある場合は、StringBufferを使用します

6、参考資料

おすすめ

転載: blog.csdn.net/weixin_43438052/article/details/113879136