Java : Objects (オブジェクト操作) - API使用例

Objects (Java SE 18 & JDK 18) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様のおともにどうぞ。


概要

このクラスは、オブジェクトを操作するためのstaticユーティリティ・メソッド、または操作の前に特定の条件をチェックすることで構成されます。

クラス構成

final String str1 = null;
final String str2 = "abcd";

System.out.println(Objects.equals(str1, str2)); // false
System.out.println(Objects.equals(str1, null)); // true
System.out.println(Objects.equals(str2, "abcd")); // true

System.out.println(Objects.hash(123, 789, "abc")); // 268807
final var list = new ArrayList<String>();
list.add("a");
list.add(null);
list.add("b");
list.add(null);
list.add("c");

System.out.println(list); // [a, null, b, null, c]

final var result = list.stream().filter(Objects::nonNull).toList();
System.out.println(result); // [a, b, c]

メソッド

static int checkFromIndexSize (int fromIndex, int size, int length)

fromIndex (inclusive)からfromIndex + size (exclusive)までのサブ・レンジが0 (inclusive)からlength (exclusive)までの範囲の範囲内にあるかどうかをチェックします。

基準となるのは 0~(length-1) の範囲。
その範囲に、fromIndex + (size-1) の範囲がすべて入っているかどうかをチェックします。
範囲内に入っていれば fromIndex の値が返ります。
それ以外は IndexOutOfBoundsException が発生します。

System.out.println(Objects.checkFromIndexSize(0, 0, 5)); // 0
System.out.println(Objects.checkFromIndexSize(0, 1, 5)); // 0
System.out.println(Objects.checkFromIndexSize(0, 2, 5)); // 0
System.out.println(Objects.checkFromIndexSize(0, 3, 5)); // 0
System.out.println(Objects.checkFromIndexSize(0, 4, 5)); // 0
System.out.println(Objects.checkFromIndexSize(0, 5, 5)); // 0
//Objects.checkFromIndexSize(0, 6, 5); // IndexOutOfBoundsException

System.out.println(Objects.checkFromIndexSize(3, 0, 5)); // 3
System.out.println(Objects.checkFromIndexSize(3, 1, 5)); // 3
System.out.println(Objects.checkFromIndexSize(3, 2, 5)); // 3
//Objects.checkFromIndexSize(3, 3, 5); // IndexOutOfBoundsException

System.out.println(Objects.checkFromIndexSize(0, 1, 5)); // 0
System.out.println(Objects.checkFromIndexSize(1, 1, 5)); // 1
System.out.println(Objects.checkFromIndexSize(2, 1, 5)); // 2
System.out.println(Objects.checkFromIndexSize(3, 1, 5)); // 3
System.out.println(Objects.checkFromIndexSize(4, 1, 5)); // 4
//Objects.checkFromIndexSize(5, 1, 5); // IndexOutOfBoundsException

//Objects.checkFromIndexSize(-1, 0, 5); // IndexOutOfBoundsException
//Objects.checkFromIndexSize(0, -1, 5); // IndexOutOfBoundsException
//Objects.checkFromIndexSize(0, 0, -1); // IndexOutOfBoundsException

static long checkFromIndexSize (long fromIndex, long size, long length)

fromIndex (inclusive)からfromIndex + size (exclusive)までのサブ・レンジが0 (inclusive)からlength (exclusive)までの範囲の範囲内にあるかどうかをチェックします。

型が long であること以外は checkFromIndexSize(int fromIndex, int size, int length) と同じです。
そちらのAPI使用例をご参照ください。

static int checkFromToIndex (int fromIndex, int toIndex, int length)

fromIndex (inclusive)からtoIndex (exclusive)までのサブ・レンジが0 (inclusive)からlength (exclusive)までの範囲の範囲内にあるかどうかをチェックします。

基準となるのは 0~(length-1) の範囲。
その範囲に、fromIndex~(toIndex-1) の範囲がすべて入っているかどうかをチェックします。
範囲内に入っていれば fromIndex の値が返ります。
それ以外は IndexOutOfBoundsException が発生します。

System.out.println(Objects.checkFromToIndex(0, 0, 5)); // 0
System.out.println(Objects.checkFromToIndex(0, 1, 5)); // 0
System.out.println(Objects.checkFromToIndex(0, 2, 5)); // 0
System.out.println(Objects.checkFromToIndex(0, 3, 5)); // 0
System.out.println(Objects.checkFromToIndex(0, 4, 5)); // 0
System.out.println(Objects.checkFromToIndex(0, 5, 5)); // 0
//Objects.checkFromToIndex(0, 6, 5); // IndexOutOfBoundsException

//Objects.checkFromToIndex(3, 2, 5); // IndexOutOfBoundsException
System.out.println(Objects.checkFromToIndex(3, 3, 5)); // 3
System.out.println(Objects.checkFromToIndex(3, 4, 5)); // 3
System.out.println(Objects.checkFromToIndex(3, 5, 5)); // 3
//Objects.checkFromToIndex(3, 6, 5); // IndexOutOfBoundsException

System.out.println(Objects.checkFromToIndex(0, 5, 5)); // 0
System.out.println(Objects.checkFromToIndex(1, 5, 5)); // 1
System.out.println(Objects.checkFromToIndex(2, 5, 5)); // 2
System.out.println(Objects.checkFromToIndex(3, 5, 5)); // 3
System.out.println(Objects.checkFromToIndex(4, 5, 5)); // 4
System.out.println(Objects.checkFromToIndex(5, 5, 5)); // 5
//Objects.checkFromToIndex(6, 5, 5); // IndexOutOfBoundsException

//Objects.checkFromToIndex(-1, 0, 5); // IndexOutOfBoundsException
//Objects.checkFromToIndex(0, -1, 5); // IndexOutOfBoundsException
//Objects.checkFromToIndex(0, 0, -1); // IndexOutOfBoundsException

static long checkFromToIndex (long fromIndex, long toIndex, long length)

fromIndex (inclusive)からtoIndex (exclusive)までのサブ・レンジが0 (inclusive)からlength (exclusive)までの範囲の範囲内にあるかどうかをチェックします。

型が long であること以外は checkFromToIndex(int fromIndex, int toIndex, int length) と同じです。
そちらのAPI使用例をご参照ください。

static int checkIndex (int index, int length)

indexが0 (inclusive)からlength (exclusive)までの範囲の境界内にあるかどうかをチェックします。

index が 0~(length-1) の場合は、index がそのまま返ります。
それ以外は IndexOutOfBoundsException が発生します。

//Objects.checkIndex(-1, 5); // IndexOutOfBoundsException
System.out.println(Objects.checkIndex(0, 5)); // 0
System.out.println(Objects.checkIndex(1, 5)); // 1
System.out.println(Objects.checkIndex(2, 5)); // 2
System.out.println(Objects.checkIndex(3, 5)); // 3
System.out.println(Objects.checkIndex(4, 5)); // 4
//Objects.checkIndex(5, 5); // IndexOutOfBoundsException

//Objects.checkIndex(0, 0); // IndexOutOfBoundsException
//Objects.checkIndex(0, -1); // IndexOutOfBoundsException

static long checkIndex (long index, long length)

indexが0 (inclusive)からlength (exclusive)までの範囲の境界内にあるかどうかをチェックします。

型が long であること以外は checkIndex(int index, int length) と同じです。
そちらのAPI使用例をご参照ください。

static <T> int compare (T a, T b, Comparator<? super T> c)

引数が一致する場合は0を返し、それ以外の場合は c.compare(a, b)を返します。

final var c = new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        if (o1 < o2) {
            return -1;
        } else if (o1 > o2) {
            return 1;
        } else {
            return 0;
        }
    }
};

System.out.println(Objects.compare(null, null, c)); // 0
System.out.println(Objects.compare(0, 5, c)); // -1
System.out.println(Objects.compare(5, 0, c)); // 1
System.out.println(Objects.compare(123, 123, c)); // 0

static boolean deepEquals (Object a, Object b)

引数が相互に深層で等価である場合はtrueを返し、それ以外の場合はfalseを返します。

"深層"というのは多次元の配列にも対応している、という意味。

final var str1 = "aaa";
final var str2 = "aaa";

System.out.println(Objects.equals(str1, str2)); // true
System.out.println(Objects.deepEquals(str1, str2)); // true

final var str3 = "bbb";

System.out.println(Objects.equals(str1, str3)); // false
System.out.println(Objects.deepEquals(str1, str3)); // false
final String[] array1 = {"a", "b", "c"};
final String[] array2 = {"a", "b", "c"};

System.out.println(Objects.equals(array1, array2)); // false
System.out.println(Objects.deepEquals(array1, array2)); // true

final String[] array3 = {"x", "y", "z"};

System.out.println(Objects.equals(array1, array3)); // false
System.out.println(Objects.deepEquals(array1, array3)); // false
final int[][] array1 = {
        {1, 2}, {3, 4},
        {5, 6}, {7, 8}
};
final int[][] array2 = {
        {1, 2}, {3, 4},
        {5, 6}, {7, 8}
};

System.out.println(Objects.equals(array1, array2)); // false
System.out.println(Objects.deepEquals(array1, array2)); // true

final int[][] array3 = {
        {1, 2}, {3, 4},
        {100, 200}, {300, 400}
};

System.out.println(Objects.equals(array1, array3)); // false
System.out.println(Objects.deepEquals(array1, array3)); // false
System.out.println(Objects.deepEquals(null, null)); // true
System.out.println(Objects.deepEquals(null, 1)); // false
System.out.println(Objects.deepEquals(2, null)); // false

static boolean equals (Object a, Object b)

引数が相互に等しい場合はtrueを返し、それ以外の場合はfalseを返します。

System.out.println(Objects.equals(1, 2)); // false
System.out.println(Objects.equals(3, 3)); // true
System.out.println(Objects.equals("abc", "def")); // false
System.out.println(Objects.equals("xxx", "xxx")); // true
System.out.println(Objects.equals("123", 123)); // false
System.out.println(Objects.equals(null, null)); // true
System.out.println(Objects.equals(null, 1)); // false
System.out.println(Objects.equals(2, null)); // false
final String[] array1 = {"a", "b", "c"};
final String[] array2 = {"a", "b", "c"};

System.out.println(Objects.equals(array1, array2)); // false
System.out.println(Objects.deepEquals(array1, array2)); // true

static int hash (Object... values)

一連の入力値に対してハッシュ・コードを生成します。

System.out.println(Objects.hash(1)); // 32
System.out.println(Objects.hash(1, 2)); // 994
System.out.println(Objects.hash(2, 1)); // 1024
System.out.println(Objects.hash(1, 2, 3)); // 30817
System.out.println(Objects.hash("a", "b", "c")); // 126145
System.out.println(Objects.hash(1, 2, 3, "a", "b", "c")); // 918165601
// 配列はインスタンスのhashCodeが使われます。
// もし配列の内容を考慮したhashCodeが欲しい場合は、Arrays.hashCodeを使用してください。
final int[] array1 = {1, 2, 3};
final int[] array2 = {1, 2, 3};
final int[] array3 = {4, 5, 6};
System.out.println(Objects.hash(array1)); // 1544785573
System.out.println(Objects.hash(array2)); // 664022656
System.out.println(Objects.hash(array3)); // 1426882641

System.out.println(Arrays.hashCode(array1)); // 30817
System.out.println(Arrays.hashCode(array2)); // 30817

static int hashCode (Object o)

null以外の引数のハッシュ・コードを返し、引数がnullの場合は0を返します。

System.out.println(Objects.hashCode(null)); // 0
System.out.println(Objects.hashCode(123)); // 123
System.out.println(Objects.hashCode("abc")); // 96354
// 配列はインスタンスのhashCodeが使われます。
// もし配列の内容を考慮したhashCodeが欲しい場合は、Arrays.hashCodeを使用してください。
final int[] array1 = {1, 2, 3};
final int[] array2 = {1, 2, 3};
final int[] array3 = {4, 5, 6};
System.out.println(Objects.hashCode(array1)); // 1129405362
System.out.println(Objects.hashCode(array2)); // 556034497
System.out.println(Objects.hashCode(array3)); // 606135032

System.out.println(Arrays.hashCode(array1)); // 30817
System.out.println(Arrays.hashCode(array2)); // 30817

static boolean isNull (Object obj)

指定された参照がnullである場合はtrueを返し、そうでない場合はfalseを返します。

System.out.println(Objects.isNull(null)); // true
System.out.println(Objects.isNull(123)); // false
System.out.println(Objects.isNull("abc")); // false
final var list = new ArrayList<String>();
list.add("a");
list.add(null);
list.add("b");
list.add(null);
list.add("c");

System.out.println(list); // [a, null, b, null, c]

final var result = list.stream().filter(Objects::isNull).toList();
System.out.println(result); // [null, null]

static boolean nonNull (Object obj)

指定された参照がnullでない場合はtrueを返し、そうでない場合はfalseを返します。

System.out.println(Objects.nonNull(null)); // false
System.out.println(Objects.nonNull(123)); // true
System.out.println(Objects.nonNull("abc")); // true
final var list = new ArrayList<String>();
list.add("a");
list.add(null);
list.add("b");
list.add(null);
list.add("c");

System.out.println(list); // [a, null, b, null, c]

final var result = list.stream().filter(Objects::nonNull).toList();
System.out.println(result); // [a, b, c]

static <T> T requireNonNull (T obj)

指定されたオブジェクト参照がnullでないことを確認します。

主に、コンストラクタやメソッドのパラメータ検証(nullチェック)のために使います。

class Book {
    private final String title;
    private final String content;

    Book(String title, String content) {
        this.title = Objects.requireNonNull(title);
        this.content = Objects.requireNonNull(content);
    }

    @Override
    public String toString() {
        return "title : " + title + ", content : " + content;
    }
}

//new Book(null, "abcd"); // NullPointerException
//new Book("XYZ", null); // NullPointerException

final var book = new Book("XYZ", "abcd");
System.out.println(book); // title : XYZ, content : abcd

static <T> T requireNonNull (T obj, String message)

指定されたオブジェクト参照がnullでないことを確認し、nullの場合はカスタマイズされたNullPointerExceptionをスローします。

主に、コンストラクタやメソッドのパラメータ検証(nullチェック)のために使います。

class Book {
    private final String title;
    private final String content;

    Book(String title, String content) {
        this.title = Objects.requireNonNull(title, "title must not be null");
        this.content = Objects.requireNonNull(content, "content must not be null");
    }

    @Override
    public String toString() {
        return "title : " + title + ", content : " + content;
    }
}

//new Book(null, "abcd"); // NullPointerException: title must not be null
//new Book("XYZ", null); // NullPointerException: content must not be null

final var book = new Book("XYZ", "abcd");
System.out.println(book); // title : XYZ, content : abcd

static <T> T requireNonNull (T obj, Supplier<String> messageSupplier)

指定されたオブジェクト参照がnullでないことを確認し、nullの場合はカスタマイズされたNullPointerExceptionをスローします。

主に、コンストラクタやメソッドのパラメータ検証(nullチェック)のために使います。

class Book {
    private final String title;
    private final String content;

    Book(String title, String content) {
        this.title = Objects.requireNonNull(title, () -> "title must not be null");
        this.content = Objects.requireNonNull(content, () -> "content must not be null");
    }

    @Override
    public String toString() {
        return "title : " + title + ", content : " + content;
    }
}

//new Book(null, "abcd"); // NullPointerException: title must not be null
//new Book("XYZ", null); // NullPointerException: content must not be null

final var book = new Book("XYZ", "abcd");
System.out.println(book); // title : XYZ, content : abcd

static <T> T requireNonNullElse (T obj, T defaultObj)

非nullの場合は最初の引数を返し、それ以外の場合は非nullの第2引数を返します。

class Book {
    private final String title;
    private final String content;

    Book(String title, String content) {
        this.title = Objects.requireNonNullElse(title, "default title");
        this.content = Objects.requireNonNullElse(content, "default content");
    }

    @Override
    public String toString() {
        return "title : " + title + ", content : " + content;
    }
}

final var book1 = new Book(null, "abcd");
System.out.println(book1); // title : default title, content : abcd

final var book2 = new Book("XYZ", null);
System.out.println(book2); // title : XYZ, content : default content

final var book3 = new Book("XYZ", "abcd");
System.out.println(book3); // title : XYZ, content : abcd

static <T> T requireNonNullElseGet (T obj, Supplier<? extends T> supplier)

null以外の場合は最初の引数を返し、そうでなければsupplier.get()の非null値を返します。

class Book {
    private final String title;
    private final String content;

    Book(String title, String content) {
        this.title = Objects.requireNonNullElseGet(title, () -> "default title");
        this.content = Objects.requireNonNullElseGet(content, () -> "default content");
    }

    @Override
    public String toString() {
        return "title : " + title + ", content : " + content;
    }
}

final var book1 = new Book(null, "abcd");
System.out.println(book1); // title : default title, content : abcd

final var book2 = new Book("XYZ", null);
System.out.println(book2); // title : XYZ, content : default content

final var book3 = new Book("XYZ", "abcd");
System.out.println(book3); // title : XYZ, content : abcd

static String toString (Object o)

非 null引数に対してtoStringを呼び出し、null引数に"null"を呼び出した結果を返します。

final var str1 = Objects.toString(null);
System.out.println(str1); // "null"

final var str2 = Objects.toString(123);
System.out.println(str2); // "123"

final var str3 = Objects.toString("abcd");
System.out.println(str3); // "abcd"

static String toString (Object o, String nullDefault)

最初の引数がnullでない場合はそれに対するtoStringの呼出し結果を返し、それ以外の場合は2番目の引数を返します。

final var str1 = Objects.toString(null, "XYZ");
System.out.println(str1); // "XYZ"

final var str2 = Objects.toString(123, "XYZ");
System.out.println(str2); // "123"

final var str3 = Objects.toString("abcd", "XYZ");
System.out.println(str3); // "abcd"

関連記事

ページの先頭へ