SwordはOffer-40を指します-文字列を左に回転させ、熱いうちにStringBufferとStringBuildの違いを見てください

タイトル説明

アセンブリ言語には、左回転(ROL)と呼ばれるシフト命令があります。これで、この命令の結果を文字列でシミュレートするという簡単なタスクがあります。与えられた文字シーケンスSについて、それをKビット左に循環シフトした後にシーケンスを出力してください。たとえば、文字シーケンスS = "abcXYZdef"の場合、3ビット左の循環シフトの結果、つまり「XYZdefabc」を出力する必要があります。簡単じゃないですか。OK、やりなさい!

アイデア分析

暴力

コード

public class Solution {
    
    
    public String LeftRotateString(String str,int n) {
    
    
        if(str==null||str.length()==0) return "";
        StringBuffer sb = new StringBuffer();
        char[] array = str.toCharArray();
        for(int i = n;i<array.length;i++){
    
    
            sb.append(array[i]);
        }
        for(int i = 0;i<n;i++){
    
    
            sb.append(array[i]);
        }
        return sb.toString();
    }
}

熱を利用して、StringBufferとStringBuildの違いを確認してください

まず、StringBufferとStringBuildに関しては、最初にStringを確認する必要があります。

文字列について注意すべきいくつかのポイント:

  • 文字列はequalメソッドを書き換えます。したがって、その等しい値は、比較対象の参照型が指すアドレスではなく、比較の実際に格納されている値です。
  • 文字列ソースコード:
    /** The value is used for character storage. */
    private final char value[];

どういう意味ですか?これは、Stringクラスがfinalキーワードで変更された文字配列を使用して格納されることを意味します。すぐにプッシュすると、Stringオブジェクトは不変です。

  • JDK1.9のStringクラスは、ストレージにバイト配列を使用することに注意してください。
  • private final byte value[]

StringBuffer和StringBuild

  • まず、2つの基礎となるソースコードを見てください。
 public final class StringBuffer
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence
    {
    
    

    /**
     * A cache of the last value returned by toString. Cleared
     * whenever the StringBuffer is modified.
     */
    private transient char[] toStringCache;

    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    static final long serialVersionUID = 3388685877147921107L;

    /**
     * Constructs a string buffer with no characters in it and an
     * initial capacity of 16 characters.
     */
    public StringBuffer() {
    
    
        super(16);
    }
public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence{
    
    
      /** use serialVersionUID for interoperability */
    static final long serialVersionUID = 4383685877147921099L;

    /**
     * Constructs a string builder with no characters in it and an
     * initial capacity of 16 characters.
     */
    public StringBuilder() {
    
    
        super(16);
    }
  • どちらもソースコードから継承されていますAbstractStringBuilder親クラスでは、文字列配列は文字列の格納にも使用されます。ただし、Stringのような最終的な変更はないため、可変です。

  • それらはすべて、親クラスのコンストラクターを呼び出します。

  • 文字列は定数であり、スレッドセーフです。

  • StringBufferは、メソッドに同期ロックを追加するか、呼び出されたメソッドに同期ロックを追加するため、スレッドセーフです。
    ここに画像の説明を挿入

  • StringBuilderはロックされていないため、スレッドは安全ではありません。
    ここに画像の説明を挿入

  • ここに画像の説明を挿入

  • ここに画像の説明を挿入
    参照:JavaGuideStringBufferとStringBuildの違い

おすすめ

転載: blog.csdn.net/H1517043456/article/details/107451872