タイトル説明
アセンブリ言語には、左回転(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はロックされていないため、スレッドは安全ではありません。
-