Java集合之Map超详细讲解

Map集合

1. HashMap集合

Map集合没有继承Collection接口,其提供的是键到值的映射。Map不能包含相同的键,每个键只能映射一个值。键还决定了储存对象在映射中的储存位置。

HashMap集合特点:单一,无序

Map.Entry<K,V>
映射项(键-值对)K=key,V=value

异常:

  1. NoSuchElementException-----当调用的映射中没有元素存在时
  2. ClassCastException-------对象与映射中的元素不兼容时
  3. NullPointerException-------如果试图使用映射不允许使用的null对象时
  4. UnsupportedOperationException-----当试图改变一个不允许修改的映射时

常用方法:
在这里插入图片描述
总结一下:

  • 添加功能:V put (K key,V value)
  • 获取功能:V get(Object key), Set< K > keySet(), Collection< V> values(), int size()
  • 判断功能:boolean containsKey(object key),boolean containsValue(Object value),boolean isEmpty()
  • 删除功能:void clear(),V remove(Object key)
  • 遍历功能:Set<Map.Entry<K,V>> entrySet()

黑体为重点讲解方法


1.1添加功能

import java.util.HashMap;


class Test{
	public static void main(String []args) {
		
		
		HashMap<String, String> map = new HashMap<>();
		
		System.out.println(map.put("ABC001", "Kevin"));
		System.out.println(map.put("ABC002", "Lily"));
		System.out.println(map.put("ABC001", "Clack"));  //此处Key与第一个重复!!
	
		
		System.out.println(map);		
	}
}

Output:

null
null
Kevin
{ABC001=Clack, ABC002=Lily}

上述代码,由此可见,添加功能:V put (K key,V value),就是将key映射到value,如果key存在,则覆盖value,并将原来的value返回


1.2获取功能(Value):


import java.util.Collection;
import java.util.HashMap;


class Test{
	public static void main(String []args) {
		
		
		HashMap<String, String> map = new HashMap<>();
		map.put("ABC001", "Kevin");
		map.put("ABC002", "Lily");
		map.put("ABC001", "Clack");
		map.put("ABC003", "Bob");
		map.put("ABC004", "Zombie");

		//Collection<V> values()
		Collection<String> values=map.values();
		for(String value: values) {
			System.out.println(value);
		}
	}
}

Output:

Clack
Lily
Bob
Zombie

Collection< V> values()获取到所有Value的值


1.2获取功能(Key):

import java.util.HashMap;
import java.util.Set;


class Test{
	public static void main(String []args) {
		
		
		HashMap<String, String> map = new HashMap<>();
		map.put("ABC001", "Kevin");
		map.put("ABC002", "Lily");
		map.put("ABC001", "Clack");
		map.put("ABC003", "Bob");
		map.put("ABC004", "Zombie");

		//Set<K> keySet()
		Set<String> keys = map.keySet();
		for(String key: keys) {
			System.out.println(key);
		}
	}
}

Output:

ABC001
ABC002
ABC003
ABC004

Set< K> keySet()以Set的形式返回所有的key


1.3遍历功能(一):

获取每一个Key,通过Key来找Value

import java.util.HashMap;
import java.util.Set;


class Test{
	public static void main(String []args) {
		
		
		HashMap<String, String> map = new HashMap<>();
		map.put("ABC001", "Kevin");
		map.put("ABC002", "Lily");
		map.put("ABC001", "Clack");
		map.put("ABC003", "Bob");
		map.put("ABC004", "Zombie");

		//获取所有key
		Set<String> keys = map.keySet(); 
		for(String key: keys) {
		     //通过Key来找Value
			String value = map.get(key); 
			System.out.println("ID:"+key+"--Name: "+value);
		}
	}
}

Output:

ID:ABC001--Name: Clack
ID:ABC002--Name: Lily
ID:ABC003--Name: Bob
ID:ABC004--Name: Zombie

1.3遍历功能(二):

通过(entry)中间人Set<Map.Entry<K,V>> entrySet() 来寻找Key和Value

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


class Test{
	public static void main(String []args) {
		
		
		HashMap<String, String> map = new HashMap<>();
		map.put("ABC001", "Kevin");
		map.put("ABC002", "Lily");
		map.put("ABC001", "Clack");
		map.put("ABC003", "Bob");
		map.put("ABC004", "Zombie");
        
		//获取所有中间人entrys
		Set<Map.Entry<String, String>> entrys =map.entrySet();
		//遍历所有entrys用Map.Entry<String, String>类型的entry接收
		for(Map.Entry<String, String> entry:entrys) {
			String key = entry.getKey();
			String value = entry.getValue();
			
			System.out.println("ID:"+key+"--Name: "+value);
		}
		}
	}


Output:

ID:ABC001--Name: Clack
ID:ABC002--Name: Lily
ID:ABC003--Name: Bob
ID:ABC004--Name: Zombie

1.4放入自定义类型数据

注意⚠️,如果要放入自定义类型的数据当作key,一定要重写hashcode()和equals()防止重复。

2.HashTable与HashMap关联

HashTable出现在JDK1.0, 线程安全,因为不能存入null类型数据
HashMap出现在JDK1.5,线程不安全,因为能存入null

3. LinkedHashMap集合

用法跟HashMap基本一致,它是基于链表和哈希表结构的所以具有存取有序,键不重复的特性,存的顺序和遍历出来的顺序是一致的

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;


class Test{
	public static void main(String []args) {
		
		
		LinkedHashMap<String, String> map = new LinkedHashMap<>();
		map.put("ABC001", "Kevin");
		map.put("ABC003", "Lily");
		map.put("ABC001", "Clack");
		map.put("ABC002", "Bob");
		map.put("ABC004", "Zombie");
        
		//获取所有中间人entrys
		Set<Map.Entry<String, String>> entrys =map.entrySet();
		//遍历所有entrys用Map.Entry<String, String>类型的entry接收
		for(Map.Entry<String, String> entry:entrys) {
			String key = entry.getKey();
			String value = entry.getValue();
			
			System.out.println("ID:"+key+"--Name: "+value);
		}
		}
	}


Output:

ID:ABC001--Name: Clack
ID:ABC003--Name: Lily
ID:ABC002--Name: Bob
ID:ABC004--Name: Zombie

4.TreeMap集合

TreeMap与TreeSet类似,都需要重写比较器(外部比较器+内部比较器)
TreeMap集合特点:单一,有序

下面举例,外部比较器与匿名对象类结合

import java.util.Comparator;
import java.util.Map.Entry;
import java.util.TreeMap;

public class Test {
    public static void main(String[] args) {
        
        TreeMap<Student,String> map = new TreeMap<>(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                if (o1 == o2){
                    return 0;
                }
                int result = o1.getAge() - o2.getAge();
                if (result == 0){
                    return o1.getName().compareTo(o2.getName());
                }
                return result;
            }
        });
        
        map.put(new Student("A", 12), "JAVA");
        map.put(new Student("C", 50), "IOS");
        map.put(new Student("D", 32), "JS");
        map.put(new Student("B", 32), "PHP");
        map.put(new Student("E", 12), "C++");
        
        
        for (Entry<Student,String> entry : map.entrySet()){
            System.out.println(entry.getKey()+"==="+entry.getValue());
        }
        
    }
}

Output:

 Student [name=A, age=12]===JAVA
Student [name=E, age=12]===C++
Student [name=B, age=32]===PHP
Student [name=D, age=32]===JS
Student [name=C, age=50]===IOS

注意⚠️:
1.存入的时候添加了两个张三,如果Map中键相同的时候,当后面的值会覆盖掉前面的值
2.TreeMap 取出来的顺序是经过排序的,是根据compara方法排序的
3.新建的比较器对象应传入TreeMap中,该段代码中,用匿名对象new comparator< Student>(){……}传入TreeMap<Student,String> map = new TreeMap<>()最后的括号内,即TreeMap<Student,String> map = new TreeMap<>(new comparator< Student>(){……重写的compare方法……});

内部比较器与TreeMap结合的例子,请看TreeSet有关例子
(https://blog.csdn.net/weixin_44551646/article/details/94898951)。

  • 5
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值