programing

Java에서 HashMap 객체와 Map 객체의 차이점은 무엇입니까?

prostudy 2022. 6. 21. 22:27
반응형

Java에서 HashMap 객체와 Map 객체의 차이점은 무엇입니까?

제가 만든 다음 지도의 차이점은 무엇입니까(다른 질문에서는 사람들이 서로 다른 것처럼 보이는 맵을 사용하여 대답했는데, 어떻게 다른지 궁금하네요).

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

오브젝트 간에 차이는 없습니다.HashMap<String, Object>두 경우 모두.오브젝트에 대한 인터페이스에는 차이가 있습니다.첫 번째 경우 인터페이스는 다음과 같습니다.HashMap<String, Object>반면 두 번째는Map<String, Object>그러나 기본 객체는 동일합니다.

사용의 장점Map<String, Object>기본 객체를 사용하는 코드와의 계약을 위반하지 않고 다른 종류의 맵으로 변경할 수 있습니다.라고 선언하면HashMap<String, Object>기본 구현을 변경하려면 계약을 변경해야 합니다.


예제:내가 이 수업을 쓴다고 가정해 보자.

class Foo {
    private HashMap<String, Object> things;
    private HashMap<String, Object> moreThings;

    protected HashMap<String, Object> getThings() {
        return this.things;
    }

    protected HashMap<String, Object> getMoreThings() {
        return this.moreThings;
    }

    public Foo() {
        this.things = new HashMap<String, Object>();
        this.moreThings = new HashMap<String, Object>();
    }

    // ...more...
}

클래스에는 (액세서메서드를 통해) 서브클래스와 공유하는 string-> 객체의 내부 맵이 몇 개 있습니다.예를 들어, 다음과 같이 씁니다.HashMap일단은요.왜냐하면,그것이수업을작성할때적절한구조라고생각하기때문입니다.

나중에, Mary는 그것을 하위 분류하는 코드를 작성합니다.둘 다 해야 할 일이 있어things그리고.moreThings그래서 자연스럽게 그녀는 그것을 일반적인 방법으로 하고, 그녀는 내가 사용한 것과 같은 타입을 사용한다.getThings/getMoreThings방법을 정의할 때:

class SpecialFoo extends Foo {
    private void doSomething(HashMap<String, Object> t) {
        // ...
    }

    public void whatever() {
        this.doSomething(this.getThings());
        this.doSomething(this.getMoreThings());
    }

    // ...more...
}

나중에 생각해보면, 사실, 내가 이걸 쓰는게 낫다고 생각해.TreeMap대신HashMapFoo. 업데이트 합니다.Foo,변화하는HashMap로.TreeMap.지금이다,SpecialFoo계약을 파기했기 때문에 컴파일을 할 수 없게 되었습니다.Foo그것이 제공했다고 말하곤 했다HashMaps, 하지만 현재는TreeMaps대신.그래서 우리는 고쳐야 한다.SpecialFoo(이러한 것은 코드 베이스를 통해 퍼질 수 있습니다)

공유해야 할 정당한 이유가 없는 한 내 구현에서 사용하는 것은HashMap(그런 일이 벌어진다) 내가 했어야 할 일은 그 사실을 선언하는 것이었다.getThings그리고.getMoreThings막 돌아온 것처럼Map<String, Object>더 이상 구체적으로 설명하지 않고요.사실 다른 일을 해야 할 정당한 이유가 없다면Foo나는 아마도 선언해야 할 것 같습니다things그리고.moreThings~하듯이Map,것은 아니다.HashMap/TreeMap:

class Foo {
    private Map<String, Object> things;             // <== Changed
    private Map<String, Object> moreThings;         // <== Changed

    protected Map<String, Object> getThings() {     // <== Changed
        return this.things;
    }

    protected Map<String, Object> getMoreThings() { // <== Changed
        return this.moreThings;
    }

    public Foo() {
        this.things = new HashMap<String, Object>();
        this.moreThings = new HashMap<String, Object>();
    }

    // ...more...
}

사용 방법에 주의해 주세요.Map<String, Object>가능한 한 모든 곳에서 사용할 수 있습니다. 실제 개체를 만들 때만 구체적으로 설명하면 됩니다.

만약 내가 그랬다면 메리는 이렇게 했을 것이다.

class SpecialFoo extends Foo {
    private void doSomething(Map<String, Object> t) { // <== Changed
        // ...
    }

    public void whatever() {
        this.doSomething(this.getThings());
        this.doSomething(this.getMoreThings());
    }
}

...그리고 변화Foo하지 못했을 것이다SpecialFoo컴파일을 정지합니다.

인터페이스(및 기본 클래스)는 필요한 만큼만 공개하고 필요에 따라 변경할 수 있도록 유연성을 유지합니다.일반적으로는, 가능한 한 레퍼런스를 기본으로 하고 싶다고 생각하고 있습니다.우리가 알 필요가 없다면HashMap, 라고 부르면 됩니다.Map.

이것은 맹목적인 규칙은 아니지만, 일반적으로 가장 일반적인 인터페이스에 대한 코딩은 보다 구체적인 것에 대한 코딩보다 덜 취약합니다.내가 그걸 기억했다면, 난 그런 걸 만들지 않았을 거야FooSpecialFoo만약 메리가 그걸 기억했다면, 내가 망쳤더라도Foo입니다 , 녀는는 , 。MapHashMap 의 변화된 ★★★★★★★★★★★★★★★★★★★★★.Foo의 계약은 그녀의 코드에 영향을 주지 않았을 것입니다.

그럴 수 없을 때도 있고, 구체적으로 말해야 할 때도 있어요.단, 특별한 이유가 없는 한 특정하지 않은 인터페이스로 에러를 발생시킵니다.

은 HashMap에서 구현되는 인터페이스입니다.차이점은 두 번째 구현에서는 HashMap에 대한 참조가 맵인터페이스에 정의된 함수만 사용할 수 있는 반면 첫 번째 구현에서는 HashMap(맵인터페이스 포함)의 퍼블릭함수를 사용할 수 있다는 것입니다.

Sun의 인터페이스 튜토리얼을 읽으시면 더 이해가 될 것 같습니다.

enter image description here

Map에는 다음과 같은 구현이 있습니다.

  1. 해 、Map m = new HashMap();

  2. 링크드 해시 맵Map m = new LinkedHashMap();

  3. 맵 리리Map m = new TreeMap();

  4. WeakHashMapMap m = new WeakHashMap();

1개의 메서드를 작성했다고 합니다(이것은 단순한 의사 코드입니다).

public void HashMap getMap(){
   return map;
}

프로젝트 요건이 변경된다고 가정합니다.

  1. 메서드는 내용을 to return 、 Need Return 메 the the 。 반환해야 합니다.HashMap
  2. 해야 합니다. 반환 유형을 변경해야 합니다.HashMap로로 합니다.LinkedHashMap
  3. 는 맵. 해야 합니다. 반환 유형을 변경해야 합니다.LinkedHashMap로로 합니다.TreeMap

가 「」를 , .Mapinterface,.getMap()방법을 지정합니다.

하는 대신 "Java"를 하십시오.Map코드 재사용성을 향상시키고 요건 변경의 영향을 줄입니다.

그냥 정답 댓글로 하려고 했는데 너무 펑키해졌어요(줄 끊기가 싫어요)

아, 그래서 차이점은 일반적으로 맵에는 특정 메서드가 관련되어 있다는 것입니다.그러나 해시맵과 같이 맵을 작성하거나 다른 방법이 있습니다.이러한 다른 방법들은 모든 맵이 가지고 있는 고유한 메서드를 제공합니다.

정확합니다.또한 가능한 한 일반적인 인터페이스를 항상 사용하고 싶다고 생각하고 있습니다.Array List와 Linked List를 검토합니다.사용방법에 큰 차이가 있지만 "목록"을 사용하면 쉽게 전환할 수 있습니다.

실제로 이니셜라이저의 오른쪽을 보다 역동적인 문장으로 대체할 수 있습니다.이런 건 어때?

List collection;
if(keepSorted)
    collection=new LinkedList();
else
    collection=new ArrayList();

이렇게 하면 삽입 정렬로 컬렉션을 채울 경우 링크된 목록을 사용할 수 있습니다(배열 목록에 삽입 정렬하는 것은 범죄입니다.그러나 정렬할 필요가 없고 추가만 하는 경우에는 Array List를 사용합니다(다른 작업에서는 더 효율적입니다).

컬렉션이 최고의 예가 아니기 때문에 이 작업은 상당히 복잡하지만, OO 디자인에서 가장 중요한 개념 중 하나는 인터페이스 정면을 사용하여 동일한 코드로 서로 다른 개체에 액세스하는 것입니다.

댓글에 대한 응답 편집:

아래의 지도 코멘트에 대해서는, 「맵」인터페이스를 사용하는 경우는, Map에서 HashMap으로 컬렉션을 캐스트 하지 않는 한, 이러한 메서드만을 사용할 수 있습니다(이것은 완전히 목적에 어긋납니다).

대부분의 경우 객체를 만들고 특정 유형(HashMap)을 사용하여 "만들기" 또는 "초기화" 메서드로 입력합니다. 그러나 이 메서드는 더 이상 HashMap으로 조작할 필요가 없는 "맵"을 반환합니다.

덧붙여서 캐스팅을 해야 하는 경우는, 잘못된 인터페이스를 사용하고 있거나, 코드가 충분히 구조화되어 있지 않은 경우가 있습니다.코드의 한 부분은 "해시맵"으로 취급하는 반면 다른 부분은 "맵"으로 취급하는 것은 허용되지만, 이는 "아래로" 흘러야 하므로 캐스팅을 할 수 없습니다.

또, 인터페이스에 의해서 나타나는 역할의 반신반의 측면도 주의해 주세요.LinkedList는 양호한 스택 또는 큐를 만들고 ArrayList는 양호한 스택을 만들지만 끔찍한 큐(다시 말해 삭제하면 목록 전체가 이동한다) 때문에 LinkedList는 큐인터페이스를 구현하지만 ArrayList는 구현하지 않습니다.

TJ Crowder와 Adamski가 지적한 바와 같이, 1개의 레퍼런스는 인터페이스에 관한 것이며, 이제1개는 인터페이스의 특정 실장에 관한 것입니다.Joshua Block에 따르면 기본 구현에 대한 변경 사항을 보다 효과적으로 처리할 수 있도록 항상 인터페이스에 대한 코드화를 시도해야 합니다. 즉, HashMap이 갑자기 솔루션에 적합하지 않아 맵 구현을 변경해야 할 경우 맵 인터페이스를 사용하여 인스턴스화 유형을 변경할 수 있습니다.

Map은 의 정적 유형이며 HashMap은 맵의 동적 유형입니다.즉, 컴파일러는 실행 시에도 맵 오브젝트의 서브 타입을 가리킬 수 있지만 맵 오브젝트를 맵 타입의 하나로 취급합니다.

이러한 실장이 아닌 인터페이스에 대한 프로그래밍을 실시하면 유연성을 유지할 수 있다는 이점이 있습니다.예를 들어 맵의 하위 유형(예: Linked Hash Map)인 경우 런타임에 맵의 동적 유형을 대체하고 맵의 동작을 즉시 변경할 수 있습니다.

API 수준에서 가능한 추상적인 상태를 유지하는 것이 좋습니다.예를 들어 프로그래밍 중인 메서드가 맵에서 동작해야 하는 경우 파라미터를 보다 엄격한(추상적이지 않기 때문에) 해시맵 유형이 아닌 맵으로 선언하는 것으로 충분합니다.이렇게 하면 API의 소비자는 메서드에 전달할 Map 구현의 종류를 유연하게 결정할 수 있습니다.

는 "지도" 입니다.Map 에 의해서 입니다.HashMap의 (「」를 참조)Map이 인터페이스는 오브젝트가 키를 값에 매핑하고 다양한 조작을 지원한다는 계약입니다(예:put,get)의 실장에 대해서는 기재되어 있지 않습니다.Map a (a) (a)HashMap를 참조해 주세요.

으로 두 을 「」를 않기 됩니다.Map【API】【API】

상위 투표의 답변과 "더 일반적이고 더 나은"을 강조하는 위의 답변에 더하여, 나는 조금 더 파고들고 싶다.

Map은 '구조계약'입니다.HashMap는 다양한 실제 문제에 대처하기 위한 독자적인 방법을 제공하는 실장입니다.인덱스의 계산 방법, 용량과 증가 방법, 삽입 방법, 인덱스의 고유성 유지 방법 등입니다.

소스코드에 대해 알아보겠습니다.

»Map.containsKey(Object key):

boolean containsKey(Object key);

Java Doc:

boolean java.displaces.Map.contains Value(객체값)

이 맵이 하나 이상의 키를 지정된 값에 매핑하면 true를 반환합니다.이에 값 " "에 되어 있는 합니다.v(value==null ? v==null : value.equals(v))이 조작에서는 대부분의 맵인터페이스 실장에서는 맵사이즈로 시간직선이 필요할 수 있습니다.

파라미터: 값

이 맵 내의 존재 여부를 검증하는 값

반환: true

이 맵이 1개 이상의 키를 지정된 에 매핑하는 경우

value Throws:

ClassCastException - 값이 이 맵에 적합하지 않은 유형인 경우(옵션)

특수한 포인터예외 - 지정된 값이 늘이고 이 맵에서 늘 값을 허용하지 않는 경우(옵션)

실장하려면 실장이 필요하지만, 「방법」은 자유이며, 올바르게 되돌릴 수 있도록 하는 것 뿐입니다.

»HashMap:

public boolean containsKey(Object key) {
    return getNode(hash(key), key) != null;
}

보니, ★★★★★★★★★★★★★★★★★★.HashMap는 해시 코드를 사용하여 맵에 키가 포함되어 있는지 여부를 테스트합니다.해시 알고리즘의 장점이 있습니다.

동일한 맵을 만듭니다.

하지만 그 차액은 언제 사용하실 수 있습니다.첫 번째 케이스에서는 특별한 HashMap 메서드를 사용할 수 있으며(그러나 실제로 유용한 사람은 기억나지 않습니다), HashMap 파라미터로 전달할 수 있습니다.

public void foo (HashMap<String, Object) { ... }

...

HashMap<String, Object> m1 = ...;
Map<String, Object> m2 = ...;

foo (m1);
foo ((HashMap<String, Object>)m2); 

맵은 인터페이스, 해시맵은 맵인터페이스를 구현하는 클래스입니다.

맵은 인터페이스, 해시맵은 이를 구현하는 클래스입니다.

이 구현에서는 동일한 개체를 만듭니다.

HashMap은 Map의 구현이기 때문에 거의 동일하지만 참조 가이드에서 볼 수 있는 "clone()" 메서드가 있습니다.)

HashMap<String, Object> map1 = new HashMap<String, Object>();
Map<String, Object> map2 = new HashMap<String, Object>();  

★★★★★★★★★★★★★★★.Map는, 「-」라고 하는 다른 입니다.HashMap,TreeHashMap,LinkedHashMapetc.는 구현합니다. 인터페이스는 구현 클래스의 슈퍼 클래스처럼 작동합니다. OOP 'OOP'를 구현하는 Map는 입니다.Map 것이든 해서 넣을 수 이에요.HashMapMap이치

는 ''를 붙일 수 요.map1로로 합니다.map2 없이 - 이터터 without without without without without -

map2 = map1

언급URL : https://stackoverflow.com/questions/1348199/what-is-the-difference-between-the-hashmap-and-map-objects-in-java

반응형