欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Map接口

程序员文章站 2022-05-13 09:35:30
1.Map集合1)Map集合的特点1.Map 双列集合(key,value) key和value的数据类型可同2.key不许重复,value可以重复且一一对应2)Map集合常用方法/*1.public V put(K key, V value): 返回值:v key不重复,返回null key重复,返回被替换的value */ Map...

1.Map接口

1)Map接口的特点

1.双列集合

2.key不可重复 value可重复

2)Map接口常用方法

		1.public V put(K key, V value): 
		  return:V  key不重复,返回null
                    key重复,返回被替换的value  
                    
        2.public V remove(Object key): 
          return:V  key不存在,返回null
                    key存在,返回被删除的value               
     
        3.public V get(Object key) 
          return: 
                    key不存在,返回null
                    key存在,返回对应的value值               
    
        4.boolean containsKey(Object key) 

        Map<String,String> map = new HashMap<>();
        map.put("李晨", "范冰冰1");//v1:null      
        map.put("李晨", "范冰冰2");//v2:范冰冰1        
        //此时集合中{李晨=范冰冰2}
        map.put("冷锋","龙小云");
        map.put("杨过","小龙女");
        map.put("尹志平","小龙女");
        //此时集合中{杨过=小龙女, 尹志平=小龙女, 李晨=范冰冰2, 冷锋=龙小云}

        String v1 = map.remove("李晨");//v1:范冰冰2            
        String v2 = map.remove("林俊杰");//v2:null
   
        String v3 = map.get("杨过");//v3:小龙女
        String v4 = map.get("迪丽热巴");//v4:null   

        boolean b1 = map.containsKey("杨过");//b1:true
        boolean b2 = map.containsKey("赵颖");//b2:false

注意

int V = map.remove("1");

自动拆箱,返回的Value赋值给V
v是数字的时候可以,vnull则报NullPointerException

3)Map接口的遍历方法①键找值

键找值:—需要借助2个Map接口中的方法

		public Set< K > keySet() //返回map中所有的key到一个set集合中
		public V get(Object key) //返回对应的value

Map接口

        //创建Map集合对象,准备使用map中的方法
        Map<String,Integer> map = new HashMap<>();
        map.put("赵丽颖",168);
        map.put("杨颖",165);
        map.put("林志玲",178);

        //1.使用keySet(),提取所有的key,一下子存到set集合中 
        Set<String> set = map.keySet();
        
        //2.遍历set集合,一步步得到其中所有key
        for(String key : set){ //set也可以直接写成 map.keySet()
            //3.使用get(key),找到value    
            Integer value = map.get(key);
            System.out.println(key+"="+value);
        }

		//2.遍历set集合,一步步得到其中所有key
        Iterator<String> it = set.iterator();
        while (it.hasNext()){
            String key = it.next();
            //3.使用get(key),找到value    
            Integer value = map.get(key);
            System.out.println(key+"="+value);
        }
        
      	林志玲=178
		赵丽颖=168
		杨颖=165

4)Map接口的遍历方法②Entry

Entry:—需要借助2个Map接口中的方法
Map.Entry是Map声明的一个内部接口,定义为Entry<K,V>

  public Set<Map.Entry<K,V>> entrySet() 返回map中所有的键值对对象到一个set集合中
  
  public interface Map<K, V>{ 
        interface Entry<K, V> {  //Entry将键值对的对应关系封装成了对象
            K getKey();//获取Entry对象中的键。
            V getValue();//获取Entry对象中的值。
            }
  }

Map接口

        //创建Map集合对象,准备使用map中的方法
        Map<String,Integer> map = new HashMap<>();
        map.put("赵丽颖",168);
        map.put("杨颖",165);
        map.put("林志玲",178);


        // 1.使用entrySet(),提取所有的Entry对象,一下子存到set集合中
        Set<Map.Entry<String, Integer>> set = map.entrySet();

        // 2.遍历set集合,一步步得到其中所有Entry对象
        Iterator<Map.Entry<String, Integer>> it = set.iterator();
        while(it.hasNext()){
            Map.Entry<String, Integer> entry = it.next();
            
            //3.使用Entry对象中的方法getKey()和getValue()获取键与值
            String key = entry.getKey();
            Integer value = entry.getValue();
            
            System.out.println(key+"="+value);
        }
       
        for(Map.Entry<String,Integer> entry:set){
            //3.使用Entry对象中的方法getKey()和getValue()获取键与值
            String key = entry.getKey();
            Integer value = entry.getValue();
            System.out.println(key+"="+value);
        }
        
		林志玲=178
		赵丽颖=168
		杨颖=165

2.HashMap

1)HashMap集合特点

public class HashMap<K,V> implements Map<K,V> 
  • HashMap底层由哈希表实现:数组+单向链表或红黑树(链表的长度超过8): (哈希表结构查询都非常快)
  • hashMap无序集合 多线程
 public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>

2)HashMap存储自定义键值类型

作为键key必须保证唯一性

<String,Person>分析:

  • key:String类型,系统重写String类hashCode方法和equals方法,保证了key唯一性
  • value:Person类型 value可以重复

        HashMap<String,Person> map = new HashMap<>();
        map.put("北京",new Person("张三",18));
        map.put("上海",new Person("李四",19));
        map.put("广州",new Person("王五",20));
        map.put("北京",new Person("赵六",18));
        //字符串重写了hashCode和equals方法,所以张三key北京重复被替换了
              
        Set<String> set = map.keySet();
        for (String key : set) {
            Person value = map.get(key);
            System.out.println(key+"-->"+value);
        }
        
    	上海-->Person{name='李四', age=19}
		广州-->Person{name='王五', age=20}
		北京-->Person{name='赵六', age=18}   
		 

<Person,String>分析:

  • key:Person类型,Person类必须重写hashCode方法和equals方法,来保证key唯一性
  • value:String类型 value可以重复
        HashMap<Person,String> map = new HashMap<>();
        map.put(new Person("女王",18),"英国");
        map.put(new Person("秦始皇",18),"秦国");
        map.put(new Person("普京",30),"俄罗斯");
        map.put(new Person("女王",18),"毛里求斯");
        
        Set<Map.Entry<Person, String>> set = map.entrySet();
        for (Map.Entry<Person, String> entry : set) {
            Person key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key+"-->"+value);
        }

	 public class Person {
		 @Override
   		 public boolean equals(Object o) {
        	if (this == o) return true;
        	if (o == null || getClass() != o.getClass()) return false;
        	Person person = (Person) o;
        	return age == person.age &&
                	Objects.equals(name, person.name);
    	}

    	@Override
    	public int hashCode() {
        	return Objects.hash(name, age);
    	}
 	}

		Person{name='女王', age=18}-->毛里求斯
		Person{name='秦始皇', age=18}-->秦国
		Person{name='普京', age=30}-->俄罗斯
		

3)LinkedHashMap集合特点

public class LinkedHashMap<K,V> extends HashMap<K,V>
哈希表+链表 有序


		HashMap<String,String> map = new HashMap<>();
        map.put("a","a");
        map.put("c","c");
        map.put("b","b");
        map.put("a","d");
        System.out.println(map);// key不允许重复,无序 {a=d, b=b, c=c}

        LinkedHashMap<String,String> linked = new LinkedHashMap<>();
        linked.put("a","a");
        linked.put("c","c");
        linked.put("b","b");
        linked.put("a","d");
        System.out.println(linked);// key不允许重复,有序 {a=d, c=c, b=b}
        

4)Hashtable与HashMap

public class Hashtable<K,V> implements Map<K,V>

		HashMap<String,String> map = new HashMap<>();
        map.put(null,"a");
        map.put("b",null);
        map.put(null,null);
        System.out.println(map);//{null=null, b=null}

		//Hashtable不能和null扯上关系
        Hashtable<String,String> table = new Hashtable<>();
        table.put(null,"a");//NullPointerException
        table.put("b",null);//NullPointerException
        table.put(null,null);//NullPointerException
  • Hashtable的子类Properties依然活跃( IO流))

3.of方法一次性添加

三者都是实现了of

  • static < E > List< E > of( ){E… elements}
  • static < E > Set< E > of(){E… elements}
  • static <K, V> Map<K, V> of( ){E… elements}
 		
 		List<String> list = List.of("a", "b", "a", "c", "d");
        System.out.println(list);//[a, b, a, c, d]
        1.'of返回一个不能变的集合,集合不能再使用add,put方法添加元素,会抛出异常'
        list.add("w");//UnsupportedOperationException:不支持操作异常
		
		2.'Set接口和Map接口在调用of方法的时候,不能有重复的元素,否则会抛出异常'
        Set<String> set = Set.of("a", "b", "a", "c", "d");//IllegalArgumentException:非法参数异常,有重复的元素
        Set<String> set = Set.of("a", "b", "c", "d");
        System.out.println(set);
		
		3.'of仅适用于List Set Map 本身,不适用于接口的实现类'
		ArrayList<String> list1 = ArrayList.of("a", "b", "a", "c", "d");  
		    

本文地址:https://blog.csdn.net/weixin_40285319/article/details/110440510

相关标签: JAVA