map的key可以重复吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了map的key可以重复吗相关的知识,希望对你有一定的参考价值。

map的key就相当于list的索引,是不可以重复的,
value当然没有限制,怎么着都行
你可以说说你现在遇到的情况,让大伙一起学习学习
参考技术A 不可以、、你调用的时候使用map.get("key"),如果key重复了,就不知道你取的是那个了。本回答被提问者和网友采纳

Map接口常用的子类

Map接口常用的子类:

HashMap: 无序存放的,是新的操作类,key值不允许重复

Hashtable: 无序存放的,是旧的操作类,key值不允许重复

TreeMap: 可以排序的Map集合,按集合中的key排序,key不允许重复

IdentityHashMap: key可以重复的Map集合

 

HashMap:

package com.map;

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class HashMapDemo01 {
    public static void main(String[] args) {
        Map<String,String> map = new HashMap<String,String>();
        map.put("ZY", "www.baidu.com");
        map.put("YQ", "www.google.com");
        map.put("LS", "www.360.com");
        /*String str = map.get("YQ");
        System.out.println(str);*/
        System.out.println(map.get("YQ"));
        
        if(map.containsKey("YQ")){
            System.out.println("搜索的key存在!");
        }else{
            System.out.println("搜索的key不存在!");
        }
        
        if(map.containsValue("www.google.com")){
            System.out.println("搜索的Value存在!");
        }else{
            System.out.println("搜索的Value不存在!");
        }
        
        Set<String> keys = map.keySet();
        Iterator<String> iter1 = keys.iterator();
        System.out.printf("输出所有的key:");
        while(iter1.hasNext()){
            System.out.printf(iter1.next()+"");
        }
        
        Collection<String> values = map.values();
        Iterator<String> iter2 = values.iterator();
        System.out.print("\\n输出所有的values:");
        while(iter2.hasNext()){
            System.out.printf(iter2.next()+"");
        }
    }

}

 

 从运行结果可以看出存放数据的时候没有进行排序

www.google.com
搜索的key存在!
搜索的Value存在!
输出所有的key:ZY、LS、YQ、
输出所有的values:www.baidu.com、www.360.com、www.google.com、

 

Hashtable:

package com.map;

import java.util.Collection;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class HashTableDemo01 {
    public static void main(String[] args) {
        Map<String,String> map = new Hashtable<String,String>();
        map.put("ZY", "www.baidu.com");
        map.put("YQ", "www.google.com");
        map.put("LS", "www.360.com");
        System.out.println(map.get("YQ"));
        
        if(map.containsKey("YQ")){
            System.out.println("搜索的key存在!");
        }else{
            System.out.println("搜索的key不存在!");
        }
        
        if(map.containsValue("www.google.com")){
            System.out.println("搜索的value存在!");
        }else{
            System.out.println("搜索的value不存在!");
        }
        
        Set<String> keys = map.keySet();
        Iterator<String> iter = keys.iterator();
        System.out.printf("输出所有的keys:");
        while(iter.hasNext()){
            System.out.printf(iter.next()+"");
        }
        
        Collection<String> values = map.values();
        Iterator<String> iter2 = values.iterator();
        System.out.printf("\\n输出所有的values:");
        while(iter2.hasNext()){
            System.out.printf(iter2.next()+"");
        }
    }

}

  从运行结果可以看出存放数据的时候没有进行排序

www.google.com
搜索的key存在!
搜索的value存在!
输出所有的keys:LS、ZY、YQ、
输出所有的values:www.360.com、www.baidu.com、www.google.com、

 

HashMap与Hashtable的区别:

序号 比较点 ArrayList Vector
1 推出时间 JDk1.2之后推出,属于新的操作类 JDK1.时推出的,属于旧的操作类
2 性能 采用异步处理方式,性能更高 采用同步处理方式,性能更低
3 线程安全 属于非线程安全的操作类 属于线程安全的操作类
4 输出 key或value允许保存null key或value不允许保存null

 

 

 

 

 

 

 TreeMap:最终保存在Map中的数据是经过排序的数据,按其key排序

package com.map;

import java.util.TreeMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class TreeMap {
    public static void main(String[] args) {
        Map<String,String> map = new TreeMap<String,String>();
        map.put("ZY", "www.baidu.com");
        map.put("YQ", "www.google.com");
        map.put("LS", "www.360.com");
        Set<String> keys = map.keySet();
        Iterator<String> iter = keys.iterator();
        
        while(iter.hasNext()){
            String str = iter.next();
            System.out.println(str+"-->"+map.get(str));
        }
    }

}

 

Iterator输出Map:

package com.map;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class IteratorMapDemo {
    public static void main(String[] args) {
        Map<String,String> map = new HashMap<String,String>();        //声明Map对象,并实例化Map对象
        map.put("ZY", "www.baidu.com");                               //添加内容
        map.put("YQ", "www.google.com");
        map.put("LS", "www.360.com");
        Set<Map.Entry<String, String>> allSet = map.entrySet();       //声明一个Set集合指定泛型,将Map接口实例变为Set接口实例
        Iterator<Map.Entry<String, String>> iter = allSet.iterator(); //声明Iterator对象,并实例化Iterator
        while(iter.hasNext()){ 
            
            Map.Entry<String, String> mp = iter.next();                //找到Map.Entry实例
            System.out.println(mp.getKey()+"-->"+mp.getValue());       //输出key、value、
            
        }
    }

}

 

ZY-->www.baidu.com
LS-->www.360.com
YQ-->www.google.com

 

Foreach输出Map:将集合中的每个元素通过Map.Entry类型的对象进行所接收,然后进行key与value的分离

package com.map;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

public class ForeachMapDemo {
    public static void main(String[] args) {
        Map<String,String> map = new HashMap<String,String>();        
        map.put("ZY", "www.baidu.com");                               
        map.put("YQ", "www.google.com");
        map.put("LS", "www.360.com");
        for(Entry<String, String> mp:map.entrySet()){
            System.out.println(mp.getKey()+"-->"+mp.getValue());
        }
    }

}

 

ZY-->www.baidu.com
LS-->www.360.com
YQ-->www.google.com

 

String-->Person的映射:

package com.map;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

class Person{
    private String name;
    private int age;
    
    public Person(String name,int age){
        this.name=name;
        this.age=age;
    }
    
    public String toString(){
        return "name:"+this.name+","+"age:"+this.age;
    }
    
}

public class String_PersonDemo {
    public static void main(String[] args) {
        Map<String,Person> map = new HashMap<String,Person>();
        map.put("YQ", new Person("QQ",20));
        map.put("ZY", new Person("PP",30));
        map.put("LS", new Person("HH",25));
        System.out.println(map.get("YQ"));
        
        Set<String> keys = map.keySet();
        Iterator<String> iter1 = keys.iterator();
        System.out.println("输出所有的person:");
        while(iter1.hasNext()){
            String str = iter1.next();
            System.out.println(map.get(str)+"");
        }
    }

}
name:QQ,age:20
输出所有的person:
name:PP,age:30、
name:HH,age:25、
name:QQ,age:20

 

Person-->String的映射:

package com.map;

import java.util.HashMap;
import java.util.Map;

class Person2{
    private String name;
    private int age;
    
    public Person2(String name,int age){
        this.name=name;
        this.age=age;
    }
    
    public String toString(){
        return "name:"+this.name+","+"age"+this.age;
    }
    
}

public class Person_StringDemo {
    public static void main(String[] args) {
        Map<Person2,String> map =new HashMap<Person2,String>();
        Person2 per = new Person2("YQ",20);
        map.put(per,"YQ");
        System.out.println(map.get(per));
    }

}
YQ

 

package com.map;

import java.util.HashMap;
import java.util.Map;

class Person3{
    private String name;
    private int age;
    
    public Person3(String name,int age){
        this.name=name;
        this.age=age;
    }
    
    public boolean equals(Object obj){          //覆写equals()方法
        if(this==obj){                          //判断地址是否相同
            return true;                        //返回true表示同一对象
        }
        if(!(obj instanceof Person3)){          //传递进来的不是本类的对象
            return false;                       //返回false表示不是同一类对象
        }
        
        Person3 p = (Person3) obj;              //向下转型
        if(this.name.equals(p.name) && this.age==p.age){//属性依次比较,相等返回true
            return true;
        }else{
            return false;                       //属性内容不相等返回false
        }
    }
    
    public int hashCode(){                      //覆写hashCode()方法
        return this.name.hashCode()*this.age;   //计算公式
    }
    
    public String toString(){                   //覆写toString()方法
        return "name:"+this.name+","+"age"+this.age;//返回信息
    }
    
}

public class Person_StringDemo02 {
    public static void main(String[] args) {
        Map<Person3,String> map =new HashMap<Person3,String>();
        Person3 per = new Person3("YQ",20);
        map.put(per,"YQ");
        System.out.println(map.get(per));
    }

}

 

YQ

 

IdentityHashMap:key值可以重复

package com.maps;
//key值可以重复的Map集合IdentityHashMap
import java.util.IdentityHashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

class Person{
    private String name;
    private int age;
    
    public Person(String name,int age){
        this.name=name;
        this.age=age;
    }
    
    public boolean equals(Object obj){
        if(this==obj){
            return true;
        }
        if(!(obj instanceof Person)){
            return false;
        }
        
        Person p = (Person) obj;
        if(this.name.equals(p.name)&&this.age==p.age){
            return true;
        }else{
            return false;
        }
    }
    
    public int hashCode(){
        return this.name.hashCode()*this.age;
    }
    
    public String toString(){
        return "name:"+this.name+","+"age"+this.age;
    }
    
}

public class IdentityHashMapdemo01 {
    public static void main(String[] args) {
        Map<Person,String> map =new IdentityHashMap<Person,String>();//只要地址不相同,Key1!=key2,就表示不是相同的key
        /*Map<Person,String> map =new HashMap<Person,String>();    HashMap(),key1=key2则会被覆盖*/
        map.put(new Person("YQ",20),"1");
        map.put(new Person("YQ",20),"2");
        map.put(new Person("QQ",22),"3");
        map.put(new Person("PP",20),"4");
        
        Set<Map.Entry<Person, String>> allSet = map.entrySet();
        Iterator<Map.Entry<Person, String>> iter = allSet.iterator();
        while(iter.hasNext()){
            Map.Entry<Person, String> p = iter.next();
            System.out.println(p.getKey()+","+p.getValue());
        }
        
    }

}

 

name:QQ,age22,3
name:YQ,age20,2
name:PP,age20,4
name:YQ,age20,1

 

认真看过此篇的小伙伴,如果对你有收获,请点击旁边的小手推荐一下,如果有误,欢迎指正,谢谢!

版权声明:此篇为本人原创,转载请标明出处https://www.cnblogs.com/YQian/p/10880654.html

我的博客园地址:https://www.cnblogs.com/YQian/

 

以上是关于map的key可以重复吗的主要内容,如果未能解决你的问题,请参考以下文章

java map key可以重复吗

java map的key可以重复吗

java map key可以重复吗

java map的key可以重复吗

unordered map的key能重复么

java 有没有一个集合可以存放重复的key和value