Методы массива Java – Как напечатать массив на Java

metody massiva java – kak napechatat massiv na java

Массив – это структура данных, используемая для хранения данных одного типа. Массивы хранят свои элементы в смежных местах памяти.

В Java массивы являются объектами. Все способы объекта класса могут быть вызваны в массиве. Мы можем хранить фиксированное количество элементов в массиве.

Давайте объявим простой примитивный тип массива:

int[] intArray = {2,5,46,12,34};

Теперь попробуем распечатать его с помощью System.out.println() метод:

System.out.println(intArray);  // выход: [I@74a14482

Why did Java not print our array? What is happening under the hood?

The System.out.println() method converts the object we passed into a string by calling String.valueOf() . If we look at the String.valueOf() method’s implementation, we’ll see this:

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

If the passed-in object is null it returns null, else it calls obj.toString() . Eventually, System.out.println() calls toString() to print the output.

If that object’s class does not override Object.toString()‘s implementation, it will call the Object.toString() method.

Object.toString() returns getClass().getName()+‘@’+Integer.toHexString(hashCode()) . In simple terms, it returns: “class name @ object’s hash code”.

In our previous output [I@74a14482 , the [ states that this is an array, and I stands for int (the type of the array). 74a14482 is the unsigned hexadecimal representation of the hash code of the array.

Whenever we are creating our own custom classes, it is a best practice to override the Object.toString() method.

We can not print arrays in Java using a plain System.out.println() method. Instead, these are the following ways we can print an array:

  1. Loops: for loop and for-each loop
  2. Arrays.toString() method
  3. Arrays.deepToString() method
  4. Arrays.asList() method
  5. Java Iterator interface
  6. Java Stream API

Let’s see them one by one.

Here’s an example of a for loop:

int[] intArray = {2,5,46,12,34};  for(int i=0; i[i]);  // выход: 25461234 }

Все классы обертки заменяются Object.toString() и вернуть строчное представление их значения.

А вот цикл for-each:

int[] intArray = {2,5,46,12,34};

for(int i: intArray){
    System.out.print(i);
    // output: 25461234
}

Arrays.toString() является статическим методом класса массива, который относится к java.util пакет. Он возвращает строчное представление содержания указанного массива. Посредством этого метода мы можем напечатать одномерные массивы.

Элементы массива превращаются в строки с помощью String.valueOf() метод, вот такой:

int[] intArray = {2,5,46,12,34};
System.out.println(Arrays.toString(intArray));
// output: [2, 5, 46, 12, 34]

Для ссылочного типа массива мы должны убедиться, что класс ссылочного типа переопределяет Object.toString() метод.

Например:

public class Test {
    public static void main(String[] args) {
        Student[] students = {new Student("John"), new Student("Doe")};
        
        System.out.println(Arrays.toString(students));
        // output: [Student{name="John"}, Student{name="Doe"}]
    }
}

class Student {
    private String name;

    public Student(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student{" + "name="" + name + "\'' + '}';
    }
}

Этот способ не подходит для многомерных массивов. Он превращает многомерные массивы в строки с помощью Object.toString() которая описывает их идентичность, а не содержание.

Например:

// creating multidimensional array
int[][] multiDimensionalArr = { {2,3}, {5,9} };

System.out.println(Arrays.toString(multiDimensionalArr));
// output: [[I@74a14482, [I@1540e19d]

С помощью Arrays.deepToString()мы можем печатать многомерные массивы.

Arrays.deepToString() возвращает строчное представление «глубокого содержимого» указанного массива.

Если элемент является массивом примитивного типа, он превращается в строку, вызывая соответствующую перегрузку Arrays.toString() .

Вот пример примитивного типа многомерного массива:

// creating multidimensional array
int[][] multiDimensionalArr = { {2,3}, {5,9} };

System.out.println(Arrays.deepToString(multiDimensionalArr));
// output: [[2, 3], [5, 9]]

Если элемент является массивом ссылочного типа, он преобразуется в строку путем вызова Arrays.deepToString() рекурсивно.

Teacher[][] teachers = 
{{ new Teacher("John"), new Teacher("David") }, {new Teacher("Mary")} };

System.out.println(Arrays.deepToString(teachers));
// output: 
[[Teacher{name="John"}, Teacher{name="David"}],[Teacher{name="Mary"}]]

Мы должны переопределить Object.toString() в нашем классе учителей.

Если вам интересно, как он выполняет рекурсию, вот исходный код для Arrays.deepToString() метод.

ПРИМЕЧАНИЕ: С помощью этого метода можно также напечатать одномерные массивы эталонного типа. Например:

Integer[] oneDimensionalArr = {1,4,7};

System.out.println(Arrays.deepToString(oneDimensionalArr));
// output: [1, 4, 7]

Этот метод возвращает список фиксированного размера, поддерживаемый указанным массивом.

Integer[] intArray = {2,5,46,12,34};

System.out.println(Arrays.asList(intArray));
// output: [2, 5, 46, 12, 34]

Мы изменили тип Integer с int, поскольку List — это коллекция, содержащая список объектов. Когда мы превращаем массив в список, это должно быть массив ссылочного типа.

Вызовы Java Arrays.asList(intArray).toString() . Эта техника внутренне использует toString() метод типа элементов в списке

Другой пример с нашим пользовательским классом Teacher:

Teacher[] teacher = { new Teacher("John"), new Teacher("Mary") };

System.out.println(Arrays.asList(teacher));
// output: [Teacher{name="John"}, Teacher{name="Mary"}]

ПРИМЕЧАНИЕ: Мы не можем напечатать многомерные массивы с помощью этого метода. Например:

Teacher[][] teachers = 
{{ new Teacher("John"), new Teacher("David") }, { new Teacher("Mary") }};
        
System.out.println(Arrays.asList(teachers));

// output: [[Lcom.thano.article.printarray.Teacher;@1540e19d, [Lcom.thano.article.printarray.Teacher;@677327b6]

Подобно циклу for-each мы можем использовать интерфейс Iterator, чтобы перебирать элементы массива и печатать их.

Объект итератора можно создать, вызвав iterator() метод для коллекции. Этот объект будет использоваться для выбора элементов этой коллекции.

Вот пример того, как мы можем напечатать массив с помощью интерфейса Iterator:

Integer[] intArray = {2,5,46,12,34};

// creating a List of Integer
List<Integer> list = Arrays.asList(intArray);

// creating an iterator of Integer List
Iterator<Integer> it = list.iterator();

// if List has elements to be iterated
while(it.hasNext()) {
    System.out.print(it.next());
    // output: 25461234
}

Stream API используется для обработки коллекций объектов. Поток – это последовательность объектов. Потоки не изменяют исходную структуру данных, они лишь дают результат в соответствии с запрашиваемыми операциями.

С помощью forEach() терминальную операцию мы можем перебирать по каждому элементу потока.

Например:

Integer[] intArray = {2,5,46,12,34};

Arrays.stream(intArray).forEach(System.out::print);
// output: 25461234

Теперь мы знаем, как распечатать массив на Java.

Спасибо, что читаете.

Обложка: Азиз Ачарки на Unsplash.

Вы можете прочитать другие мои статьи на Medium.

Счастливого кодирования!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *