System.arraycopy – копирование объекта — КиберПедия 

История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

System.arraycopy – копирование объекта

2022-10-27 26
System.arraycopy – копирование объекта 0.00 из 5.00 0 оценок
Заказать работу

Метод arraycopy() - Копирование массива

Стандартная библиотека Java содержит статический метод System.arraycopy(), который копирует массивы значительнее быстрее, чем при ручном копировании в цикле for.

В аргументах arraycopy() передается исходный массив, начальная позиция копирования в исходном массиве, приёмный массив, начальная позиция копирования в приёмном массиве и количество копируемых элементов. Любое нарушение границ массива приведет к исключению.

Разработчик Avi Yehuda написал программу, которая вычисляет время на копирование с помощью цикла for и с помощью метода arraycopy() на примере с миллионом элементов. Ручное копирование у него заняло 182 мс, с помощью метода arraycopy() - 12 мс. Разница колоссальна.

public class ArrayCopyTestActivity extends Activity { private static final int SIZE_OF_ARRAY = 1000000;   private long time;    /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   setContentView(R.layout.main);           Integer [] sourceArray = new Integer[SIZE_OF_ARRAY];   Integer [] dst = new Integer[SIZE_OF_ARRAY];   fillArray(sourceArray);           startBenchmark();   naiveCopy(sourceArray,dst);   stopBenchmark();          startBenchmark();   System.arraycopy(sourceArray, 0, dst, 0, sourceArray.length);   stopBenchmark(); }    private void naiveCopy(Integer [] src, Integer [] dst) {          for (int i = 0; i < src.length; i++) {                  dst[i]=src[i];          }   }    private void fillArray(Integer [] src) {          for (int i = 0; i < src.length; i++) {                  src[i]=i;          }   }      private void startBenchmark() {          time = System.currentTimeMillis();   }      private void stopBenchmark() {          time = System.currentTimeMillis() - time;          Log.d("array copy test", "time="+time);             }}

Обзор был бы не полным без описания метода копирования массивов arraycopy(), который использует сама исполняющая система Java.

Метод находится в классе System в пакете java.lang и позволяет копировать массивы быстрее, чем это получается в случае поэлементного итеративного копирования. Метод перегружен для всех примитивных типов и типа Object.

Общая форма метода имеет вид:

static void arraycopy(type[] src, int src_ind, type[] dest, int dest_ind, int count)

Метод arraycopy(a, starta, r, startr, a.length); класса System копирует из массива a с позиции starta все a.length элементов, в массив r располагая их в массиве r начиная с позиции startr.

System.arraycopy(a, 0, r, 0, a.length);

System.arraycopy(b, 0, r, a.length, b.length); //реализация a+b

Класс Arrays и его методы

В пакете java.util находится класс Arrays, который содержит методы манипулирования содержимым массива, а именно для поиска, заполнения, сравнения, преобразования в коллекцию и прочие.

   
int binarySearch(параметры) – перегруженный метод организации бинарного поиска значения в массивах примитивных и объектных типов. Возвращает позицию первого совпадения;  
void fill(параметры) – перегруженный метод для заполнения массивов значениями различных типов и примитивами;
void sort(параметры) – перегруженный метод сортировки массива или его части с использованием интерфейса Comparator и без него;  
copyOf(оригинальный_массив,новая_длина) – копирует заданную область массива в новый массив; int[] numbers = new int[] { 1, 2, 3, 5 }; int[] figures = Arrays.copyOf(numbers, numbers.length);  
toString(ссылка на массив) -вывод одномерного массива в строковом виде // вывод массива объектов String String[] strArr = {"A", "C", "B", "Z", "E"}; Arrays.sort(strArr); System.out.println(Arrays.toString(strArr)); / вывод массива int'ов int[] intArr = {5,9,1,10}; Arrays.sort(intArr); System.out.println(Arrays.toString(intArr));    
static <T> T[] copyOfRange(T[] original, int from, int to)   – копирует заданную область массива в новый массив; String[] massive1 = {"Татьяна", "Сергей", "Александр", "Павлик"}; // Копируем элементы массива в другой массив String[] massive2= Arrays.copyOf(massive1, 3); // Копируем нужные элементы в диапазоне String[] massive3= Arrays.copyOfRange(massive1, 1,massive1.length);
deepToString(ссылка на двумерный массив) - вывод двумерного массива System.out.println(Arrays.deepToString(ch)); где ch двумерный массив
equals(ссылка на одномерный массив 1, ссылка на одномерный массив 2). Сравнение на равенство одномерных массивов. Результат true, если их длины равны и они поэлементно равны. //Создаем два массива int[]a1=newint[10]; int[]a2=new int[10]; //заполняем их девятками Arrays.fill(a1,9); Arrays.fill(a2,9); System.out.println("Сравним:"+Arrays.equals(a1,a2));
   

/* Перебор элементов массива, не лучший способ,* Вообще, никогда не используйте.length внутри цикла,* т.к. тогда он будет на каждой итерации

вызывать метод подсчета длины. */

for(int i=0; i<massive1.length;i++){

out.printf("%s ", massive1[i]);

}

out.println();

// Правильный вывод элементов массива по быстродействию

for(String s: massive2){

out.printf("%s ", s);

}

out.println();

for(String s1: massive3){

out.printf("%s", s1);

}

}

}

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

/* пример # 21: методы класса Arrays: ArraysEqualDemo.java */

package chapt10;

import java.util.*;

public class ArraysEqualDemo {

public static void main(String[] args) {

char m1[] = new char [3];

char m2[] = { ‘a’, ‘b’, ‘c’ }, i;

Arrays.fill(m1, ‘a’);

System.out.print("массив m1:");

for (i = 0; i < 3; i++)

System.out.print(" " + m1[i]);

m1[1] = ‘b’;

m1[2] = ‘c’;

//m1[2]=’x’; // приведет к другому результату

if (Arrays.equals(m1, m2))

System.out.print("\nm1 и m2 эквивалентны");

Else

System.out.print("\nm1 и m2 не эквивалентны");

m1[0] = ‘z’;

Arrays.sort(m1);

System.out.print("\nмассив m1:");

for (i = 0; i < 3; i++)

System.out.print(" " + m1[i]);

System.out.print("\n значение ‘c’ находится в позиции-" + Arrays.binarySearch(m1, ‘c’));

Integer arr[] = {35, 71, 92};

//вывод массива объектов в строку

System.out.println(Arrays.deepToString(arr));

//вычисление хэш-кода исходя и значений элементов

System.out.println(Arrays.deepHashCode(arr));

Integer arr2[] = {35, 71, 92};

//сравнение массивов по седержимому

System.out.println(Arrays.deepEquals(arr, arr2));

char m3[] = new char [5];

// копирование массива

m3 = Arrays. copyOf (m1, 5);

System. out. print("массив m3:");

for (i = 0; i < 5; i++)

System. out. print(" " + m3[i]);

}

}

В результате компиляции и запуска будет выведено:

Массив m1: a a a

M1 и m2 эквивалентны

Массив m1: b c z

значение ‘c’ находится в позиции 1

[35, 71, 92]

65719

True

массив m3: b c z □ □


Поделиться с друзьями:

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.017 с.