Неожидаемый результат поиска значения Integer в ArrayList

Рейтинг: 1Ответов: 1Опубликовано: 07.08.2023

В общем, знакомлюсь с технологией. Изучаю книгу Берта Бейтса и Кати Сьерры по Java.

При реализации игры (по принципу морского боя) с использованием класса ArrayList из стандартной библиотеки Java(API) возникает проблема поиска элемента, который я хочу найти со значением типа int.

Не вдаваясь в подробности кода игры, реализовал более просто пример для демонстрации и в целях изучения механизма:

Исходные данные: небольшой массив значений int[];

Задача: Организовать поиск значения в массиве, если значение существует, удалить из него. Чтобы не использовать перебор циклом, решаю преобразовать в объект ArrayList и обработать существующее целочисленное значение с использованием методов класса "contains", "indexOf", "remove".

Проблема: метод Arrays.asList() создает список, в каждом их значений которого содержится массив. Чтобы получить доступ к элементам я должен использовать метод Get(0), т.е. указать явно на нулевую строчку коллекции и только потом со значением int[] внутри что-то делать. Хотя я ожидаю, что в результате работы вызова метода asList() у меня будет доступен ArrayList без "уровней вложения".

Собственно, вопрос, что я в методе понял не так и где споткнулся...

import java.util.ArrayList;
import java.util.Arrays;
import static java.lang.System.out;

public class SearchControl {

    private int[] arrObject;
    private ArrayList<Integer> arrListObject;
    
    public static void main(String[] args) {
        
        SearchControl scObject = new SearchControl();       
        scObject.setMethod();
    }

    void setMethod() {
                
        arrObject = new int[] {1,2,3,4,5};
        arrListObject = new ArrayList<Integer>();
        
        //block #1: normal method behavior
        out.println("Regular behavior:");
        for (int arrValue : arrObject) {
            arrListObject.add(arrValue);        
        }       
        out.println("- 'arrListObject' contains element '1': " + arrListObject.contains(3));
    
        //block #2: abnormal method behavior        
        out.println("\nNon-expected behavior:");
        arrListObject = new ArrayList(Arrays.asList(arrObject));
        out.println("- 'arrListObject' contains element 'arrObject': " + arrListObject.contains(arrObject));
        out.println("- 'arrListObject' contains element '1': " + arrListObject.contains(3));
        
    }
}

"Результат работы block#1:"

"Результат работы block#2:"

Ответы

▲ 1Принят

Дело видимо в том, что arrObject объявлен как массив примитивов, поэтому он не пролезает в сигнатуру Arrays.asList:

public static <T> List<T> asList(T... a)

int не может играть роль T т.к. нужен ссылочный тип, а int примитивный. А вот int[] -- ссылочный, в итоге весь массив трактуется как единственный элемент списка.

Всё должно заработать, если заменить определение на

Integer[] arrObject = new Integer[] {1,2,3,4,5};