Инициализация матрицы Java - PullRequest
0 голосов
/ 22 февраля 2019

Я программирую на Java уже 3 года, я знаю, как инициализировать матрицу, но меня беспокоит разница между этим

double[][] matrix = new double[rows][];
for (int i = 0; i < rows; i++) {
    matrix[i] = new double[columns];
    for (int j = 0; j < columns; j++) {
        matrix[i][j] = 0.0d;
    }
}

и этим

double[][] matrix = new double[rows][columns];
for (int i = 0; i < rows; i++) {
    for (int j = 0; j < columns; j++) {
        matrix[i][j] = 0.0d;
    }
}

Кажется, они инициализируются одинаково, но мне сказали, что первый способ лучше, но я не знаю почему.Спасибо за ответ!

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

Когда вы печатаете два массива сразу после их операторов объявления, становится очевидной одна причина:

Первая печатает [null, null], а вторая [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0]] (протестировано с rows = 2 и columns = 3)

Первый инициализирует внутренние массивы только тогда, когда доступны их данные, а второй создает и инициализирует эти внутренние массивы нулями (значение по умолчанию для double).Это различие, по сути, связано с тем, когда создаются объекты (и последствия этого при использовании памяти)Для небольших массивов эта разница, вероятно, будет незначительной.

Кроме того, внутренние массивы не обязательно должны быть одинаковой длины, поэтому:

  • double[][] matrix = new double[rows][columns] заставляет всевнутренние массивы должны иметь длину columns.
  • double[][] matrix = new double[rows][] позволяет добавить new double[12] к внешнему массиву, поэтому внутренние массивы могут иметь различную длину.
0 голосов
/ 22 февраля 2019

На самом деле оба способа чрезмерно раздуты, потому что инициализация подмассивов double[] с 0.0 уже сделана неявно.Поэтому вам не нужно делать это явно.

Таким образом, вы можете написать это так и иметь тот же эффект:

double[][] matrix = new double[rows][];
for (int i = 0; i < rows; i++) {
    matrix[i] = new double[columns];
}

или

double[][] matrix = new double[rows][columns];

Я бы предпочел последний, потому что он самый простой.

0 голосов
/ 22 февраля 2019

Я не думаю, что один подход можно категоризировать как строго лучший, чем другой.Вы будете использовать любой из двух в зависимости от вашего варианта использования.

Например, преимущество первого подхода: вы можете иметь matrix с разными размерами столбцов.Также инициализация matrix откладывается (память не выделяется).Например:

double[][] matrix = new double[2][]; // memory is not allocated yet
matrix[0] = new double[] {1.0};
matrix[1] = new double[] {1.0, 2.0};

С другой стороны, второй подход позволяет создать и инициализировать matrix за один шаг, когда вы знаете, что matrix имеет фиксированные размеры (rows & columns):

double[][] matrix = new double[2][2]; // memory is allocated for double 2x2 matrix
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...