Перш за все, я можу погодитись лише з тим, що Arrays.asList(T...)
, очевидно, найкраще рішення для типів Wrapper або масивів із непомітними типами даних. Цей метод викликає конструктор простої приватної статичної AbstractList
реалізації в Arrays
класі, який в основному зберігає дану посилання масиву як поле і моделює список, замінюючи необхідні методи.
Якщо ви можете обрати між примітивним типом або типом Wrapper для свого масиву, я б використовував тип Wrapper для таких ситуацій, але, звичайно, це не завжди корисно або потрібно. Ви можете зробити лише дві можливості:
1) Ви можете створити клас зі статичним методом для кожного примітивного масиву даних ( boolean, byte, short, int, long, char, float, double
повернення Iterable<
WrapperType >
. Ці методи використовуватимуть анонімні класи Iterator
(до того жIterable
), яким дозволяється містити посилання на аргумент містить метод (наприклад, an int[]
) як поле для реалізації методів.
-> Цей підхід є ефективним і економить вашу пам'ять (за винятком пам'яті новостворених методів, навіть якщо використання Arrays.asList()
забирає пам'ять так само)
2) Оскільки в масивах немає методів (як слід читати на стороні) ви пов’язані) вони також не можуть надати Iterator
примірник. Якщо ви справді лінуєтеся писати нові класи, ви повинні використовувати екземпляр вже існуючого класу, який реалізує, Iterable
оскільки іншого способу є, крім інстанції Iterable
або підтипу.
ТІЛЬКИ спосіб створення наявної реалізації похідної колекціїIterable
це використовувати цикл (за винятком використання анонімних класів, як описано вище) або інстанціювати Iterable
клас реалізації, конструктор якого допускає масив примітивних типів (бо Object[]
не дозволяє масиви з елементами примітивного типу), але наскільки я знаю, Java API не містить такого класу.
Причину циклу можна легко пояснити:
для кожної колекції вам потрібні об'єкти, а примітивні типи даних не є об'єктами. Об'єктів набагато більше, ніж примітивні типи, тому вони потребують додаткових даних, які необхідно генерувати для кожного елемента масиву примітивного типу. Це означає, що якщо два способи з трьох (використання Arrays.asList(T...)
або використання наявної колекції) вимагають сукупності об'єктів, вам потрібно створити для кожного примітивного значення вашогоint[]
масив об’єкта обгортки. Третій спосіб буде використовувати масив таким, який є, і використовувати його в анонімному класі, оскільки я вважаю, що це краще через швидку продуктивність.
Існує також третя стратегія, що використовує Object
як аргумент для методу, де ви хочете використовувати масив, Iterable
і для цього потрібно буде перевірити тип, щоб визначити, який тип має аргумент, однак я б не рекомендував його взагалі, як зазвичай потрібно врахуйте, що Об'єкт не завжди потрібний тип і вам потрібен окремий код для певних випадків.
На закінчення, це проблема проблемної системи Generic Type Java, яка не дозволяє використовувати примітивні типи як загальний тип, що дозволить заощадити багато коду, використовуючи простоArrays.asList(T...)
. Отже, вам потрібно запрограмувати для кожного масиву примітивних типів такий собі метод (який в основному не має ніякої різниці в пам'яті, що використовується програмою C ++, який створив би для кожного використовуваного аргументу типу окремий метод.