Java передает ссылкой? [дубликат]

  1. Что такое Big O для всех методов массива javascript (особенно indexof, включает в себя)
blockquote>

Поиск значений в неупорядоченных списках является классическим O (n ) задача: поскольку вы не знаете, где находится элемент, вам просто нужно начать проверять их один за другим. Хотя технически возможно создать «инверсную» карту значений -> для ключей для массивов, среды обычно просто этого не делают. Например, механизм V8 также не является исключением, см. https://github.com/v8/v8/blob/master/src/elements.cc , методы, подобные IndexOfValueSlowPath [1112 ]

for (uint32_t k = start_from; k < length; ++k) {
blockquote>

или IndexOfValueImpl

for (uint32_t k = start_from; k < length; ++k) {
blockquote>

и еще пару их экземпляров .
Они вызываются из Runtime_ArrayIndexOf , в частности по строке 899 . Если этот метод не применяется, через пару строк есть запасной вариант, снова с использованием простого цикла for (ранее было установлено index, уже использовалось для вызова методов, упомянутых выше):

for (; index < len; ++index) {

  1. Что такое большой O всего метода объекта javascript (особенно ключей, значений)
blockquote>

Object находится в соседнем (в массив) исполняемый файл, https://github.com/v8/v8/blob/master/src/runtime/runtime-object.cc , но и там не ожидайте магии, он также заканчивается в различных циклах for в https://github.com/v8/v8/blob/master/src/keys.cc , как простой проверка , если массив состоит из действительных ключей (чисел и строк)

static bool ContainsOnlyValidKeys(Handle array) {
  int len = array->length();
  for (int i = 0; i < len; i++) {
    Object e = array->get(i);
    if (!(e->IsName() || e->IsNumber())) return false;
  }
  return true;
}
blockquote>

или другого, вызванного из разных мест для создания единой коллекции из нескольких источников: [1131 ]

void KeyAccumulator::AddKeys(Handle array,
                             AddKeyConversion convert) {
  int add_length = array->length();
  for (int i = 0; i < add_length; i++) {
    Handle current(array->get(i), isolate_);
    AddKey(current, convert);
  }
  blockquote> 
  1. Big o (1) называется постоянным временем, но что является exa ct время в мс
blockquote>

Такого не существует.

10
задан Michael Myers 26 February 2009 в 15:34
поделиться

5 ответов

Для подробного объяснения см. мою статью "Java is Pass-By-Value, Dammit!"

http://javadude.com/articles/passbyvalue.htm

11
ответ дан 3 December 2019 в 14:12
поделиться

Java использует передачу значением, не ссылкой...

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

Так == сравнивает значения ссылок для Объектов.

15
ответ дан 3 December 2019 в 14:12
поделиться

Точка различия между "передачей **-by-reference" и "передачей ** ссылка". Вы также иногда видите "call-by-..." и "pass-by-..." используемый попеременно. Для простоты я буду придерживаться с "pass-by-...".

  1. В академической, олдскульной, научной аккомпанементом терминологии, ВАЖНОЙ ДЛЯ ФОРТРАНА, передача ссылкой означает, что названный код имеет доступ (ссылка) на переменную, переданную вызывающей стороной. Присвоение формальному параметру в названном коде на самом деле делает уроки к переменной вызывающей стороны. Различие по сравнению с (среди других) передача значением, которая дает названному коду копию данных (независимо от того, что это), известный вызывающей стороне.

  2. В современном мире OO, важном для Java, "имея ссылку" на объект означает способность добраться до самого объекта. Это отличают от "наличия указателя", чтобы подчеркнуть (среди прочего), что каждый не делает "адресной арифметики с указателями" на ссылке. (На самом деле "ссылка" в этом смысле должна не обязательно быть фактическим подобным указателю адресом памяти.)

Java передает аргументы значением (в первом смысле), но для объектных аргументов, значение является ссылкой (во втором смысле). Вот немного кода, который полагается на различие.

// called
public void munge(List<String> a0, List<String> a1) {
    List<String> foo = new List<String>(); foo.add("everybody");
    a0.set(0, "Goodbye");
    a1 = foo;
}

// caller
...
List<String> l0 = new List<String>(); l0.add("Hello");
List<String> l1 = new List<String>(); l1.add("world");
munge(l0, l1);
...

По возврату из munge, первый список вызывающей стороны, l0 будет содержать "Goodbye". Ссылка на тот список была передана munge, который названный методом видоизменения на этом упомянул объект. (Другими словами, a0 полученный копия значения l0, который был ссылкой на список строк, который был изменен.)

Однако по возврату из munge, второй список вызывающей стороны, l1 все еще содержит "world" потому что никакие методы не назвали на переданной ссылке на объект (значение l1, переданный значением munge). Вместо этого переменная аргумента a1 был установлен на новое значение (ссылка локального объекта, также сдержанная foo).

ЕСЛИ Java использовал передачу ссылкой, то по возврату, l1 содержал бы "everybody" потому что a1 упомянул бы переменную l1 и не просто инициализированный к копии его значения. Так присвоение на a1 также было бы присвоение на l1.

Этот тот же вопрос обсуждался в другом вопросе с ASCII-творчеством для иллюстрирования ситуации.

5
ответ дан 3 December 2019 в 14:12
поделиться

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

== оператор должен использоваться для сравнения примитивных значений, и для сравнения ссылок на объект.

3
ответ дан 3 December 2019 в 14:12
поделиться

Короткий ответ нет. В Java существует только передача значением, и когда Вы работаете с объектами (например. Object obj = new Object();), Вы работаете со ссылками на объект. Который передается значением.

Для получения дополнительной информации см.: Передача параметров в Java

2
ответ дан 3 December 2019 в 14:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: