2016-07-17 4 views
-1
public static void main(String[] args) { 
    int sizeOfTestArray = 50; 
    int[] testArray = new int[sizeOfTestArray]; 
    Random random = new Random(); 
    for (int i = 0; i < sizeOfTestArray; i++) { 
     testArray[i] = random.nextInt(100); 
    } 

    System.out.println(Arrays.toString(testArray)); 
    bubbleSort(testArray); 
    System.out.println(Arrays.toString(testArray)); 
} 

public static void bubbleSort(int[] arr) { 
    for (int i = 0; i < arr.length; i++) { 
     for (int j = 0; j < arr.length - 1; j++) { 
      if (arr[j] > arr[j + 1]) { 
       int temp = arr[j]; 
       arr[j] = arr[j + 1]; 
       arr[j + 1] = temp; 
      } 
     } 
    } 
} 

Если Java является передачей по значению, как я могу манипулировать testArray внутри моего метода bubbleSort и «возвращать» тестовый массив bubbleSorted? Должен ли объект bubbleSorted testArray быть уничтожен после того, как моя программа выйдет из метода bubbleSort? Пожалуйста, помогите мне понять это, так как я получаю противоречивую информацию в Интернете о том, является ли Java передачей по значению или передачей по ссылке.Как алгоритм сортировки по пустоте «возвращает» результат?

+0

Интерфейсы обратного вызова могут «возвращать» результаты асинхронно –

+3

«Передача по значению» означает, что ссылка на массив передается. Вы все равно можете изменить содержимое массива. – markspace

+0

Чтобы ответить на фактический вопрос, вы указали массив как параметр, который является «значением», являющимся ссылочным указателем на массив в памяти. Любые изменения внутри метода будут обновлять это эталонное значение. –

ответ

3

Если Java передается по значению, как я могу манипулировать testArray внутри моего метода bubbleSort и «возвращать» тестовый массив bubbleSorted?

Поскольку массивы mutable: Их состояние может быть изменено. Таким образом, метод не возвращает ничего, но он изменяет состояние объекта, на которое ссылается значение, которое вы передаете.

То, что вы проходите (ссылка на объект), передается по значению. Но объект, на который он ссылается, находится где-то в памяти, ссылка - это всего лишь средство сообщить JVM, где она есть. Это другое использование слова «reference», чем слово «pass-by-reference» (которое конкретно относится к переменной , а не к объекту).

+0

Терминология Java немного запутанна, если вы исходите с других языков, но выше 100% правильно. Помните, что массивы - это объекты, и все объекты (включая массивы) существуют в куче. Изменения в памяти кучи видны глобально. – markspace

+1

@markspace Объект, находящийся в куче, не имеет к этому никакого отношения. – EJP

+0

Параметры метода @ELP обычно передаются в стек. Объекты обычно хранятся в куче. Семантика Java для параметров и объектов метода происходит непосредственно из того, как естественно работают эти области памяти. Если вы пытаетесь спорить о каком-то угловом деле или оптимизации, я думаю, вы собираете гниды. – markspace

0

Когда вы передаете массив любой функции, адрес этого массива передается, который присутствует в памяти стека. Никакой новый массив не сформирован, это просто ключ, который передается функции, чтобы функция могла обращаться к членам данных. Поскольку массив является не примитивным типом данных, элементы присутствуют в памяти кучи, и адрес этого непрерывного списка присутствует в памяти стека. Поэтому, когда вы передаете массив, функция непосредственно работает с членами, присутствующими в кучевой памяти. Если вы новичок в java, читайте о примитивных и не примитивных типах данных, стеке и кучевой памяти.