HashMap을 초기화하는 올바른 방법과 HashMap이 다른 값 유형을 보유 할 수 있습니까?
그래서 HashMap
Java의 s에 대해 두 가지 질문이 있습니다 .
초기화하는 올바른 방법은 무엇입니까
HashMap
? 내 상황에서 다음을 사용하는 것이 가장 좋습니다.HashMap x = new HashMap();
그러나 Eclipse는 계속해서 다음을 사용한다고 제안합니다.
HashMap<something, something> map = new HashMap();
어떤게 더 좋아?
HashMap
다른 유형의 객체 / 데이터 유형을 값 으로 보유 할 수 있습니까 ? 예를 들어, 이것이 작동하고 괜찮을까요?map.put("one", 1); map.put("two", {1, 2}); map.put("three", "hello");
첫 번째에서는
put()
anint
값을, 두 번째는 anint[]
, 세 번째는 문자열을 원합니다 .HashMap
s를 사용 하여 Java에서 수행해도 됩니까? 또한 ?HashMap
안에 값 을 저장해도 괜찮HashMap
습니까?
실제로 필요한 유형 안전의 종류에 따라 다릅니다. 비 일반적인 방법은 다음과 같이 가장 잘 수행됩니다.
Map x = new HashMap();
참고 x
A와 입력됩니다 Map
. 이렇게하면 향후 구현 (a TreeMap
또는 a로 LinkedHashMap
) 을 훨씬 쉽게 변경할 수 있습니다.
제네릭을 사용하여 특정 수준의 유형 안전성을 보장 할 수 있습니다.
Map<String, Object> x = new HashMap<String, Object>();
Java 7 이상에서는 다음을 수행 할 수 있습니다.
Map<String, Object> x = new HashMap<>();
위의 내용은 더 자세하지만 컴파일러 경고를 피합니다. 이 경우의 내용이 HashMap
하나가 될 수있는 Object
이 될 수 있도록, Integer
, int[]
, 등 당신이하고있는 일이다.
아직 Java 6을 사용하는 경우 Guava Libraries (직접 수행하기는 쉽지만)에는 newHashMap()
.NET 작업을 수행 할 때 일반 입력 정보를 복제 할 필요 가없는 메서드 가 있습니다 new
. 변수 선언에서 유형을 유추합니다 (이는 Java 7 이전 생성자에서 사용할 수없는 Java 기능입니다).
그건 그렇고, 당신이 int 또는 다른 프리미티브를 추가하면 Java는 그것을 자동 박싱합니다. 이는 코드가 다음과 동일 함을 의미합니다.
x.put("one", Integer.valueOf(1));
HashMap
as a 값을 another에 확실히 넣을 수 HashMap
있지만 재귀 적으로 수행하면 문제가 있다고 생각합니다 (즉, HashMap
as 값을 그 자체에 넣습니다 ).
이것은 Java 1.5에서 변경된 사항입니다. 첫 번째로 나열한 것은 이전 방식이고 두 번째는 새로운 방식입니다.
HashMap을 사용하면 다음과 같은 작업을 수행 할 수 있습니다.
HashMap<String, Doohickey> ourMap = new HashMap<String, Doohickey>();
....
Doohickey result = ourMap.get("bob");
지도에 유형이없는 경우 다음을 수행해야합니다.
Doohickey result = (Doohickey) ourMap.get("bob");
정말 유용합니다. 버그를 잡아 내고 모든 종류의 추가 캐스트를 작성하지 않도록 도와줍니다. 1.5 (이상)에서 가장 좋아하는 기능 중 하나였습니다.
여전히 맵에 여러 항목을 넣을 수 있으며 맵으로 지정한 다음 모든 객체를 넣을 수 있습니다 (문자열, 다른 맵 및 정수, 그리고 원하는 경우 세 개의 MyObject).
Eclipse는 HashMap의 유형을 선언 할 것을 권장합니다. 이는 유형 안전성을 강화하기 때문입니다. 물론 두 번째 부분에서 형식 안전을 피하려는 것처럼 들립니다.
후자를 수행하려면 map을 HashMap<String,Object>
.
작성하는 방식은 다음과 같습니다.
HashMap<Object, Object> map = new HashMap<Object, Object>();
대괄호 안에 들어가는 것은 오류 검사를 수행 할 수 있도록 HashMap에 넣을 내용을 컴파일러와 통신하는 것입니다. Object, Object가 실제로 원하는 것이라면 (아마도 아닐 것입니다) 명시 적으로 선언해야합니다. 일반적으로 컴파일러의 오류 검사를 용이하게하려면 선언을 최대한 명시 적으로 작성해야합니다. 설명하신 내용은 다음과 같이 선언되어야합니다.
HashMap<String, Object> map = new HashMap<String, Object>();
그렇게하면 적어도 키가 문자열이 될 것이라고 선언하지만 값은 무엇이든 될 수 있습니다. 가치를 되 찾을 때 캐스트를 사용하는 것을 잊지 마십시오.
두 번째는 Java 1.5와 함께 제공된 제네릭을 사용하는 것입니다. 코드의 캐스트 수를 줄이고 런타임 대신 컴파일 타임에 오류를 포착하는 데 도움이 될 수 있습니다. 즉, 코딩하는 내용에 따라 다릅니다. 다양한 유형의 몇 가지 개체를 포함하는 빠르고 더러운지도에는 제네릭이 필요하지 않습니다. 그러나지도가 Object 이외의 유형에서 내려 오는 모든 객체를 보유하고 있다면 그만한 가치가 있습니다.
지도의 배열에 대한 이전 포스터가 올바르지 않습니다. 배열은 실제로 객체이므로 유효한 값입니다.
Map<String,Object> map = new HashMap<String,Object>();
map.put("one",1); // autoboxed to an object
map.put("two", new int[]{1,2} ); // array of ints is an object
map.put("three","hello"); // string is an object
또한 HashMap은 객체이므로 HashMap의 값이 될 수도 있습니다.
A HashMap can hold any object as a value, even if it is another HashMap. Eclipse is suggesting that you declare the types because that is the recommended practice for Collections. under Java 5. You are free to ignore Eclipse's suggestions.
Under Java 5, an int (or any primitive type) will be autoboxed into an Integer (or other corresponding type) when you add it to a collection. Be careful with this though, as there are some catches to using autoboxing.
Eclipse is suggesting you to define generic type
so that you can have type safety
. You can write
Map m = new HashMap();
which does not ensure type safety but following will ensure type safety
Map<Object,Object> = new HashMap<Object,Object>();
The Object
can be any type such as String
, Integer
etc.
In answer to your second question: Yes a HashMap can hold different types of objects. Whether that's a good idea or not depends on the problem you're trying to solve.
That said, your example won't work. The int value is not an Object. You have to use the Integer wrapper class to store an int value in a HashMap
Map.of
literals
As of Java 9, there is yet another way to instantiate a Map
. You can create an unmodifiable map from zero, one, or several pairs of objects in a single-line of code. This is quite convenient in many situations.
For an empty Map
that cannot be modified, call Map.of()
. Why would you want an empty set that cannot be changed? One common case is to avoid returning a NULL where you have no valid content.
For a single key-value pair, call Map.of( myKey , myValue )
. For example, Map.of( "favorite_color" , "purple" )
.
For multiple key-value pairs, use a series of key-value pairs. ``Map.of( "favorite_foreground_color" , "purple" , "favorite_background_color" , "cream" )`.
If those pairs are difficult to read, you may want to use Map.of
and pass Map.Entry
objects.
Note that we get back an object of the Map
interface. We do not know the underlying concrete class used to make our object. Indeed, the Java team is free to used different concrete classes for different data, or to vary the class in future releases of Java.
The rules discussed in other Answers still apply here, with regard to type-safety. You declare your intended types, and your passed objects must comply. If you want values of various types, use Object
.
Map< String , Color > preferences = Map.of( "favorite_color" , Color.BLUE ) ;
'Programing' 카테고리의 다른 글
CoreData 레코드의 재정렬을 구현하는 방법은 무엇입니까? (0) | 2020.11.24 |
---|---|
Zend Framework에서 이메일 템플릿을 어떻게 만들 수 있습니까? (0) | 2020.11.24 |
git : 두 커밋 사이에 변경된 모든 파일 표시 (0) | 2020.11.24 |
자식 복제 후 분기가 표시되지 않습니다. (0) | 2020.11.24 |
CSS에서 상수를 정의 할 수 있습니까? (0) | 2020.11.24 |