2010-12-09 2 views
6

Я хочу создать сопоставление, которое принимает значение String как ключ и примитив как значение. Я смотрел документы Java и не видел, что Primitive был типом класса, или что они разделяли какой-то класс упаковки.Java-сопоставления и примитивы

Как я могу сдержать значение как примитив?

Map<String, Primitive> map = new HashMap<String, Primitive>();

+0

Это была моя ошибка за то, что она неясна. Я говорю, что хочу ограничить значение как примитивный тип. Я хочу, чтобы я разрешил использовать любой из примитивных типов в качестве значения в этой конкретной карте. – Prospero 2010-12-09 15:23:40

ответ

7

Java Autoboxing позволяет создавать карты на Long, Integer, Double, а затем управлять ими с использованием примитивных значений. Например:

java.util.HashMap<String, Integer> map = new java.util.HashMap<String, Integer>(); 
map.put("one", 1); // 1 is an integer, not an instance of Integer 

Если вы хотите хранить в одной карте различных примитивных типов, вы можете его сделать Map<String, Number>. Позволяет хранить значения BigDecimal, BigInteger, Byte, Double, Float, Integer, Long, ShortAtomicLong, AtomicInteger).

Вот пример:

Map<String, Number> map = new HashMap<String, Number>(); 

map.put("one", 1); 
map.put("two", 2.0); 
map.put("three", 1L); 

for(String k:map.keySet()) { 
    Number v = map.get(k); 
    System.err.println(v + " is instance of " + v.getClass().getName() + ": " + v); 
} 
2

Вы можете сделать следующее:

Map<String, Integer> map = new HashMap<String, Integer>() 

Тогда операции, как:

map.put("One", 1); 

будет работать. Примитив 1 будет автоматически упакован в Integer. Точно так же:

int i = map.get("One"); 

также будет работать, потому что Integer получит автоматическое распакованный в int.

Ознакомьтесь с некоторыми документами по autoboxing and autounboxing.

+1

«Карта» - это интерфейс. – khachik 2010-12-09 15:10:40

+0

Карта - это интерфейс. – 2010-12-09 15:11:18

+0

@khacik, исправлено. Спасибо что подметил это. – jjnguy 2010-12-09 15:11:20

2

Каждый примитив имеет класс обертки, например java.lang.Long для long.

Таким образом, вы можете сопоставить класс обертке String и, если вы используете Java 1.5+, просто положить примитивы на карте:

Map<String, Integer> map = new HashMap<String, Integer>(); 
map.put("key", 10); 
int value = map.get("key"); // value is 10. 
1

Вы могли бы использовать их в штучной упаковке аналог.

Map<String,Integer> map = new HashMap<String,Integer>(); 

Целое число является неизменным коробчатым типом примитива int. Существуют аналогичные типы Short, Long, Double, Float и Byte boxed.

0

Вы не можете использовать примитив как ключ или значение в интерфейсе Map. Вместо этого вы можете использовать классы Wrapper, например Integer, Character, Boolean и так далее.

Подробнее о wiki.

4

Google для "Java Primitive Maps", и вы найдете некоторые специализированные типы, которые позволяют избежать необходимости Autoboxing.Примером этого является: https://labs.carrotsearch.com/hppc.html

Однако в целом вы должны делать все возможное с помощью автобоксинга, как указано в других ответах.

1

Если вам нужно, чтобы значение было примитивным по соображениям производительности, вы можете использовать TObjectIntHashMap или аналогичный.

например.

TObjectIntHashMap<String> map = new TObjectIntHashMap(); 

map.put("key", 10); 
int value = map.get("key"); 

Одно из отличий с Map < String, Integer> является то, что значения типа Int примитивным, а не объект Integer.

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