JavaはC ++に基づいて開発されましたが、C ++の多くの欠点を改善しました。言及しなければならないことの1つは文字列です。学習が深まると、MFCを入力するとき、文字列または文字を処理するときに、_t()マクロを使用して文字または文字列をUnicodeタイプに変える必要があることがよくあります。それ以外の場合、処理中にバグが発生します。 Javaでは、キャラクタークラスに保存されている文字チャーまたはキャラクターは、1バイトではなく、2バイトです。 Unicodeが使用されます。これは、世界のすべてのキャラクターをサポートするためです。
文字のシーケンスは文字列を形成し、文字列には2つのタイプがあります。1つは、作成後に変更する必要のない文字列定数であり、文字列定数と呼ばれます。 Javaでは、文字列クラスを使用して保存されます。
1つは、文字列変数と呼ばれる作成後に変更する必要がある文字列変数です。 Javaでは、StringBufferクラスを使用して操作および管理されています。
StringBufferクラス
1. stringbufferクラスオブジェクトを作成します
StringBufferクラスオブジェクトは文字列変数を表します(「変数」であることに注意してください)。各StringBufferクラスオブジェクトは、拡張および変更できる文字列変数です。以下は、一般的に使用されるStringBufferクラスコンストラクターです。
(1)public stringbuffer()
StringBufferクラスの新しい空のオブジェクトを作成し、その容量の初期値が16文字に設定されています(16文字であることに注意してください)
(2)public stringbuffer(int length)
容量の初期値が長さの文字に設定されている新しい空のstringbufferオブジェクトを作成します
(3)public stringbuffer(string str)
コンテンツがSTRのコンテンツである新しいStringBufferオブジェクトを作成し、容量がSTRの長さに設定され、16文字を追加します(注:16文字を追加)
2。stringbufferクラスオブジェクトの一般的な方法
(1)StringBufferクラスオブジェクトの拡張
StringBufferクラスは、StringBufferオブジェクトに含まれる文字を拡張するための2セットのメソッドを提供します。
1)public stringbuffer append
(オブジェクトOBJ)
追加方法は、stringbufferオブジェクトに含まれる文字を展開するために使用されます。指定されたパラメーターオブジェクトを文字列に変換した後、元のStringBufferオブジェクトの後に追加し、新しいStringBufferオブジェクトを返します。追加のパラメーターオブジェクトは、int、char、string、doubleなどのさまざまなデータ型を使用できます。
2)public stringbuffer insert(
int挿入位置オフセット、パラメーターオブジェクトタイプ、パラメーターオブジェクト名)
このメソッドは、指定されたパラメーターオブジェクトを文字列に変換し、指定された位置に元のStringBufferオブジェクトの位置に挿入し、新しいStringBufferオブジェクトを返します。
(2)StringBufferクラスオブジェクトの長さと容量
StringBufferクラスオブジェクトの長さは、含まれる文字の数を指します。容量とは、割り当てられた文字スペースの数を指します。
1)public int length()
このメソッドは、現在のStringBufferクラスオブジェクトに含まれる文字の数を返します。
2)public int caperage()
このメソッドは、現在のStringBufferクラスオブジェクトによって割り当てられた文字スペースの数を返します。
(3)StringBufferクラスオブジェクトの変更
public void setCharat(intindex、chearch)
このメソッドは、現在のStringBufferオブジェクトのインデックス位置の文字を指定された文字chに置き換えます。
(4)文字列の割り当てと追加
文字列は、プログラムでよく使用されるデータ型です。文字列の割り当てと追加は、Javaコンパイルシステムに導入されています。
(5)他の方法は文字列クラスの方法に似ています
3. StringTokenizerクラスを使用して、文字列を分解します
StringTokenizerクラスはjava.utilパッケージにあり、このクラスを使用すると、プログラムの開始時に追加されます。
importjava.util.stringtokenizerまたは
importjava.util。*
StringTokenizerクラス
StringTokenizerクラスの場合、その主な機能は、指定されたスプリット文字に従って文字列を分割することであり、その機能は文字列クラスの分割方法に似ています
1。StringTokenizerクラスのコンストラクター
(1)stringtokenizer(stringsstr)
指定された文字列strの弦楽師オブジェクトを作成します。その区切り文字は「/t/n/r/f」に設定されています。つまり、スペース、水平タブ、ラインブレーク、キャリッジリターン、テーブル文字
(2)stringtokenizer(string str、string delim)
指定された文字列STRの弦楽剤オブジェクトを作成します。
3)StringTokenizer(String STR、String Delim、Boolean ReturnDelims)
指定された文字列デリムである設計が指定された文字列strの弦楽師オブジェクトを作成します。 ReturnDelimsがTRUEの場合、作成されたStringTokenizerオブジェクトの各文字列には区切り文字が含まれています。
2。stringtokenizerクラスの一般的な方法
nintcounttokens()
分割された後、StringTokenizerオブジェクトのサブストリングの数を返します
nbooleanhasmoreelements()
この方法の機能は、hasmoretokens()メソッドの機能と同じです
nbooleanhasmoreTokens()
StringTokenizerオブジェクトに分割されたサブストリングが含まれているかどうかを検出します。もしそうなら、それは真実に戻ります、そうでなければそれはfalsを返します。
objectnextelement()
この方法は、NextToken()と同じ関数です。主な違いは、文字列オブジェクトではなくオブジェクトオブジェクトを返すことです
stringnexttoken()
StringTokenizerオブジェクトの次の分割サブストリングを返します
stringnexttoken(string delim)
StringTokenizerオブジェクトの次の分割サブストリングを返しますが、デリミッターはデリムにリセットされます
nin事実、cなどのいくつかのプログラミング言語では、文字列は文字配列で構成されており、各文字列の端は「/0」とマークされていますが、これはJavaではそうではありません。
nin java、文字列は通常、文字列クラスのオブジェクトとして存在します。オブジェクトです。
したがって、Javaの文字列と文字アレイは完全に異なり、Cの文字列とも異なります!
文字列と文字アレイの変換を容易にするために、そのようなコンストラクターとメソッドの多くが文字列クラスで提供されています
n、constructor string(char [] value)など
nメソッドtoCharArray()
メソッド値(char [] data)
一定のプール
ソースプログラムに表示される文字列定数の場合、プログラムが実行されると、キャッシュ用に一定のプールに保存されます。
一定のプールでキャッシュされたこれらの文字列を参照する変数を比較すると、==で正しい結果が得られます。
ただし、実行時には、 +、サブストリングなどの文字列のさまざまな操作が新しい文字列オブジェクトを生成します。
しかし、強力なコンパイラは、S3 = "Hell" + "O"の場合など、弦定数のステッチを最適化しますが、S3は定数プールの文字列を指します。ただし、可変操作の場合、S1 + S2などの仮想マシンに実行するように要求し、結果がすでに定数プールにあるかどうかを判断することは不可能です。したがって、==の代わりに等しく使用して、2つの文字列が等しいかどうかを判断します。
public static void main(string [] args){//文字列定数は一定のプールに配置されます。文字列s1 = "hello";文字列s2 = "hello";文字列s3 = "hell" + "o"; System.out.println(s1 == s2); System.out.println(s1 == s3); //操作 + +、文字列上のサブストリングは新しいものを作成します。文字列s4 = "hell";文字列s5 = s4 + "o"; System.out.println(s1 == s5); System.out.println(s1.equals(s5)); //サブストリングには、サブストリング(0)文字列S6 = S1.Substring(0)に特別なハンドルがあります。 System.out.println(s1 == s6); }S1、S2、S3のバイトコードをテストします。
0:LDC#16; //文字列こんにちは
2:store_1
3:LDC#16; //文字列こんにちは
5:store_2
6:LDC#16; //文字列こんにちは
8:store_3
S4とS5のバイトコードをテストします。
41:LDC#30; //文字列地獄
43:ストア4
45:新しい#32; //クラスJava/Lang/StringBuilder
48:dup
49:Aload 4
51:Invokestatic#34; //メソッドjava/lang/string.valueof :( ljava/lang/object;)ljava/lang/string;
54:Invokespecial#40; //メソッドJava/Lang/StringBuilder。 "<init>" :( ljava/lang/string;)v
57:LDC#43; //文字列o
59:InvokeVirtual#45; //メソッドJava/Lang/StringBuilder.Append:(ljava/Lang/String;)ljava/lang/stringbuilder;
62:InvokeVirtual#49; //メソッドJava/Lang/StringBuilder.ToString :()Ljava/Lang/String;
サブストリング法、サブストリング(0,3)は文字0〜2から得られる文字列であることに注意してください。この設計の理由は、サブストリングの長さ3-0 = 3を計算するのが簡単であることです。同時に、サブストリングには特別なパラメーターのための特別な最適化処理があります。
public string substring(int vertingindex、int endindex){if(beginIndex <0){throw new StringIndexOfBoundSexception(beginIndex); } if(endindex> count){new StringIndexOutofBoundSexception(EndIndex); } if(beginIndex> endIndex){new StringIndexOutOfBoundSexception(EndIndex -beginIndex); } return((beginindex == 0)&&(endindex == count))?これ:new String(offset + beginindex、endindex -beginindex、value); }このことから、文字列オブジェクトの背後に魔法は何もないことがわかり、Bytecodeをある程度理解することで、それをよりよく理解することができます。
実際、クラスと方法に関する多くの情報は、パッケージ名、クラス名、メソッド署名など、一定のプールに保存されています。興味がある場合は、詳細な調査を実施できます。