langパッケージ共通クラス

公開日: 2026-07-29 08:43 更新日: 2026-07-29 08:43 1893文字 10 min read ... ページビュー

この記事では、Java.langパッケージで一般的に使用されるコア·クラスについて説明し、ObjectクラスのtoString、equals、hashCode、cloneメソッドに焦点を当て、equalsをhashCodeと一緒にオーバーライドする必要があることを強調し、finalizeをリソース管理に使用しないことを示します。また、Integerのような8つの基本型のラッパークラスの使用方法、自動ボックス化メカニズム、文字列定数プールと不変性についても詳しく説明します。最後に、StringBufferとStringBuilderの違いを比較し、シングルスレッドシナリオでの文字列結合にStringBuilderの使用を推奨します。

java.langパッケージ共通クラス

java.langパッケージ内のクラスは自動的にインポートされ、通常はimportステートメントを記述する必要はありません。

Objectクラス

ObjectはJavaクラス階層のルートクラスであり、すべてのクラスが直接または間接的に継承します。

toStringメソッド#toStringメソッド#

toString()オブジェクトの文字列表現を返します。デフォルトの形式は通常、クラス名、@、ハッシュコードの16 進数形式で構成されますが、信頼できるメモリアドレスではありません。

@Override
public String toString() {
    return "Person{name='" + name + "', age=" + age + "}";
}

equalsメソッド[equalsめそっど]

Object.equals()は、2つの参照が同じオブジェクトを指しているかどうかを比較するため、==と同じ効果を示します。サブクラスはオブジェクトの内容を比較するために上書きできます。

equals()を書き換えるとき、通常はhashCode()も書き換え、等しいオブジェクトが同じハッシュコードを持つようにする。

hashCodeメソッド[hashCodeめそっど]

hashCode()は整数ハッシュ値を返し、HashMapHashSetなどのハッシュ構造でよく使用されます。ハッシュコードが等しいとは限らないが、equals()が等しいオブジェクトは同じハッシュコードを持たなければならない。

cloneメソッド[cloneめそっど

clone()は、オブジェクトの複製に使用されます。Object.clone()を直接呼び出すクラスは、通常、Cloneableインタフェースを実装する必要があります。実装しないと、CloneNotSupportedExceptionがスローされます。デフォルトのクローンは浅いコピーであり、参照フィールドは同じオブジェクトを指す可能性があります。

finalizeメソッド[finalizeめそっど]

finalize()は、いつ実行されるかを保証しておらず、ファイル、ネットワーク接続などのリソースを解放するのにも適していない。リソースの管理には、try-with-resourcesまたは明示的シャットダウン方式を使用してください。finalize()に依存しないでください。

包装の種類

8つの基本タイプには対応するパッケージがあります。

基本タイプ包装クラス
byteByte
shortShort
intInteger
longLong
charCharacter
floatFloat
doubleDouble
booleanBoolean

ラッパークラスはプリミティブ型の値をオブジェクトとしてカプセル化し、ジェネリックコレクションのような参照型のみを受け入れるシナリオで便利です。

Integer 一般的な方法

Integerオブジェクトの作成または取得にはInteger.valueOf()を使用し、文字列をintに変換するにはInteger.parseInt()を使用することを推奨します。

Integer value1 = Integer.valueOf(3);
Integer value2 = Integer.valueOf("3");
int number1 = value1.intValue();
int number2 = Integer.parseInt("100");

Integer.valueOf()は、共通値のキャッシュオブジェクトの一部を再利用します。Java 仕様では、少なくとも-128から127のキャッシュが必要であり、JVM 構成によってより広いキャッシュ範囲が決定される場合があります。

Integer value1 = Integer.valueOf(3);
Integer value2 = Integer.valueOf(3);
System.out.println(value1 == value2); // 通常为 true

Integer value3 = Integer.valueOf(300);
Integer value4 = Integer.valueOf(300);
System.out.println(value3 == value4); // 不应依赖该结果

パッケージ類数値内容の比較にはequals()を使用し、==を使用して対象内容を判断しないでください。

自動梱包と自動開封

JDK 5は自動ボックス化と自動アンボックス化をサポートする。

Integer value = 3; // 自动装箱,相当于 Integer.valueOf(3)
int number = value; // 自动拆箱,相当于 value.intValue()

包装クラス参照がnullの場合、自動アンボックス時にNullPointerExceptionがスローされます。

Integer value = null;
// int number = value; // 运行时抛出 NullPointerException

Stringクラス

Stringは不変文字シーケンスを表します。文字列オブジェクトが作成されると、その文字内容は変更できません。文字列を変更したように見える操作は、実際には新しい文字列を返します。

String text = "abcdefg";
String result = text.replace("bcd", "BCD");

System.out.println(text);   // abcdefg
System.out.println(result); // aBCDefg

StringCharSequenceインタフェースを実装しているので、CharSequenceパラメータが必要な場所に文字列を渡すことができます。

Stringの内部ストレージ

JDKのバージョンによって実装が異なります。Java 8のStringは主にchar[]を使用してコンテンツを保持し、新しいJDKはbyte[]を使用して符号化マークアップとともにコンパクト文字列を実装している。String APIの学習と使用は、具体的な内部配列型に依存しないでください。

ストリング定数プール

文字列リテラルは文字列定数プールに配置され、同じリテラルは通常同じオブジェクトを再利用します。new String()を使用すると、新規オブジェクトが明示的に作成されます。

String s1 = "ab";
String s2 = "ab";
System.out.println(s1 == s2); // true

String s3 = new String("ab");
String s4 = new String("ab");
System.out.println(s3 == s4); // false
System.out.println(s3.equals(s4)); // true

コンパイル時に決定できる文字列定数式は折りたたまれます。

String s1 = "ab";
String s2 = "a" + "b";
System.out.println(s1 == s2); // true

変数を含むスプライスは通常実行時に結果オブジェクトを生成し、==を使用して文字列の内容を比較しないでください。

String 共通メソッド

長さと文字の取得

String text = "abcdefg";
System.out.println(text.length());
System.out.println(text.charAt(2));

文字列の比較

equals()は内容が等しいかどうかを比較し,compareTo()は辞書順で比較する. compareTo()は負、ゼロ、または正を返します。-101のみが返される保証はありません。

System.out.println("abc".equals("abc"));
System.out.println("abc".compareTo("abd"));

検索と判断

String text = "abcdefgabc";

System.out.println(text.contains("cde"));
System.out.println(text.startsWith("abc"));
System.out.println(text.endsWith("abc"));
System.out.println(text.indexOf("abc"));
System.out.println(text.lastIndexOf("abc"));

指定したコンテンツが見つからない場合、indexOf()およびlastIndexOf()-1を返します。

文字列のインターセプト

substring()の終了インデックスは結果に含まれない.

String text = "abcdefg";
System.out.println(text.substring(2));
System.out.println(text.substring(2, 5)); // cde

置換、分割、大文字小文字変換

String text = "abcbc";

System.out.println(text.replace("bc", "BC"));
System.out.println(Arrays.toString(text.split("b")));
System.out.println(text.toUpperCase());
System.out.println(text.toLowerCase());
System.out.println("  Java  ".trim());

split()の引数は正規表現です。ドット記号や縦棒などの特殊文字を分割する場合は、正規表現規則に従ってエスケープする必要があります。

文字列とバイトの配列

エンコードとデコードの際には、文字セットを明示的に指定してください。

String text = "你好";
byte[] bytes = text.getBytes(StandardCharsets.UTF_8);
String result = new String(bytes, StandardCharsets.UTF_8);
System.out.println(text.equals(result));

StringBuクラス

StringBufferは、内容可変文字列です。内部でスケーラブルなバッファを維持しており、コンテンツの追加、挿入、削除にはStringスプライシングのように多数の中間オブジェクトを繰り返し作成する必要がない。

StringBuffer buffer = new StringBuffer("a");
for (int i = 0; i < 10_000; i++) {
    buffer.append('a');
}
String result = buffer.toString();

コンストラクタは通常、初期文字列長に基づいて余分な容量を予約します。バッファスペースが不足すると自動的にスケーリングされ、具体的なスケーリング戦略は実装の詳細です。

StringBuffer 一般的なメソッド

StringBuffer buffer = new StringBuffer("Java");

buffer.append(" SE");
buffer.insert(4, " 8");
buffer.delete(4, 6);
buffer.reverse();

System.out.println(buffer);

一般的な方法には、append()insert()delete()replace()、およびreverse()があります。

StringBuilderクラス

StringBuilderStringBufferと同様のAPIを提供し、可変文字シーケンスである。

  • StringBufferの主なアプローチは同期制御を備えており、複数のスレッドが同じインスタンスを共有し、同時に変更するシナリオに適しています。
  • StringBuilderはこのような同期保証を提供せず、シングルスレッドシナリオでは一般的なオーバーヘッドが少ない。

ほとんどのローカル文字列スプライシングシーンではStringBuilderが優先されます。スレッドセーフはクラス名だけでは判断できず、オブジェクトが複数のスレッドで共有されているかどうか、操作全体がアトミックであるかどうかにも関連します。

気に入ったならばコメントを残してくださいね~

... ページビュー
© 2026 跨越星轨的客 @Hoshiumi
Powered by theme astro-koharu · Inspired by Shoka