Различие между различным Массивом копирует методы

Для добавления немного больше к разговору Java является более портативным, если Вы остаетесь об одной версии позади - Java 5 все еще имеет много превосходных функций, таким образом, можно ожидать Java 6 и все еще иметь много диапазона с точки зрения языка и библиотек для разработки с. Mac является основной платформой, которая может занять время для ловли до последней версии Java.

Java также имеет превосходное организация по стандартизации , который разумно выращивает платформу на основе входа от многих различных компаний. Это - часто пропущенная функция, но это сохраняет даже новые возможности, работающие хорошо через несколько платформ, и обеспечивает много диапазона в поддержке библиотеки некоторых тайных вещей (как дополнительные расширения).

20
задан Bhagwati Malav 25 December 2016 в 11:52
поделиться

2 ответа

  • System.arraycopy () использует JNI (собственный интерфейс Java) для копирования массив (или его части), так что это невероятно быстро, как вы можете подтвердить здесь ;
  • clone () создает новый массив с теми же характеристиками, что и старый массив, т. Е. Того же размера, того же типа и того же содержание. Обратитесь к здесь за некоторыми примерами клона в действии;
  • ручное копирование - это, в общем, ручное копирование. Об этом методе особо нечего сказать, за исключением того, что многие люди считают его наиболее производительным .
  • arrayynew = arrayold не копирует массив; он просто указывает arrayynew на адрес памяти arrayold или, другими словами, вы просто назначаете ссылку старому массиву.
]
24
ответ дан 29 November 2019 в 23:44
поделиться

Первый вопрос. Почему это так, если ты расширить класс новым методом и затем создайте объект / экземпляр этого класса, вы не можете получить доступ к этому методу?

Поскольку вы расширили класс String, поэтому #ciao является методом класса, а не методом экземпляра.

String.send(:include, Greeter)
x = "foo bar"
x.ciao
# => "Ciao!"

Вторая часть, Когда я пытаюсь расширить Объект Fixnum, я получаю неопределенный ошибка метода. Может кто-нибудь объяснить почему это работает для строки, но не для fixnum?

Вот короткий ответ .

«Fixnums, Symbols, true, nil и false реализуются как немедленные ценности. С немедленными ценностями, переменные содержат сами объекты, а не ссылки на них.

Синглтон-методы не могут быть определены для таких объектов. Два фикснума одинаковое значение всегда представляет одно и то же экземпляр объекта, поэтому (например) переменные экземпляра для Fixnum с значение «один» распределяется между всеми «единицы» - это система. Это делает невозможно определить синглтон метод только для одного из них. "

Конечно, вы можете включить / расширить класс Fixnum, и каждый экземпляр Fixnum будет предоставлять методы в Mixin. Это означает, что новый массив может быть больше или больше, чем исходный массив, и содержимое общего размера будет таким же, как у источника. Есть даже версия, которая позволяет создавать массив другого типа, и версия, в которой вы можете указать диапазон элементов для копирования ( Array.copyOfRange () ).

Обратите внимание, что все из этих методов делают неглубокие копии. Это означает, что копируются только ссылки, хранящиеся в массивах, а указанные объекты не дублируются.

13
ответ дан 29 November 2019 в 23:44
поделиться
Другие вопросы по тегам:

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