Javaのデータ型は基本型と参照型に分類されます。
基本データ型
- byte: 1バイト、範囲 -128~127
- short: 2バイト、範囲 -32768~32767
- int: 4バイト、範囲 -2147483648~2147483647
- long: 8バイト、範囲 -9223372036854775808~9223372036854775807
- float/double: 浮動小数点数
- char: 文字型
- boolean: 真偽値
参照型(オブジェクト型)
インスタンス化が必要で、メモリ上の参照(ポインタ)を保持します。
文字列処理
文字列は不変(イミュータブル)です。
String sample = "Hello";
String textA = new String("World");
char[] charArr = {'J','a','v','a'};
String textB = new String(charArr);
リテラルで定義した文字列は文字列プールで再利用され、メモリ効率が向上します。
文字列ビルダー
連結処理の効率を向上させるためのクラスです。
StringBuilder builder = new StringBuilder();
builder.append("Java").append(" ").append("World");
String result = builder.toString();
内部実装では初期容量16バイトで管理され、超過時に自動拡張(元の容量×2+2)が行われます。
オブジェクト指向の基本
オブジェクトのメモリ構造
オブジェクト生成時、スタック領域にメソッド呼び出しが、ヒープ領域にオブジェクトが作成されます。
- クラス定義がメソッド領域にロードされる
- ヒープ領域にオブジェクト用のメモリが確保される
- コンストラクタで初期化が行われる
静的メソッドと変数
静的メンバーはインスタンスではなくクラスに属します。
public class Calculator {
public static final double PI = 3.14159;
public static int add(int a, int b) {
return a + b;
}
}
静的メソッドは静的メンバーのみアクセス可能です。インスタンス化せずにクラス名で呼び出せます。
抽象クラスとインターフェース
抽象クラスは実装を部分的に定義し、継承クラスに実装を強制します。
abstract class Shape {
abstract double calculateArea();
}
interface Drawable {
void draw();
}
インターフェースはデフォルトメソッドや静的メソッドを定義でき、JDK8以降の機能です。
コレクションフレームワーク
リストとセット
List<Integer> intList = new ArrayList<>();
intList.add(10);
intList.add(20);
Set<String> uniqueSet = new HashSet<>();
uniqueSet.add("Apple");
uniqueSet.add("Banana");
ArrayListは順序保持、HashSetは重複排除を特徴とします。
マップの実装
キーと値のペアを格納します。
Map<String, Integer> scoreMap = new HashMap<>();
scoreMap.put("Math", 95);
scoreMap.put("English", 88);
// マップの反復処理
scoreMap.forEach((subject, score) ->
System.out.println(subject + ": " + score));
TreeMapはキーの順序を維持するため、比較ロジックを指定できます。
ラムダ式の活用
関数型インターフェースの簡略化に使用されます。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(name -> System.out.println("Name: " + name));
ラムダ式は1つの抽象メソッドを持つインターフェースにのみ適用可能です。
メモリ管理のポイント
オブジェクトのライフサイクルは以下のように制御されます:
- new演算子でヒープメモリにオブジェクトが作成される
- 参照が無くなるとガベージコレクションで解放される
- 文字列リテラルは文字列プールで再利用される