エントリー
Javaでの文字列処理について何を知っていますか? これらの知識はどれくらいあり、どれほど深く関連性がありますか? 言語のこの重要で基本的でよく使用される部分に関連するすべての問題を整理するために私と一緒に試してみましょう。 私たちの小さなガイドは2つの出版物に分かれています。
- String、StringBuffer、StringBuilder(ストリング実装)
- パターン、マッチャー(正規表現)
文字列のJava実装は、
String 、
StringBuffer 、
StringBuilderの 3つの主要なクラスで表されます。 それらについて話しましょう。
ひも
文字列は、一連の文字を表すオブジェクトです。 Java文字列を作成および操作するために、プラットフォームはpublic final(サブクラスを持つことはできません)クラス
java.lang.Stringを提供します 。 このクラスは不変です-Stringクラスの作成されたオブジェクトは変更できません。 メソッドにはこのオブジェクトを変更する権利があると思うかもしれませんが、これは正しくありません。 メソッドは、操作の結果が保存される新しい行のみを作成して返すことができます。 行の不変性は多くの可能性を提供します:
- マルチスレッド環境での文字列の使用( 文字列はスレッドセーフです)
- 文字列プールの使用(これは、メモリを最適化するために使用される文字列オブジェクトへの参照のコレクションです)
- HashMapでキーとして文字列を使用する(キーを不変にすることをお勧めします)
作成
いくつかの方法で
Stringクラスのオブジェクトを作成できます。
1.文字列リテラルの使用:
String habr = "habrahabr";
文字列リテラルは、二重引用符で囲まれた一連の文字です。 文字列リテラルを使用するときはいつでも、コンパイラはこのリテラルの値でオブジェクトを作成することを理解することが重要です。
System.out.print("habrahabr");
2.コンストラクターの使用:
String habr = "habrahabr"; char[] habrAsArrayOfChars = {'h', 'a', 'b', 'r', 'a', 'h', 'a', 'b', 'r'}; byte[] habrAsArrayOfBytes = {104, 97, 98, 114, 97, 104, 97, 98, 114}; String first = new String(); String second = new String(habr);
文字列のコピーが明示的に必要でない場合、文字列は不変であるため、これらのコンストラクタの使用は望ましくなく、必要ありません。 このように新しい施設を継続的に建設すると、生産性が低下する可能性があります。 文字列リテラルを使用して、それらを同様の初期化に置き換えることをお勧めします。
String third = new String(habrAsArrayOfChars);
コンストラクターは、文字の配列を使用して文字列オブジェクトを形成できます。 配列がコピーされ、静的メソッド
copyOfと
copyOfRangeが
Arraysクラスの使用(それぞれ、
配列全体とその部分(2番目と3番目のコンストラクターパラメーターが指定されている場合))に使用され、次に、
System.arraycopyのプラットフォーム依存の実装を使用します。
String fifth = new String(habrAsArrayOfBytes, Charset.forName("UTF-16BE"));
バイト配列を使用して文字列オブジェクトを作成することもできます。 さらに、
エンコードを担当する
Charsetクラスにパラメーターを渡すことができます。 配列は、指定されたエンコーディングを使用してデコードされ(指定されていない場合、オペレーティングシステムのエンコーディングに応じて
Charset.defaultCharset()が使用されます)、さらに、結果の文字配列がオブジェクトの値にコピーされます。
String sixth = new String(new StringBuffer(habr)); String seventh = new String(new StringBuilder(habr));
最後に、
StringBufferオブジェクトと
StringBuilderオブジェクト 、その値(
getValue() )および長さ(
length() )を使用して、文字列オブジェクトを作成するコンストラクター。 これらのクラスについては、後ほど詳しく説明します。
Stringクラスの最も一般的に使用されるコンストラクターの例を示します。実際には15があります(そのうち2つは
非推奨としてマークさ
れています )。
長さ
各行の重要な部分はその長さです。
アクセサメソッド length()を使用して
Stringオブジェクトにアクセスすると、
文字列内の文字数を返します。たとえば、次のようになります。
public static void main(String[] args) { String habr = "habrahabr";
連結
連結は、文字列を結合する操作であり、新しい文字列を返します。これは、2番目の行と最初の行の終わりを結合した結果です。
Stringオブジェクトの操作は、次の2つの方法で実行できます。
1. concatメソッド
String javaHub = "habrhabr".concat(".ru").concat("/hub").concat("/java"); System.out.println(javaHub);
concatメソッド
は文字列を変更
せず、現在のパラメーターをマージしてパラメーターとして渡した結果として新しいストリングを作成するだけであることを理解することが重要です。 はい、メソッドは新しいStringオブジェクトを返すため、このような長い「チェーン」が可能です。
2.オーバーロードされた演算子 " + "および " + = "
String habr = "habra" + "habr";
これはJavaの数少ないオーバーロード演算子の1つです。この言語では、カスタムクラスのオブジェクトのオーバーロード操作が許可されていません。 +演算子は
concatメソッドを使用しません。ここでは次のメカニズムが使用されます。
String habra = "habra"; String habr = "habr";
一度だけマージする必要がある場合は、
concatメソッドを使用します。他の場合は、「
+ 」演算子または
StringBuffer /
StringBuilderを使用することをお勧めします。 また、オペランドの1つが
nullである場合、NPE(
NullPointerException )を取得することは、「
+ 」または「
+ = 」演算子では不可能であることに注意してください。
String string = null; string += " habrahabr";
書式設定
Stringクラスは、フォーマットされた文字列を作成する機能を提供します。 静的な
フォーマットメソッドはこれに責任があります、例えば:
String formatString = "We are printing double variable (%f), string ('%s') and integer variable (%d)."; System.out.println(String.format(formatString, 2.3, "habr", 10));
方法
さまざまな方法のおかげで、文字列とその文字を操作することができます。 Oracleには文字列の
操作と
比較に関する優れた記事があるため、ここでそれらを説明することは意味がありません。 また、
ドキュメントは常に手元にあります。 Java 8で登場した新しい静的
結合メソッドに注目したかったのです。今度は、セパレーター(クラス
java.lang.StringJoinerが追加され、それを担当します)を使用して複数の行を1つにまとめることができ
ます 。
String hello = "Hello"; String habr = "habrahabr"; String delimiter = ", "; System.out.println(String.join(delimiter, hello, habr));
Java 8でのクラスの変更はこれだけではありません。Oracleは、
Stringコンストラクター
(バイト[]、*)および
getBytes()メソッドのパフォーマンスの改善を
報告しています。
変換
1.行ごとの数
int integerVariable = 10; String first = integerVariable + "";
2.番号の行
String string = "10"; int first = Integer.parseInt(string); int second = Integer.valueOf(string);
StringBuffer
行は不変であるため、頻繁に変更すると新しいオブジェクトが作成され、貴重なメモリが消費されます。 この問題を解決するために、
java.lang.StringBufferクラスが作成されました。これにより、文字列の変更をより効率的に行うことができます。 クラスは
mutable 、つまりmutableです-文字列の内容を変更する場合に使用します。
StringBufferは、必要なすべてのメソッドが同期されているため、マルチスレッド環境で使用できます。
作成
クラス
StringBufferのオブジェクトを作成するには、4つの方法があります。 各オブジェクトには独自の容量があり、これが内部バッファの長さを担当します。 内部バッファに格納されている文字列の長さがこのバッファのサイズ(
capacity )を超えない場合、新しいバッファ配列を割り当てる必要はありません。 バッファがオーバーフローすると、自動的に大きくなります。
StringBuffer firstBuffer = new StringBuffer();
修正
ほとんどの場合、
StringBufferを使用して、サブストリングの
追加 、挿入、
削除を繰り返し実行し
ます 。 ここでは、すべてが非常に単純です。たとえば、次のとおりです。
String domain = ".ru";
StringBufferを操作する他のすべてのメソッドは、
ドキュメントに記載されてい
ます 。
StringBuilder
StringBuilderは、可変の文字シーケンスを表すクラスです。 このクラスはJava 5で導入され、
StringBufferと完全に同一のAPIを備えています。 唯一の違いは、
StringBuilderが同期されないことです。 これは、マルチスレッド環境での使用が望ましくないことを意味します。 したがって、マルチスレッドを使用する場合は
StringBufferが理想的
です 。そうでない場合は、ほとんどの実装ではるかに高速に動作する
StringBuilderを使用し
ます 。 これら2つのクラスの速度を比較する小さなテストを作成します。
public class Test { public static void main(String[] args) { try { test(new StringBuffer(""));
ご清聴ありがとうございました。 この記事があなたが何か新しいことを学ぶのを助け、これらの問題のすべてのギャップを取り除くことにつながることを願っています。 追加、説明、批判はすべて歓迎します。