1. String クラスの概要
Stringクラスの定義と特徴
String クラスは、不変の文字列シーケンスを表すために Java で提供されるコア クラスです。これは、java.lang パッケージで定義されている Java 標準ライブラリの一部であり、最終クラスであるため、継承することはできません。String クラスの定義と特徴については、以下で詳しく紹介します。
-
定義:
String クラスは参照型 (Reference Type) であり、文字で構成される文字列を表すために使用されます。Java では、文字列はプリミティブ データ型ではなくオブジェクトとして扱われます。各 String オブジェクト インスタンスには一連の文字が含まれており、そのシーケンスの長さと内容は固定です。 -
不変性:
String オブジェクトは不変です。つまり、一度作成されると、その値は変更できません。これは、String オブジェクトの作成後にその内容を変更できないことを意味します。String オブジェクトに対する操作の場合、新しい String オブジェクトが返され、元のオブジェクトは変更されません。この不変性により、String オブジェクトはスレッドセーフかつメモリセーフになります。 -
文字列定数プール:
Java の文字列定数プール (String Pool) は、文字列定数を格納するために使用される特別なメモリ領域です。文字列リテラルによって作成された String オブジェクトは、まず文字列定数プール内で検索され、同じ値の文字列が存在する場合は、定数プール内の対応する参照が直接返されます。このメカニズムにより、メモリ領域が節約され、文字列の再利用性が向上します。 -
メソッドと操作:
String クラスは、文字列を処理するための豊富なメソッドと操作を提供します。一般的に使用される操作には、文字列の連結、部分文字列の抽出、文字検索、置換、比較などがあります。String クラスは、文字列の長さ、大文字と小文字の変換、文字エンコーディングの変換などの一般的な操作のサポートも提供します。 -
その他の機能:
- 文字列オブジェクトは不変であるため、マルチスレッド環境で安全に共有できます。
- String クラスは Comparable インターフェイスを実装しているため、文字列の比較および並べ替え操作を実行できます。
- String クラスは、ファイル処理、ネットワーク通信、データベース操作など、Java のさまざまなシナリオで広く使用されています。
String オブジェクトの不変性により、文字列が変更されるたびに新しい String オブジェクトが生成されるため、多数の文字列が頻繁に操作されるとパフォーマンスの問題が発生する可能性があることに注意してください。この状況を回避するには、StringBuilder クラスまたは StringBuffer クラスを使用して文字列操作を実行し、最後に String オブジェクトに変換します。
Stringオブジェクトの作成方法
-
String リテラルを使用して作成:
これは、String オブジェクトを作成する最も一般的で簡単な方法です。文字列リテラルを引用符で囲むと、Java コンパイラはそれを String オブジェクトに自動的に変換します。例えば:String str1 = "Hello, World!";
文字列リテラルを使用して作成された String オブジェクトは、まず文字列定数プールに同じ値を持つ文字列があるかどうかを確認し、存在する場合は定数プール内の参照を返し、存在しない場合は新しい文字列を返します。文字列オブジェクトが作成され、文字列定数プールに追加されます。
-
new キーワードを使用して作成する:
new キーワードと String クラスのコンストラクターを使用すると、新しい String オブジェクトを明示的に作成できます。例えば:String str2 = new String("Hello");
この方法で String オブジェクトを作成すると、同じ値を持つ文字列が文字列定数プールにすでに存在するかどうかに関係なく、新しい String オブジェクトが作成されます。したがって、new キーワードを使用して作成された String オブジェクトは、文字列定数プールを使用しません。
-
文字配列を使用して作成:
文字配列を使用して String オブジェクトを作成することもできます。文字配列を String クラスのコンストラクターにパラメーターとして渡すことにより、文字配列の内容を含む String オブジェクトを作成できます。例えば:char[] chars = { 'H', 'e', 'l', 'l', 'o'}; String str3 = new String(chars);
文字配列全体または配列のサブセットを渡して String オブジェクトを作成できます。
-
文字列連結の使用:
文字列連結演算子 (+) を使用して、複数の文字列を連結し、新しい String オブジェクトを作成します。例えば:String str4 = "Hello" + ", " + "World!";
この場合、コンパイラは文字列連結の操作を StringBuilder クラスまたは StringBuffer クラスを使用するように自動的に変換し、最終的に結果を String オブジェクトに変換します。
文字列リテラルを使用して作成された String オブジェクトは文字列定数プールに自動的に追加されますが、new キーワードを使用して作成された String オブジェクトは文字列定数プールに追加されないことに注意してください。さらに、文字列定数プール内の文字列オブジェクトは実行時に不変ですが、new キーワードを使用して作成された String オブジェクトは変更できます。
不変性と文字列定数プールの概念
-
不変性:
String オブジェクトは不変です。つまり、String オブジェクトが作成されると、その値は変更できません。この不変性は次の側面に具体化されています。-
文字列の変更: String オブジェクトの内容は固定されており、その変更は許可されません。String オブジェクトに対する変更操作は実際には新しい String オブジェクトを返し、元のオブジェクトは変更されません。例えば:
String str = "Hello"; str = str + ", World!";
上記の例では、
str + ", World!"
実際には新しい String オブジェクトが作成されますが、元の "Hello" String オブジェクトは変更されません。 -
文字列の連結: 文字列連結操作の場合、新しい String オブジェクトも返されます。例えば:
String str1 = "Hello"; String str2 = " World!"; String result = str1 + str2;
上記のコードでは、
str1 + str2
新しい String オブジェクトが作成されます。 -
文字の置換: String オブジェクトの文字は直接置換できません。文字列の結合または StringBuilder/StringBuffer クラスを使用して実現する必要があります。例えば:
String str = "Hello"; str = str.replace('H', 'W'); // 无法直接替换,需要重新赋值
不変性の利点はマルチスレッド環境に反映され、複数のスレッドは String オブジェクトの変更を心配することなく安全に共有できます。さらに、不変性により、文字列定数プールの実装も容易になります。
-
-
文字列定数プール (文字列プール):
文字列定数プールは、文字列定数を格納するための Java の特別なメモリ領域です。次のような特徴があります。- 文字列定数プールは、通常のヒープとは異なるヒープ メモリに配置されます。
- 文字列リテラルによって作成された String オブジェクトは、まず文字列定数プール内に同じ値を持つ文字列があるかどうかを確認します。存在する場合は、新しいオブジェクトを作成せずに定数プール内の参照を直接返します。存在しない場合は、定数プール内に新しい String オブジェクトを作成します。
- 文字列定数プールの目的は、メモリ領域を節約し、文字列の再利用性を向上させることです。String オブジェクトは不変であるため、同じ値を複数の String オブジェクト間で安全に共有でき、メモリのオーバーヘッドが軽減されます。
文字列定数プールを使用すると、メモリ内に同じ値を持つ String オブジェクトを繰り返し作成することが回避され、プログラムのパフォーマンスと効率が向上します。このため、文字列リテラルを使用して String オブジェクトを作成することが最も一般的な方法の 1 つとなります。
要約すると、String オブジェクトの不変性は、一度作成されるとその値を変更できないことを意味します。文字列定数プールは、文字列定数を保存するために使用される特別なメモリ領域であり、同じ値の String オブジェクトを再利用することでメモリ領域を節約し、パフォーマンスを向上させます。
次に、文字列の基本的な操作
文字列の連結と連結
-
「+」演算子を使用する:
「+」演算子を使用して、複数の文字列を連結して新しい文字列を生成します。例えば:String str1 = "Hello"; String str2 = " World!"; String result = str1 + str2;
この例では、 「+」演算子を連結して使用する
str1
と、値が のstr2
新しい文字列が生成されます。この方法は非常に簡潔で理解しやすく、少数の文字列の接続に適しています。result
"Hello World!"
-
concat() メソッドを使用します。
concat()
このメソッドは、指定された文字列を文字列の末尾に連結するために使用されます。例えば:String str1 = "Hello"; String str2 = " World!"; String result = str1.concat(str2);
上の例では、 はの末尾に連結され、結果が に代入され
str1.concat(str2)
ます。同様に、この方法は少数の文字列を連結する場合にも適しています。str2
str1
result
-
StringBuilder クラスまたは StringBuffer クラスを使用する:
多数の文字列連結操作を実行する必要がある場合、またはマルチスレッド環境で文字列操作を実行する必要がある場合は、より効率的で可変の文字列操作メソッドを提供する StringBuilder クラスまたは StringBuffer クラスを使用することをお勧めします。 。例えば:StringBuilder sb = new StringBuilder(); sb.append("Hello"); sb.append(" World!"); String result = sb.toString();
この例では、
append()
StringBuilder のメソッドを使用して複数の文字列を 1 つずつ StringBuilder オブジェクトに追加し、最後にtoString()
メソッドを通じて StringBuilder オブジェクトを String オブジェクトに変換します。StringBuilder クラスはスレッド セーフではありませんが、StringBuffer クラスはスレッド セーフであることに注意してください。したがって、シングルスレッド環境では、StringBuilder クラスを使用して文字列連結操作を実行することをお勧めします。
どのメソッドで文字列を結合しても、新しい文字列オブジェクトが生成されます。これは、Java では String オブジェクトが不変であり、その場で変更できないためです。したがって、文字列の連結または連結操作ごとに、新しい String オブジェクトが作成されます。
文字列比較
Java では、文字列比較は 2 つの文字列が等しいかどうかを判断したり、文字列の順序を決定したりする一般的で重要な操作です。Java には、文字列を比較するためのメソッドがいくつか用意されています。
-
equals() メソッドを使用します。
equals()
このメソッドは、2 つの文字列の内容が同じかどうかを判断するために使用されます。例えば:String str1 = "Hello"; String str2 = "hello"; boolean isEqual = str1.equals(str2);
上の例では、2 つの文字列の内容がまったく同じではないため、
str1.equals(str2)
は を返します。false
メソッドでは大文字と小文字が区別されることに注意してくださいequals()
。 -
equalsIgnoreCase() メソッドを使用します。
equalsIgnoreCase()
このメソッドは、文字列の大文字と小文字を無視して、2 つの文字列の内容が同じかどうかを判断するために使用されます。例えば:String str1 = "Hello"; String str2 = "hello"; boolean isEqual = str1.equalsIgnoreCase(str2);
この例では、大文字と小文字が区別されないため、
str1.equalsIgnoreCase(str2)
が返されますtrue
。 -
CompareTo() メソッドを使用します。
compareTo()
このメソッドは、文字列を辞書順に比較するために使用されます。2 つの文字列間の関係を表す整数を返します。具体的なルールは次のとおりです。- 文字列が等しい場合は 0 を返します。
- 現在の文字列が引数の文字列より小さい場合は、負の数値を返します。
- 現在の文字列が引数の文字列より大きい場合は、正の数を返します。
例えば:
String str1 = "apple"; String str2 = "banana"; int result = str1.compareTo(str2);
上記の例では、
str1.compareTo(str2)
負の数値が返され、str1
辞書順に より前であることを示しますstr2
。 -
CompareToIgnoreCase() メソッドを使用します。
compareToIgnoreCase()
このメソッドはcompareTo()
メソッドと似ていますが、文字列の大文字と小文字を無視します。例えば:String str1 = "Apple"; String str2 = "banana"; int result = str1.compareToIgnoreCase(str2);
この例では、
str1.compareToIgnoreCase(str2)
負の数値が返されます。これは、str1
辞書順str2
(大文字と小文字は無視) の前を意味します。
文字列比較方法はすべて Unicode 値に基づいていることに注意してください。さらに、==
演算子を使用して 2 つの文字列の参照が等しいかどうかを比較できますが、文字列の内容は比較されず、2 つの文字列オブジェクトが同じメモリ アドレスを指しているかどうかだけが判断されます。
文字列の抽出と傍受
Java では、さまざまな方法を使用して文字列を抽出したり切り詰めたりできます。これらの操作により、元の文字列から特定の部分を選択し、新しい文字列を作成できます。
-
substring() メソッドを使用する:
substring()
このメソッドは、元の文字列から部分文字列を抽出するために使用されます。1 つまたは 2 つのパラメータを取り、最初のパラメータは部分文字列の開始インデックス (これを含む) を指定し、2 番目のパラメータ (オプション) は部分文字列の終了インデックス (これを含まない) を指定します。例えば:String str = "Hello World"; String substring1 = str.substring(6); // 从索引6开始截取到字符串末尾 String substring2 = str.substring(0, 5); // 从索引0开始截取到索引5(不包括)
上記の例では、
substring1
の値"World"
、およびsubstring2
の値"Hello"
。 -
Split() メソッドを使用します。
split()
このメソッドは、指定された区切り文字に従って文字列を複数の部分文字列に分割し、文字列配列を返すために使用されます。例えば:String str = "apple,banana,orange"; String[] substrings = str.split(",");
この例では、
split(",")
文字列はstr
コンマ区切り文字に従って 3 つの部分文字列に分割され、文字列配列に格納されますsubstrings
。substrings[0]
つまり"apple"
、、 、substrings[1]
のため。"banana"
substrings[2]
"orange"
-
charAt() メソッドを使用します。
charAt()
このメソッドは、文字列内の指定されたインデックス位置にある文字を返すために使用されます。インデックスは 0 から始まります。例えば:String str = "Hello"; char ch = str.charAt(1); // 获取索引为1的字符,即"e"
上の例では、
ch
の値は'e'
. -
substring() メソッドとindexOf() メソッドを使用する:メソッドとメソッドを組み合わせ
て使用すると、文字列内の特定の部分を抽出できます。例えば:substring()
indexOf()
String str = "The quick brown fox"; int startIndex = str.indexOf("quick"); // 获取子字符串"quick"的起始索引 int endIndex = str.indexOf("fox"); // 获取子字符串"fox"的起始索引 String result = str.substring(startIndex, endIndex);
この例では、
startIndex
4 の値はendIndex
16 であるため、result
の値は です"quick brown"
。
文字列抽出およびインターセプト操作により、新しい文字列オブジェクトが生成されることに注意してください。
文字列の検索と置換
Java では、さまざまなメソッドを使用して文字列の検索および置換操作を実行できます。これらの操作により、文字列内の特定の文字または部分文字列を検索し、それを新しい文字または文字列に置き換えることができます。
-
IndexOf() メソッドを使用します。
indexOf()
このメソッドは、元の文字列内で指定された文字または部分文字列が最初に出現する位置インデックスを見つけるために使用されます。一致が見つかった場合は、最初に一致したインデックスが返され、一致が見つからなかった場合は、-1 が返されます。例えば:String str = "Hello World"; int index = str.indexOf("o"); // 查找字符"o"在字符串中的位置
上の例では、
index
最初の文字「o」がインデックス 4 にあるため、 の値は 4 になります。 -
lastIndexOf() メソッドを使用します。
lastIndexOf()
このメソッドは のメソッドに似ていますindexOf()
が、文字列の末尾から開始して、指定された文字または部分文字列が最後に出現する位置インデックスを見つけます。例えば:String str = "Hello World"; int lastIndex = str.lastIndexOf("o"); // 查找字符"o"在字符串中最后一次出现的位置
この例では、
lastIndex
最後の文字「o」がインデックス 7 にあるため、 の値は 7 になります。 -
contains() メソッドを使用します。
contains()
このメソッドは、指定された文字または部分文字列が文字列に含まれているかどうかを確認するために使用されます。戻り値はブール値です。例えば:String str = "Hello World"; boolean contains = str.contains("World"); // 检查字符串中是否包含子字符串"World"
上の例では、文字列に部分文字列「World」が含まれているため、
contains
値は です。true
-
replace() メソッドを使用する:
replace()
このメソッドは、指定された文字または部分文字列を新しい文字または文字列に置き換えるのに使用されます。例えば:String str = "Hello World"; String newStr = str.replace("World", "Universe"); // 将字符串中的"World"替换为"Universe"
この例では、
newStr
値は です"Hello Universe"
。 -
replaceAll() メソッドを使用します。
replaceAll()
メソッドはreplace()
メソッドと似ていますが、パターン マッチングと置換に正規表現を使用します。例えば:String str = "Hello123World456"; String newStr = str.replaceAll("\\d+", ""); // 用空字符串替换所有的数字
この例では、すべての数値が空の文字列に置き換えられるため、
newStr
値は です。"HelloWorld"
文字列の検索および置換操作では新しい文字列オブジェクトが生成され、元の文字列自体は変更されないことに注意してください。
3、文字列の一般的な方法
文字列の長さを取得する
Java では、length()
メソッドを使用して文字列の長さを取得できます。このメソッドは、文字列内の文字数 (スペースと特殊文字を含む) を返します。
簡単な例を次に示します。
String str = "Hello World!";
int length = str.length();
この例では、length()
メソッドが呼び出され、戻り値が整数変数に格納されますlength
。文字列「Hello World!」は 12 文字で構成されているため、最終的にlength
の値は 12 になります。
length()
このメソッドは文字列オブジェクトのメソッドであるため、メソッドを呼び出すには文字列変数の後にドット演算子を使用する必要があることに注意してください。length()
これは、メソッドを呼び出す前に文字列オブジェクトを作成する必要があることを意味します。
また、length()
このメソッドは空の文字列でも動作し、0 を返します。
String emptyStr = "";
int emptyLength = emptyStr.length(); // 结果为0
Unicode 文字を含む文字列の場合、length()
メソッドは Unicode 文字の数ではなく、コード単位の数を返します。Java では、UTF-16 エンコーディングを使用して文字列を表現します。一部の文字は複数のコード単位を使用して表現する必要があります。したがって、文字列にそのような文字が含まれている場合、返される長さは実際の Unicode 文字数よりも大きくなる可能性があります。
大文字と小文字を変換する
Java では、toUpperCase()
andtoLowerCase()
メソッドを使用して文字列を大文字または小文字に変換できます。
toUpperCase()
メソッド: このメソッドは、文字列内のすべての文字を大文字に変換し、新しい文字列を返します。例えば:
String str = "Hello World!";
String upperCaseStr = str.toUpperCase();
この例では、toUpperCase()
メソッドが呼び出され、返された大文字の文字列がupperCaseStr
変数に格納されます。最終的に、upperCaseStr
の値は「HELLO WORLD!」になります。
toLowerCase()
メソッド: このメソッドは、文字列内のすべての文字を小文字に変換し、新しい文字列を返します。例えば:
String str = "Hello World!";
String lowerCaseStr = str.toLowerCase();
この例では、toLowerCase()
メソッドが呼び出され、返された小文字の文字列がlowerCaseStr
変数に格納されます。最終的に、lowerCaseStr
の値は「hello world!」になります。
これら 2 つのメソッドは新しい文字列オブジェクトを生成し、元の文字列自体は変更されないことに注意してください。
また、これら 2 つのメソッドはアルファベット文字を大文字または小文字にのみ変換でき、アルファベット以外の文字 (数字、特殊文字など) については変更されません。
以下は、文字列内の文字の大文字と小文字のみを変換する方法の例です。
String str = "Hello 123 World!";
String convertedStr = "";
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (Character.isLetter(c)) {
if (Character.isUpperCase(c)) {
convertedStr += Character.toLowerCase(c);
} else {
convertedStr += Character.toUpperCase(c);
}
} else {
convertedStr += c;
}
}
この例では、文字列内の各文字を反復処理し、Character.isLetter()
メソッドを使用して文字が文字であるかどうかを確認します。文字の場合は、Character.isUpperCase()
メソッドを使用して文字の大文字と小文字を判別し、それに応じて変換します。アルファベット以外の文字の場合は、変更しないままにします。
上記のコードの出力は、文字の大文字と小文字が逆になった「hELLO 123 wORLD!」となります。
先頭と末尾の空白文字を削除する
Java では、trim()
メソッドを使用して、文字列から先頭と末尾の空白文字を削除できます。このメソッドは、元の文字列から先頭と末尾のスペースを削除した新しい文字列を返します。
簡単な例を次に示します。
String str = " Hello World! ";
String trimmedStr = str.trim();
この例では、trim()
メソッドが呼び出され、返された文字列がtrimmedStr
空白なしで変数に格納されます。最終的に、trimmedStr
の値は「Hello World!」になります。
trim()
このメソッドは文字列の先頭と末尾のスペースのみを削除でき、文字列の途中にあるスペースは削除できないことに注意してください。たとえば、文字列「Hello World!」の場合、trim()
メソッドは先頭と末尾のスペースのみを削除し、「Hello World!」を返します。
さらに、trim()
このメソッドでは、タブや改行などの他のタイプの空白文字も削除できます。
文字列からスペースを削除したい場合は、replaceAll()
メソッドを使用してすべてのスペース文字を置き換えることができます。
String str = " Hello World! ";
String noSpaceStr = str.replaceAll("\\s+", "");
この例では、replaceAll()
メソッドが呼び出され、正規表現「\s+」を使用して 1 つ以上の連続する空白文字と一致し、それらを空の文字列に置き換えます。最後に、noSpaceStr
「HelloWorld!」の値です。
replaceAll()
このメソッドは新しい文字列も返しますが、元の文字列自体は変更されないことに注意してください。
分割文字列
Java では、split()
メソッドを使用して文字列を部分文字列に分割できます。split()
このメソッドは、指定された区切り文字に基づいて文字列を文字列の配列に分割します。
簡単な例を次に示します。
String str = "Hello,World,Java";
String[] parts = str.split(",");
この例では、split()
メソッドが呼び出され、str
カンマを区切り文字として使用して文字列を複数の部分文字列に分割します。分割結果はparts
配列に格納されます。最終的に、parts
配列の値は になります["Hello", "World", "Java"]
。
ご覧のとおり、split()
このメソッドは文字列配列を返します。その各要素は、区切り文字に従って分割された元の文字列の部分文字列です。
区切り文字には文字列または正規表現を使用できることに注意してください。区切り文字が正規表現の場合は、二重バックスラッシュでエスケープする必要があります。
また、分割後の部分文字列の数を制限したい場合は、 2 番目のパラメータを指定してメソッドを使用できますsplit()
。たとえば、次の例では、str
文字列を最大 2 つの部分文字列に分割します。
String str = "Hello,World,Java";
String[] parts = str.split(",", 2);
この例では、split()
メソッドの 2 番目のパラメーターは 2 で、これは最大 2 つの部分文字列に分割することを意味します。分割結果はparts
配列に格納されます。最終的に、parts
配列の値は になります["Hello", "World,Java"]
。
文字列内に連続する区切り文字がある場合、split()
メソッドは隣接する区切り文字間の部分文字列として空の文字列を返します。split()
これらの空の文字列を削除したい場合は、と のメソッドを組み合わせますtrim()
。
String str = "Hello,,World,Java";
String[] parts = str.split(",", -1);
for (int i = 0; i < parts.length; i++) {
parts[i] = parts[i].trim();
}
この例では、split()
2 番目のパラメーターとして -1 を指定してメソッドが呼び出されます。これは、連続するすべての区切り文字を保持することを意味します。次に、ループとtrim()
メソッドを使用して、各部分文字列から先頭と末尾の空白を削除します。
文字列のフォーマット
Java では、文字列の書式設定を使用して、特定の形式の文字列を作成できます。文字列の書式設定は、書式設定パターンとパラメータ置換を使用して行われます。
Java での文字列のフォーマットは、主にString.format()
メソッドとSystem.out.printf()
メソッドに依存します。どちらの方法でも、文字列の書式設定のための特別なプレースホルダーと変換文字の使用がサポートされています。
簡単な例を次に示します。
String name = "Alice";
int age = 25;
double weight = 55.5;
String message = String.format("My name is %s, I'm %d years old, and my weight is %.2f kg.", name, age, weight);
System.out.println(message);
この例では、String.format()
メソッドを使用してフォーマットされた文字列を作成しますmessage
。このうち、%s
、 、%d
はそれぞれ%.2f
文字列、整数、小数点以下 2 桁の浮動小数点数を表すプレースホルダです。これらのプレースホルダーは次のパラメーターに置き換えられ、最終的な書式設定された文字列が形成されます。
上記のコードを実行すると、出力は「私の名前はアリス、25 歳、体重は 55.50 kg です。」となります。
メソッドに加えてString.format()
、メソッドを使用して、System.out.printf()
フォーマットされた文字列をコンソールに直接出力することもできます。
String name = "Alice";
int age = 25;
double weight = 55.5;
System.out.printf("My name is %s, I'm %d years old, and my weight is %.2f kg.", name, age, weight);
上記のコードを実行すると、「私の名前はアリス、25 歳、体重は 55.50 kg です。」という出力も得られます。
通常のプレースホルダーに加えて、変換文字を使用して日付や時刻などの特別な形式を指定することもできます。以下に例を示します。
import java.time.LocalDateTime;
LocalDateTime now = LocalDateTime.now();
System.out.printf("Current date and time: %tF %tT", now, now);
この例では、使用文字%tF
と%tT
変換文字はそれぞれ日付と時刻の形式を表します。now
変数は、LocalDateTime
現在の日付と時刻の情報を含むオブジェクトです。上記のコードを実行すると、現在の日時が出力されます (例: 「現在の日時: 2023-06-29 14:30:00」)。
フォーマット文字列では、幅、精度、配置など、他の修飾子を使用して出力のフォーマットを調整することもできることに注意してください。
4. 文字列の不変性とパフォーマンスの問題
文字列の不変性がプログラムに及ぼす影響
-
スレッド セーフ: 文字列は不変であるため、マルチスレッド環境でもスレッド セーフです。データ変更による同時実行性の問題を心配することなく、複数のスレッドが同時に同じ文字列オブジェクトにアクセスして共有できます。これにより、文字列の信頼性が高まり、同時プログラミングでの使用が容易になります。
-
ハッシュのキャッシュ: 文字列は不変であるため、そのハッシュをキャッシュできます。Java では、ハッシュ セットやハッシュ マップなどのデータ構造における文字列の検索効率を向上させるために、最初の計算後に文字列のハッシュ値がキャッシュされます。文字列が変更可能な場合、ハッシュ値のすべての計算で文字列の文字配列を走査する必要があり、これがハッシュ関連の操作のパフォーマンスに影響します。
-
メソッドの受け渡しの安全性: 文字列は不変であるため、メソッドのパラメータとして安全に渡すことができます。メソッド内で文字列が変更されると、元の文字列オブジェクトに影響を与えることなく、新しい文字列オブジェクトが実際に作成されます。これにより、メソッド間でデータを共有する際の誤った変更が回避され、プログラムの信頼性が向上します。
-
セキュリティと信頼性: 文字列の不変性により、プログラム内の文字列データが誤って変更されることがなくなります。これは、特に機密情報 (パスワードなど) を保護する必要がある場合やデータ操作を実行する必要がある場合、セキュリティと信頼性にとって非常に重要です。
-
パフォーマンスの最適化: 文字列の不変性は、パフォーマンス上の問題 (多数の文字列を連結する場合など) を引き起こす可能性がありますが、パフォーマンスを最適化する機会ももたらします。文字列は不変であるため、複数の文字列が同じメモリ空間を共有でき、メモリを節約できます。さらに、文字列の不変性により、文字列オブジェクトをキャッシュして再利用できるため、頻繁にオブジェクトを作成するオーバーヘッドが削減され、プログラムのパフォーマンスが向上します。
文字列は不変ですが、Java クラスでは、文字列の文字はString
実際には配列を使用して格納されることに注意してください。char[]
文字列に対して変更操作 (メソッドの呼び出しなど) が実行されると、同じ配列を参照するsubstring()
新しいオブジェクトが実際に作成されますが、インデックスの範囲が異なる場合があります。この設計により、元のオブジェクトを変更せずに文字列を操作できるようになり、プログラムの信頼性とセキュリティがさらに向上します。String
char[]
String
文字列の接続効率
Java では、文字列連結操作は、「+」演算子、concat()
メソッドStringBuilder
、StringBuffer
クラスなどの使用など、さまざまな方法で実装できます。
ただし、文字列は不変であるため、文字列の連結操作ごとに新しい文字列オブジェクトが作成されます。これにより、次のような効率の問題が発生する可能性があります。
-
メモリ オーバーヘッド: 各文字列連結操作には新しい文字列オブジェクトの作成が含まれます。つまり、新しい文字列を格納するために追加のメモリ領域を割り当てる必要があります。多数の文字列連結操作が実行されると、大量の一時オブジェクトが生成され、メモリのオーバーヘッドが増加します。
-
パフォーマンスの損失: 文字列の不変性により、各連結操作で前の文字列の内容がコピーされ、新しい文字列オブジェクトが作成されます。この操作は、多数の文字列を頻繁に結合する場合、特に結合に "+" 演算子を使用する場合にパフォーマンスの低下を引き起こします。これは、各 "+" 演算子が文字列オブジェクトのコピーと作成をトリガーするためです。
文字列連結の効率の問題を解決するには、StringBuilder
クラスをStringBuffer
使用できます。これらは、効率的な文字列連結操作を提供する可変文字列クラスです。その特徴は次のとおりです。
StringBuilder
: シングルスレッド環境で使用される、スレッドセーフではない可変文字列クラス。StringBuffer
: マルチスレッド環境で使用される、スレッドセーフな変数文字列クラス。
これらのクラスは、新しい文字列オブジェクトを作成せずに、元の文字列に基づいて操作を追加または挿入するための、 などのappend()
一連のメソッドを提供します。insert()
これにより、オブジェクトの頻繁な作成や文字列のコピーが回避され、スプライシング操作の効率が向上します。
以下は、StringBuilder
文字列連結の使用方法を示すサンプル コードです。
StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" ");
sb.append("World!");
String result = sb.toString();
上記の例では、StringBuilder
オブジェクトはsb
メソッドを複数回呼び出すことによってappend()
文字列コンテンツを追加します。最後に、メソッドを呼び出すことによって、オブジェクトは不変オブジェクトに変換されtoString()
ます。StringBuilder
String
StringBuilder と StringBuffer の使用
StringBuilder
および はStringBuffer
、可変文字列を効率的に処理するための Java のクラスです。これらは、新しい文字列オブジェクトを作成せずに、元の文字列に基づいて追加、挿入、削除、置換するための一連のメソッドを提供します。
-
オブジェクトを作成します:
- null パラメーター コンストラクターを使用します。
StringBuilder sb = new StringBuilder();
- 初期容量を指定するコンストラクターを使用します。
StringBuilder sb = new StringBuilder(int capacity);
StringBuffer
使用法はStringBuilder
と似ていますが、スレッドセーフであり、マルチスレッド環境に適している点が異なります。 - null パラメーター コンストラクターを使用します。
-
基本操作:
- Append string: は
append(String str)
、現在の文字列の後に指定された文字列を追加するために使用されます。 - 文字列を挿入:
insert(int offset, String str)
、指定した文字列を指定した位置に挿入します。 - 文字または文字列の削除:
delete(int start, int end)
、指定した範囲内の文字を削除するには、deleteCharAt(int index)
、指定したインデックス位置にある文字を削除します。 - 文字または文字列を置換:
replace(int start, int end, String str)
、指定された範囲内の文字を指定された文字列に置き換えます。
- Append string: は
-
連鎖呼び出し:
StringBuilder
との両方のメソッドがStringBuffer
独自のオブジェクトを返すため、連鎖呼び出しを通じて複数の操作を実行できます。例えば:StringBuilder sb = new StringBuilder(); sb.append("Hello").append(" ").append("World!");
-
文字列に変換:
toString()
このメソッドを使用して、StringBuilder
orStringBuffer
オブジェクトを不変String
オブジェクトに変換します。
-
スレッドの安全性:
StringBuilder
これは非スレッドセーフであり、シングルスレッド環境に適しています。StringBuffer
スレッドセーフであり、マルチスレッド環境に適しています。
StringBuilder
と はどちらも変更可能な文字列クラスであるためStringBuffer
、通常は「+」演算子を使用した文字列連結よりも効率的です。頻繁な文字列操作が必要な場合、またはマルチスレッド環境で使用される場合は、StringBuilder
またはを使用することをお勧めしますStringBuffer
。
StringBuilder
は効率的な文字列操作を提供しますがStringBuffer
、シングルスレッド環境では、よりもわずかに軽量でStringBuilder
あるため、を使用することをお勧めします。StringBuffer
マルチスレッド環境でのみ、StringBuffer
使用されるスレッド セーフを考慮する必要があります。
5. 文字列と正規表現
正規表現の概要
正規表現は、テキスト内の特定のパターンに一致する文字列を検索、照合、および置換するための強力なパターン マッチング ツールです。文字列を処理する柔軟かつ効率的な方法を提供し、テキスト処理、データ検証、データ抽出などを含む幅広いアプリケーション シナリオを備えています。
正規表現は文字と特殊文字で構成され、文字列のパターンを記述するために使用されます。
-
通常の文字: 特殊文字以外の文字はそれ自体を表します。たとえば、正規表現は
abc
文字列内の「abc」と一致します。 -
メタキャラクター: 特別な意味を持つ文字。より複雑なパターンを構築するために使用されます。
.
: 改行を除く任意の 1 文字と一致します。*
: 前の要素と 0 回以上一致します。+
: 前の要素と 1 回以上一致します。?
: 前の要素と 0 回または 1 回一致します。^
: 一致する文字列の開始位置。$
:文字列の終了位置と一致します。\
: エスケープ文字。次の特殊文字を通常の文字として扱うために使用されます。たとえば、\.
ピリオド文字「.」に一致します。[]
: 文字クラス。角括弧内の任意の文字と一致します。たとえば、[aeiou]
任意の単一の母音に一致します。[^]
: 文字クラスを否定し、角括弧内の文字を除く任意の文字と一致します。たとえば、[^0-9]
数値以外の文字と一致します。()
: グループ化して、その中のパターンを全体として扱います。|
: 論理和。2 つのパターンのいずれかに一致します。
-
数量子: 要素の出現数を指定するために使用されます。
{n}
: 前の要素の n 回の出現に完全に一致します。{n,}
: 先行する要素の少なくとも n 回の出現と一致します。{n,m}
: 前の要素と少なくとも n 回、最大で m 回一致します。?
、*
、+
、{n,}
、{n,m}
が の後に追加され?
、貪欲でない一致、可能な限り一致しないことを示します。
-
事前定義された文字クラス: 一般的に使用されるいくつかの文字クラスの事前定義された短縮形。
\d
: に相当する数字[0-9]
。\D
: 数字以外の文字。 と同等[^0-9]
。\w
: 単語文字。 と同等[a-zA-Z0-9_]
。\W
: 単語以外の文字。 と同等[^a-zA-Z0-9_]
。\s
: スペース、タブ、改行などの空白文字。\S
: 空白以外の文字。
-
貪欲なマッチングと非貪欲なマッチング: デフォルトでは、正規表現は可能な限り一致します。つまり、貪欲なマッチングです。貪欲でないマッチングは、量指定子の後に追加し
?
、マッチングを最小限に抑えることで実現できます。
正規表現を使用する一般的な手順は次のとおりです。
- 正規表現パターンを定義します。
- 対応する方法を使用して一致、検索、または置換します。一般的な方法は次のとおりです。
matches(String regex, CharSequence input)
: 文字列全体がパターンに一致するかどうかを判断します。find()
: 次に一致する部分文字列を検索して返します。replaceAll(String regex, String replacement)
: 一致したすべての部分文字列を指定された文字列に置き換えます。split(String regex)
: 正規表現に基づいて文字列を分割します。
java.util.regex
Java で正規表現を使用すると、パッケージ内の関連するクラスとメソッドを使用できます。主に 2 つPattern
のMatcher
クラスが含まれます。その中でも、照合操作のためのPattern
正規表現をコンパイルするために使用されますMatcher
。
以下は、正規表現を使用して文字列を照合および置換するプロセスを示す簡単な Java サンプル コードです。
import java.util.regex.*;
public class RegexExample {
public static void main(String[] args) {
String text = "The quick brown fox jumps over the lazy dog.";
// 匹配包含 "fox" 的单词
Pattern pattern = Pattern.compile("\\bfox\\b");
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
System.out.println("Found match at index " + matcher.start());
}
// 替换所有的元音字母为 "*"
String replacedText = text.replaceAll("[aeiou]", "*");
System.out.println(replacedText);
}
}
上記のコードは、「fox」を含む単語を正規表現で照合して出力し、テキスト内の母音を「*」に置き換えます。
文字列と正規表現の一致と置換
文字列を正規表現と照合して置換することは、一般的で非常に便利な操作です。正規表現を使用すると、特定のパターンに一致するテキスト内の文字列を検索、照合、および置換できます。
マッチング操作とは、指定された文字列内で特定のパターンを満たす部分文字列を見つけることを指します。Java は、およびクラスを照合操作に使用できるjava.util.regex
パッケージを提供します。Pattern
Matcher
-
Pattern
クラス: 正規表現をコンパイルし、Pattern
オブジェクトを作成するために使用されます。正規表現をコンパイルするための複数の静的メソッドが提供されており、マッチング動作を調整するためにいくつかのオプションを設定することもできます。たとえば、Pattern.compile(String regex)
このメソッドは正規表現をPattern
オブジェクトにコンパイルします。 -
Matcher
クラス: 指定された文字列で一致操作を実行するために使用されます。Pattern.matcher(CharSequence input)
メソッドを呼び出すことでMatcher
オブジェクトを取得できます。次に、Matcher
クラスのさまざまなメソッドを使用して、一致操作を実行できます。matches()
: 文字列全体が正規表現に一致するかどうかを判断します。find()
: 文字列内で次に一致する部分文字列の検索を試みます。start()
: 現在一致している部分文字列の開始インデックスを返します。end()
: 現在一致している部分文字列の終了インデックスを返します。group()
: 現在一致している部分文字列を返します。
以下は、照合操作に正規表現を使用する方法を示す簡単なサンプル コードです。
import java.util.regex.*;
public class RegexMatchingExample {
public static void main(String[] args) {
String text = "The quick brown fox jumps over the lazy dog.";
// 匹配包含 "fox" 的单词
Pattern pattern = Pattern.compile("\\bfox\\b");
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
System.out.println("Found match at index " + matcher.start());
}
}
}
上記のコードは、正規表現を使用して"\bfox\b"
、テキスト内に「fox」を含む単語を照合します。このメソッドを呼び出すことによりMatcher.find()
、各一致の位置が検索され、その開始インデックスが出力されます。
置換操作とは、一致した部分文字列を新しい文字列に置き換えることを指します。Java で正規表現を使用して置換操作を行う一般的な方法は 2 つあります。
-
String.replaceAll(String regex, String replacement)
: このメソッドは、正規表現を使用して、指定された文字列内の一致するすべての部分文字列を検索して置換します。このうちregex
パラメータは正規表現を指定し、replacement
パラメータは置換する文字列を指定します。 -
Matcher.replaceAll(String replacement)
: このメソッドは、Matcher
オブジェクトの現在の文字列内で一致するすべての部分文字列を検索して置換します。同様に、replacement
パラメータは置換する文字列を指定します。
以下は、置換操作に正規表現を使用する方法を示すサンプル コードです。
import java.util.regex.*;
public class RegexReplacementExample {
public static void main(String[] args) {
String text = "The quick brown fox jumps over the lazy dog.";
// 将文本中的元音字母替换为 "*"
String replacedText = text.replaceAll("[aeiou]", "*");
System.out.println(replacedText);
}
}
上記のコードは、正規表現を使用して"[aeiou]"
テキスト内の母音を照合し、それらを「*」に置き換えます。このメソッドを呼び出すとString.replaceAll()
、置換された文字列を取得して出力できます。
6. 文字列のエンコードとデコード
文字エンコーディングと文字セットの概念
テキストを扱うとき、文字エンコーディングと文字セットは 2 つの重要な概念です。これらは、文字やテキストを表現および操作するために使用されます。
文字セット (Character Set) は文字の集合であり、各文字には一意の番号が付いています。一般的な文字セットには、ASCII、Unicode などが含まれます。文字セットは、文字と数字の間のマッピングを定義します。
ASCII (American Standard Code for Information Interchange) は、最も古くから最も一般的に使用されている文字セットの 1 つです。7 ビットの 2 進数 (0 ~ 127) を使用して、英語の文字、数字、一部の句読点を含む 128 文字を表します。ASCII 文字セットは、英語およびその他の西側諸国で使用される文字セットです。
コンピュータ技術の発展に伴い、世界中でさまざまな言語の文字を表現するニーズが高まっています。ユニコードが誕生しました。Unicode は国際標準の文字セットであり、世界中のほぼすべての文字に一意の番号を提供します。Unicode は文字を表すためにさまざまなエンコード スキームを使用します。最も一般的に使用されるのは UTF-8 と UTF-16 です。
UTF-8 (Unicode Transformation Format-8) は、8 ビットの 2 進数 (0 ~ 255) を使用して Unicode 文字を表す可変長エンコーディング スキームです。UTF-8 は、ASCII 文字だけでなく他の Unicode 文字も表現できるため、ASCII との下位互換性があります。
UTF-16 (Unicode Transformation Format-16) は、16 ビット 2 進数 (0 ~ 65535) を使用して Unicode 文字を表す固定長エンコード スキームです。UTF-16 は、ほとんどの Unicode 文字を表すのに適していますが、UTF-8 よりも多くの記憶領域を必要とします。
文字エンコーディング (Character Encoding) は、文字セット内の文字をコンピュータが認識できるバイナリ形式に変換するルールです。エンコード テーブルを使用して、文字と数値の間のマッピングを表します。
Java では、文字列のデフォルトのエンコードは UTF-16 です。Java プログラムでテキストを扱うときは、通常、String
クラスを使用して文字列を表現します。このクラスは、UTF-16 エンコーディングを使用して文字列データを保存および処理します。
実際の開発では、文字コードの正しい使用と変換に注意する必要があります。別の環境でテキスト データを扱う場合は、文字列を指定したバイト配列に変換するメソッドを使用するか、バイト配列を指定したエンコーディングの文字列に変換するgetBytes()
メソッドを使用できます。new String(byte[], charset)
一般的な文字エンコード方式
一般的な文字エンコード方式には、ASCII、UTF-8、UTF-16、ISO-8859-1 などがあります。
-
ASCII(米国標準情報交換コード):
- エンコード範囲: 0 ~ 127 文字を含む 7 ビットの 2 進数で表されます。
- 特徴: ASCII は最も古く、最も一般的に使用されている文字エンコード方式であり、主に英語およびその他の西側諸国での文字表現に使用されています。基本的なラテン文字、数字、一部の句読点のみを表すことができ、非ラテン文字と特殊文字はサポートされていません。
- 使用する場合: 英語、数字、および基本的な句読点の表現に適しています。
-
UTF-8(Unicode変換形式-8):
- エンコード範囲: Unicode 文字を表すために 8 ビットの 2 進数を使用する可変長エンコード。
- 特徴: UTF-8 は Unicode 標準のエンコード方式であり、ほぼすべての Unicode 文字を表現できます。ASCII 文字の場合、UTF-8 は ASCII エンコードと互換性があります。UTF-16 は可変長エンコーディングを使用し、文字ごとに異なる長さのバイトを割り当てるため、非ラテン文字を表す場合に UTF-16 よりも多くの記憶域を節約できます。
- 使用シナリオ: ほとんどすべてのテキスト データに適した汎用の文字エンコード方式で、特にインターネットの送信と保存に適しています。
-
UTF-16(Unicode変換形式-16):
- エンコード範囲: 16 ビットの 2 進数を使用して Unicode 文字を表す固定長エンコード。
- 特徴: UTF-16 は Unicode 標準のエンコード方式でもあり、ほぼすべての Unicode 文字を表現できます。UTF-8 と比較すると、UTF-16 は固定長の 16 ビット エンコーディングを使用するため、非ラテン文字を表すときにより多くのストレージ スペースを消費します。
- 使用シナリオ: 一部のシステム内部文字列処理や特定のアプリケーションなど、固定長エンコードと文字位置へのランダム アクセスが必要なシナリオに適しています。
-
ISO-8859-1(ラテン語-1):
- エンコード範囲: 0 ~ 255 文字を含む 8 ビットの 2 進数で表されます。
- 特徴: ISO-8859-1 は、国際標準化機構によって定義された文字エンコード方式で、ASCII エンコードを拡張したもので、より多くの西欧文字を表現できます。ただし、ISO-8859-1 は一部のヨーロッパ言語の文字のみを表現でき、世界中の他のほとんどの言語の文字はサポートしません。
- 使用シナリオ: 主に西ヨーロッパ言語のテキストの表現に使用され、多言語環境やグローバリゼーション アプリケーションのシナリオには適していません。
上記の一般的な文字エンコード方式に加えて、GBK、GB2312、Big5 など、主に中国語および東アジア言語の文字表現に使用されるエンコード方式がいくつかあります。
実際の開発プロセスでは、特定のニーズや環境に応じて、テキスト データを処理および保存するための適切な文字エンコード方式を選択する必要があります。使用するエンコード方式が必要な文字範囲をカバーできることを確認し、文字化けや文字欠落の問題を避けるために、文字コードの正しい変換および処理に注意してください。
文字列のエンコードおよびデコード方法の概要
-
文字列はバイトのシーケンスとしてエンコードされます。
- getBytes() メソッドを使用します。このメソッドは、指定された文字セットに従って文字列をバイト配列にエンコードできます。たとえば、UTF-8 エンコードを使用して文字列をバイト配列としてエンコードするには、次のようにします。
byte[] bytes = str.getBytes("UTF-8");
- 文字列エンコード変換クラスを使用する: Java は、文字列エンコード変換用の Charset クラスと CharsetEncoder クラスを提供します。サンプルコードは次のとおりです。
Charset charset = Charset.forName("UTF-8"); CharsetEncoder encoder = charset.newEncoder(); ByteBuffer buffer = encoder.encode(CharBuffer.wrap(str)); byte[] bytes = buffer.array();
- getBytes() メソッドを使用します。このメソッドは、指定された文字セットに従って文字列をバイト配列にエンコードできます。たとえば、UTF-8 エンコードを使用して文字列をバイト配列としてエンコードするには、次のようにします。
-
文字列にデコードされたバイト シーケンス:
- コンストラクターの使用: 指定された文字セットを使用して文字列オブジェクトを作成し、デコードできます。たとえば、UTF-8 文字セットを使用してバイト配列を文字列にデコードするには、次のようにします。
String str = new String(bytes, "UTF-8");
- 文字列エンコード変換クラスを使用する: Java は、文字列デコード変換用の Charset クラスと CharsetDecoder クラスを提供します。サンプルコードは次のとおりです。
Charset charset = Charset.forName("UTF-8"); CharsetDecoder decoder = charset.newDecoder(); CharBuffer buffer = decoder.decode(ByteBuffer.wrap(bytes)); String str = buffer.toString();
- コンストラクターの使用: 指定された文字セットを使用して文字列オブジェクトを作成し、デコードできます。たとえば、UTF-8 文字セットを使用してバイト配列を文字列にデコードするには、次のようにします。
-
URL エンコードとデコード:
- URLEncoder クラスを使用した URL エンコード: URLEncoder クラスを使用して文字列を URL エンコードし、特殊文字を URL セーフな形式に変換できます。サンプルコードは次のとおりです。
String encodedStr = URLEncoder.encode(str, "UTF-8");
- URL デコードに URLDecoder クラスを使用する: URLDecoder クラスを使用して、URL エンコードされた文字列をデコードし、元の文字列に復元できます。サンプルコードは次のとおりです。
String decodedStr = URLDecoder.decode(encodedStr, "UTF-8");
- URLEncoder クラスを使用した URL エンコード: URLEncoder クラスを使用して文字列を URL エンコードし、特殊文字を URL セーフな形式に変換できます。サンプルコードは次のとおりです。
-
Base64 エンコードとデコード:
- Base64 クラスを使用した Base64 エンコード: Java は、バイト配列に対して Base64 エンコードを実行して Base64 文字列表現を取得できる Base64 クラスを提供します。サンプルコードは次のとおりです。
byte[] encodedBytes = Base64.getEncoder().encode(bytes); String base64Str = new String(encodedBytes, StandardCharsets.UTF_8);
- Base64 クラスを使用した Base64 デコード: Base64 クラスを使用して、Base64 でエンコードされた文字列をデコードし、元のバイト配列に復元できます。サンプルコードは次のとおりです。
byte[] decodedBytes = Base64.getDecoder().decode(base64Str);
- Base64 クラスを使用した Base64 エンコード: Java は、バイト配列に対して Base64 エンコードを実行して Base64 文字列表現を取得できる Base64 クラスを提供します。サンプルコードは次のとおりです。
7. 文字列およびその他のデータ型の変換
文字列の基本データ型への変換
-
文字列から基本データ型へ:
- ラッパー クラスの静的メソッドを使用します。各基本データ型には、
Integer
、Double
などの対応するラッパー クラスがあります。これらのラッパー クラスは、文字列を対応する型( など)に変換するための静的メソッドを提供しますInteger.parseInt()
。Double.parseDouble()
例えば:String str = "123"; int num = Integer.parseInt(str); double decimal = Double.parseDouble(str);
- valueOf メソッドを使用する: すべてのラッパー クラスは、
valueOf
対応する文字列を対応する型のラッパー クラス オブジェクトに変換するメソッドを提供します。ラッパー クラス オブジェクトは、自動アンボックス化によってプリミティブ データ型に変換できます。例えば:String str = "123"; Integer integer = Integer.valueOf(str); int num = integer.intValue();
- ラッパー クラスの静的メソッドを使用します。各基本データ型には、
-
基本的なデータ型を文字列に変換します。
- 文字列連結の使用: 文字列連結 (+) を使用して、プリミティブ データ型を文字列に変換できます。例えば:
int num = 123; String str = "" + num;
- String クラスの valueOf メソッドを使用する: すべてのラッパー クラスと基本データ型は
toString()
このメソッドを実装しているため、String.valueOf()
オブジェクトのメソッドを使用するか直接呼び出して、toString()
基本データ型を文字列に変換できます。例えば:int num = 123; String str = String.valueOf(num);
- 文字列連結の使用: 文字列連結 (+) を使用して、プリミティブ データ型を文字列に変換できます。例えば:
NumberFormatException
文字列を対応する型に正しく変換できない場合は、例外がスローされることに注意してください。したがって、文字列をプリミティブ データ型に変換する場合は、文字列が正しい形式であることを確認する必要があります。
さらに、Java 8 以降では新しいストリームベースのメソッドが導入されており、文字列とプリミティブ データ型の間の変換をより便利に処理できます。たとえば、Integer
このクラスは、変換時にベース (base) を指定できるようにするparseInt()
およびvalueOf()
メソッドのオーバーロードされたバージョンを提供します。これらの新しいメソッドは、より柔軟な変換方法を提供します。
文字列から日時型への変換
-
文字列を日時型に変換します:
- クラスの操作
SimpleDateFormat
:SimpleDateFormat
クラスは、日付と時刻の書式設定と解析を行うためのクラスです。そのparse()
メソッドを使用して、文字列を日付型に解析できます。例えば:String str = "2023-06-29 12:34:56"; SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = format.parse(str);
- クラスの使用
DateTimeFormatter
(Java 8 以降):DateTimeFormatter
クラスは、Java 8 で導入された日時処理クラスです。そのparse()
メソッドを使用して、文字列を日時型に解析できます。例えば:String str = "2023-06-29 12:34:56"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime dateTime = LocalDateTime.parse(str, formatter);
- クラスの操作
-
日時型を文字列に変換します。
- クラスの使用
SimpleDateFormat
:SimpleDateFormat
クラスのメソッドを使用してformat()
、日付型を文字列としてフォーマットできます。例えば:Date date = new Date(); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String str = format.format(date);
- クラスの使用
DateTimeFormatter
(Java 8 以降):DateTimeFormatter
クラスのメソッドを使用してformat()
、日時型を文字列としてフォーマットできます。例えば:LocalDateTime dateTime = LocalDateTime.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String str = dateTime.format(formatter);
- クラスの使用
SimpleDateFormat
またはDateTimeFormatter
クラスを使用する場合は、正しい日付と時刻の形式パターン (パターン) を使用して文字列の形式を指定する必要があることに注意してください。たとえば、yyyy
年を表す、MM
月を表す、dd
日付を表す、HH
時(24 時間制)を表す、mm
分を表す、秒ss
を表すなどです。
さらに、Java 8 では、java.time
より強力で柔軟な日付と時刻の処理クラスを提供するパッケージが導入されました。さらに、さまざまな粒度で日付と時刻を処理するために使用できる、、 、およびその他のクラスLocalDateTime
があります。これらの新しい日時クラスは、上記の例と同様の方法で使用される文字列との間の変換メソッドも提供します。LocalDate
LocalTime
ZonedDateTime
8. 文字列の国際化とローカライゼーション
Java プラットフォームの国際化サポート
ava プラットフォームは強力な国際化 (国際化、i18n と呼ばれる) サポートを提供し、開発者が複数の言語と地域の特性を備えたアプリケーションを簡単に作成できるようにします。
-
ローカリゼーション:
Locale
クラス:Locale
クラスは特定の言語とロケールを表します。さまざまな言語、国、文化を識別するために使用できます。クラスをLocale
使用すると、使用する言語または地域を指定できるため、アプリケーションがさまざまな環境で適切なローカライズされたコンテンツを表示できるようになります。- リソース バンドル: リソース バンドルは、ローカリゼーション情報を含むコレクションです。各言語または地域には、言語または地域に関連するテキスト、画像、形式などの情報を含む、対応するリソース パッケージを持つことができます。Java のリソース バンドルは通常、.properties ファイルに保存され、各ファイルは言語または地域のリソース コンテンツに対応します。
-
文字エンコーディングとテキスト処理:
Charset
クラス:Charset
クラスは文字エンコーディング セットを表します。Java は内部エンコードとして Unicode 文字セットを使用しますが、外部データおよびファイルは別の文字エンコードを使用する場合があります。このクラスを通じてCharset
、文字セットの変換と処理を実行して、異なる文字エンコーディング間でテキスト コンテンツを正しく変換および処理することができます。String
クラスとMessageFormat
クラス: Java のString
クラスは、文字列の連結や書式設定など、ローカライズされたテキスト処理のための多くのメソッドを提供します。MessageFormat
このクラスは、より高度な文字列書式設定機能を提供し、指定された言語と地域に従って複雑なメッセージの書式設定と置換操作を実行できます。
-
日付と時刻の処理:
java.time
パッケージ: Java 8 では、java.time
パッケージ内に新しい日付と時刻の API が導入されています。これは、さまざまな粒度で日付と時刻を操作したり、タイムゾーン関連の操作を行うための強力なクラスとメソッドのセットを提供します。これらのクラスは、指定された言語とロケールに従って日付と時刻の情報をフォーマットできます。DateFormat
class:クラスは、パッケージ内にDateFormat
ある従来の日付書式設定クラスです。java.text
基本的な日付と時刻の書式設定関数を提供し、指定された言語と地域に従ってローカライズされた書式設定を実行できます。
-
数値と通貨の書式:
NumberFormat
クラス:クラスは数値をフォーマットするためのクラスであり、パッケージ内にNumberFormat
あります。java.text
指定された言語やロケールに従って、数値、パーセンテージ、通貨などをフォーマットできます。Currency
クラス:Currency
クラスは通貨を表すクラスであり、通貨コード、記号、小数点以下の桁数などの通貨に関する情報を提供します。Currency
通貨値を指定した言語とロケールに合わせて正しくフォーマットできるようにするクラス。
-
時間と通貨の書式設定規則:
Locale
クラスとjava.util.spi.LocaleServiceProvider
インターフェイス:Locale
クラスを使用すると、時間と通貨の書式設定規則を指定できます。Locale
言語や地域が異なると、時刻、日付、通貨の形式についての規則が異なる場合があります。Java プラットフォームは、これらの違いを処理するためのクラスベースのローカリゼーション規則インターフェイスのセットを提供します。
文字列がローカライズされる方法
-
リソース バンドルを使用する:
リソース バンドルは Java の一般的なローカリゼーション処理方法であり、これを使用してローカリゼーション関連の文字列をさまざまなプロパティ ファイルに保存でき、各プロパティ ファイルは言語または地域に対応します。リソース バンドルは通常 .properties ファイルを使用し、コンテンツはキーと値のペアの形式で表現されます。messages.properties
リソース バンドルを作成する:デフォルトの言語文字列を保存する.properties ファイル (例: ) を作成します。次に、簡体字中国語など、さまざまな言語や地域に対応する属性ファイルを作成しますmessages_zh_CN.properties
。- リソース バンドルのロード: Java コードで、
ResourceBundle
クラスを使用して、対応するリソース バンドル ファイルをロードします。言語と地域は必要に応じて指定できます。指定しない場合は、システムのデフォルトの言語と地域が使用されます。 - ローカライズされた文字列の取得:
ResourceBundle
クラスを使用して、指定されたキーに従って対応するローカライズされた文字列を取得します。
サンプルコードは次のとおりです。
// 加载资源包 ResourceBundle bundle = ResourceBundle.getBundle("messages", new Locale("zh", "CN")); // 获取本地化字符串 String localizedString = bundle.getString("hello.world");
-
MessageFormat クラスを使用する:
MessageFormat
このクラスは、文字列をフォーマットするために Java によって提供されるツール クラスであり、指定された言語および地域に従って複雑なメッセージのフォーマットおよび置換操作を実行できます。動的な置換は、文字列内のプレースホルダーとパラメーターを使用することで実現できます。サンプルコードは次のとおりです。
String pattern = "Hello, {0}! Today is {1}."; String name = "John"; String date = DateFormat.getDateInstance(DateFormat.FULL).format(new Date()); String formattedString = MessageFormat.format(pattern, name, date);
上記の例では、
pattern
これはプレースホルダーを含む文字列であり、MessageFormat.format()
メソッドは、指定された言語と地域に従って、受信パラメーターを対応するプレースホルダーに置き換えます。 -
StringFormat クラスを使用する:
String.format()
このメソッドは Java で一般的に使用される文字列書式設定メソッドであり、ローカリゼーションもサポートしています。このメソッドは、書式文字列とパラメータを使用して、文字列の書式付き出力を実現できます。サンプルコードは次のとおりです。
String name = "Alice"; int age = 30; String localizedString = String.format("My name is %s and I'm %d years old.", name, age);
上記の例では、
%s
は%d
文字列フォーマット用のプレースホルダーであり、String.format()
メソッドは、指定された言語と地域に従って、受信パラメーターを対応するプレースホルダーに置き換えます。