Указатели на тот же массив в Java - PullRequest
2 голосов
/ 04 января 2011

Я просто хочу убедиться, что мне ясно об этом, так как я не совсем уверен в точном поведении. У меня есть два массива:

private short[] bufferA;
private short[] bufferB;

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

private short[] currentBuffer;

while(something)
  {
  currentBuffer = (condition) ? bufferA : bufferB;
  modify(currentBuffer);
  }

для изменения bufferA или bufferB в зависимости от какого-либо условия, или я должен использовать флаги и вручную кодировать его следующим образом:

private int currentBuffer;

while(something){
  currentBuffer = (condition) ? BUFFER_A : BUFFER_B;
  if(currentBuffer == BUFFER_A) {
    modify(bufferA);
  }else{
    modify(bufferB);
  }
}

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

Ответы [ 5 ]

4 голосов
/ 04 января 2011

Хотя ваши массивы содержат примитивы, сами массивы являются объектами

так что ссылка работает нормально.

Java передает по примитивам значений и по ссылочным объектам.

Udo

3 голосов
/ 04 января 2011

Да, вы можете. Ссылки на массивы аналогичны любым другим ссылкам.

2 голосов
/ 04 января 2011

Ваш первый пример должен работать нормально.

1 голос
/ 04 января 2011

Оба являются allrite .. Вы можете продолжить с 1-го пути .. EDIT: В качестве примечания, ссылки в java больше похожи на указатели в c ++, чем ссылки в c ++. Конечно, между ссылками на Java и указателями на c ++ все еще есть некоторые различия, например, Вы можете сделать арифметику указателя в C ++ ..

1 голос
/ 04 января 2011

Первый способ будет отлично работать с массивами (или любыми другими контейнерами).

Однако вы не можете переназначить переменные, просто измените их содержимое:

int myVar = someCondition ? myInt1 : myInt2;
// this has no effect on either myInt1 or myInt2
myVar = 1000;

Причина здесьв том, что Java передает все по значению, включая ссылки.

Так что, если вы передадите ссылку на контейнер где-то еще, этот код может изменить содержимое контейнера, и ваш код увидит изменения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...