2010-04-08 4 views
1

Примитивные типы не допускаются в ArrayList, source. Частичное решение: вы можете обернуть prim.types, например int, в Integer, чтобы сформировать дополнительный класс, но побочный эффект. Я хочу индексировать данные, есть ли какой-то заменитель ArrayList, который допускает примитивные типы?Java: заменить ArrayList cos примитивными типами, недопустимыми в ArrayList?

+0

Один побочный эффект заключается в том, что класс Wrapper может быть «null». Я не уверен, как это интерпретируется с помощью autoboxing, поэтому убедитесь, что оно не дает числовое значение toString(). –

ответ

3

Какую версию Java вы используете?

С 1,5 автобоксинга эта проблема спорная.

Вы можете сделать это:

List<Integer> x = Arrays.asList(1, 2, 3); 

x.get(0) == 1; // this is true **WARNING** comments have pointed out this only works for Integers -128 to 127 due to integer caching. Use .equals 

int foo = x.get(1); // this doesn't need a cast 

x.add(4); // this doesn't need to be wrapped 
+0

Предполагая, что OP использует современную версию Java, это действительно единственный ответ. – Etaoin

+0

используя 1.5, можете ли вы привести рабочий пример? поэтому у вас есть класс «Integer Integer {int i;} для Integer в« List »? – hhh

+1

@HH нет, целое (оболочка) уже существует: (java.lang.Integer) вот простой рабочий пример: http: //stackoverflow.com/questions/2602038/java-substitute-for-arraylist-cos-primitive-types-not-allowed-in-arraylist/2602228#2602228 – OscarRyz

0

Есть ли какая-то замена для ArrayList, которая допускает примитивные типы?

К сожалению, нет. Дженерики в Java не поддерживают использование параметров примитивного типа. Параметр type должен быть классом.

Необходимо использовать один из классов-оберток, например Integer, чтобы включить значения, которые первоначально были сохранены в примитивном типе.

0

Да пишите свое собственное воплощение. java.util.ArrayList имеет объект [] внутри. Вы пишете примитивные Список_массивы что-то вроде

MyIntArrayList имеющего ИНТА []

MyFloatArrayList, имеющий поплавок []

и т.д.,

В самом деле, вы можете скопировать всю реализацию JFC из ArrayList и измените Object [] на примитивный массив. Конечно, вы хотели бы удалить все дженерики и множество сложных/общих проверок, но основная логика остается такой же, как копия массива, рост размера массива и т. Д.,

0

Обобщения на Java и структура коллекции также работают на объектах, а не на примитивах. Мне любопытно, почему использование объектных версий (таких как Long и Integer) недостаточно для ваших нужд. Это связано с проблемами производительности?

0

Там нет структуры данных, которая делает именно то, что вы спрашиваете. Есть ли причина, по которой вы против использования классов-оболочек, таких как Character или Integer? Конечно, если вы просто хотите эффективно индексировать данные, вы всегда можете использовать базовый массив, например int[].

Вы можете также использовать сторонние библиотеки, см: Java Vector or ArrayList for Primitives

0

Если вы используете Java> 1.5, вы можете просто использовать Autoboxing, и все будет работать без проблем. В других случаях, вы можете использовать классы из Commons Primitives, как ArrayIntList

0

Он не поддерживает примитивы напрямую, но вы все равно можете использовать их благодаря «autoboxing»

Работа образца:

import java.util.List; 
import java.util.ArrayList; 

public class TestInt { 
    public static void main(String [] args) { 

     List<Integer> index = new ArrayList<Integer>(); 

     index.add(100); 
     index.add(200); 
     index.add(300); 

     boolean b; 

     b = index.contains(100); 
     System.out.println(b);// prints true 

     b = index.contains(60); 
     System.out.println(b);// prints false. 
    } 
} 

Итак, вы должны не нужно заменить.

Но если вы по-прежнему настаивают на том, вы можете использовать: Apache commons primitives но видеть Pyrolistical предупреждение

+0

Я бы не стал информировать людей об общих примитивах. Это действительное решение Java, которое должны использовать только эксперты. – Pyrolistical

+0

@ Пиролистическое, как получилось? – OscarRyz

+2

Это сторонняя библиотека, поэтому публичная библиотека классов не предназначена для этого, и вы вводите дополнительные накладные расходы для чтения кода. Вторые люди склонны думать, что OMG это быстрее, поэтому я буду использовать это только! Они преждевременно оптимизируются, и самая быстрая вещь, как правило, относится к самой простой вещи. Код не для компьютеров, чтобы работать быстро, код для людей, чтобы читать и понимать. Используйте стандартные библиотеки, и кто знает в будущем, возможно, JVM неожиданно улучшит производительность коллекции. Но вы не получите этого, если используете сторонние библиотеки. – Pyrolistical

0

Если вы не ограничены конкретной реализации, таких как ArrayList, вы можете найти trove library ПОЛЕЗНЫЕ.

В нем реализованы все базовые коллекции java, но с примитивными типами данных внутри.

1

Используйте, например, коллекции, предоставленные GNU Trove. Они имеют специализированные реализации для всех примитивных типов. В частности, для этих примитивных типов это много/быстрее/чем Java, в основном потому, что они не требуют бокса и распаковки и используют меньше памяти.

Смежные вопросы