十一、Java之Map集合(1)

1 Map集合

1.1 Map集合概述

Map集合的一个最大的特点,就是它可以存储键值对的元素。
将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。

1.2 Map与Collection的区别

Map的键唯一,类似于Collection的set集合
Map的值可重复,类似于Collection的List集合

 * Map集合和Collection集合的区别?
 * 		Map集合存储元素是成对出现的,Map集合的键是唯一的,值是可重复的。可以把这个理解为:夫妻对
 * 		Collection集合存储元素是单独出现的,Collection的儿子Set是唯一的,List是可重复的。可以把这个理解为:光棍(11.11)

1.3 Map集合的功能概述

 * Map集合的功能概述:
 * 1:添加功能
 * 		V put(K key,V value):添加元素。这个其实还有另一个功能?先不告诉你,等会讲
 * 			如果键是第一次存储,就直接存储元素,返回null
 * 			如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值
 * 2:删除功能
 * 		void clear():移除所有的键值对元素
 * 		V remove(Object key):根据键删除键值对元素,并把值返回
 * 3:判断功能
 * 		boolean containsKey(Object key):判断集合是否包含指定的键
 * 		boolean containsValue(Object value):判断集合是否包含指定的值
 * 		boolean isEmpty():判断集合是否为空
 * 4:获取功能
 * 		Set<Map.Entry<K,V>> entrySet():???
 * 		V get(Object key):根据键获取值
 * 		Set<K> keySet():获取集合中所有键的集合
 * 		Collection<V> values():获取集合中所有值的集合
 * 5:长度功能
 * 		int size():返回集合中的键值对的对数

1.4 Map获取功能

/*
 * 获取功能:
 * V get(Object key):根据键获取值
 * Set<K> keySet():获取集合中所有键的集合
 * Collection<V> values():获取集合中所有值的集合
 */
public class MapDemo2 {
	public static void main(String[] args) {
		// 创建集合对象
		Map<String, String> map = new HashMap<String, String>();

		// 创建元素并添加元素
		map.put("邓超", "孙俪");
		map.put("黄晓明", "杨颖");
		map.put("周杰伦", "蔡依林");
		map.put("刘恺威", "杨幂");

		// V get(Object key):根据键获取值
		System.out.println("get:" + map.get("周杰伦"));
		System.out.println("get:" + map.get("周杰")); // 返回null
		System.out.println("----------------------");

		// Set<K> keySet():获取集合中所有键的集合
		Set<String> set = map.keySet();
		for (String key : set) {
			System.out.println(key);
		}
		System.out.println("----------------------");

		// Collection<V> values():获取集合中所有值的集合
		Collection<String> con = map.values();
		for (String value : con) {
			System.out.println(value);
		}
	}
}

1.5 Map集合遍历

在这里插入图片描述

A:键找值
	a:获取所有键的集合
	b:遍历键的集合,得到每一个键
	c:根据键到集合中去找值

B:键值对对象找键和值
	a:获取所有的键值对对象的集合
	b:遍历键值对对象的集合,获取每一个键值对对象
	c:根据键值对对象去获取键和值
	
代码体现:
	Map<String,String> hm = new HashMap<String,String>();
	
	hm.put("it002","hello");
	hm.put("it003","world");
	hm.put("it001","java");
	
	//方式1 键找值
	Set<String> set = hm.keySet();
	for(String key : set) {
		String value = hm.get(key);
		System.out.println(key+"---"+value);
	}
	
	//方式2 键值对对象找键和值
	Set<Map.Entry<String,String>> set2 = hm.entrySet();
	for(Map.Entry<String,String> me : set2) {
		String key = me.getKey();
		String value = me.getValue();
		System.out.println(key+"---"+value);
	}

1.6 HashMap

HashMap:是基于哈希表的Map接口实现。
哈希表的作用是用来保证键的唯一性的。

1.7 LinkedHashMap

LinkedHashMap:是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。

  • 由哈希表保证键的唯一性
  • 由链表保证键盘的有序(存储和取出的顺序一致)

1.8 TreeMap

TreeMap:是基于红黑树的Map接口的实现。

案例:

  1. 统计一个字符串中每个字符出现的次数
public class E {
    public static void main(String[] args) {
    	// 定义一个字符串(可以改进为键盘录入)
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();

        char[] chs = str.toCharArray();
        //定义一个TreeMap,使得字符能按指定顺序输出,这里由于Character中已经重写了Comparator接口,所以可以直接使用默认的自然排序
        TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>();
/*        Map<Character, Integer> map = new TreeMap<>(new Comparator<Character>() {
            @Override
            public int compare(Character o1, Character o2) {
                return o1-o2;
            }
        });*/
        for (int i = 0; i < chs.length; i++){
            if (map.containsKey(chs[i])){
                Integer ii = map.get(chs[i])+1;
                map.put(chs[i], ii);
            }else {
                map.put(chs[i],1);
            }
        }

        StringBuilder sb = new StringBuilder();
        Set<Character> set= map.keySet();
        for (Character ch : set){
            sb.append(ch).append("(").append(map.get(ch)).append(")");
        }
        System.out.println(sb);

    }
}
  1. 集合的嵌套遍历
    a:HashMap嵌套HashMap
    b:HashMap嵌套ArrayList
    c:ArrayList嵌套HashMap
    d:多层嵌套

1.9 面试题

/*
 * 1:Hashtable和HashMap的区别?
 * Hashtable:线程安全,效率低。不允许null键和null值
 * HashMap:线程不安全,效率高。允许null键和null值
 * HashMap就是用来替代HashTable的
 * 
 * 2:List,Set,Map等接口是否都继承子Map接口?
 * List,Set不是继承自Map接口,它们继承自Collection接口
 * Map接口本身就是一个顶层接口
 */
public class HashtableDemo {
	public static void main(String[] args) {
		// HashMap<String, String> hm = new HashMap<String, String>();
		Hashtable<String, String> hm = new Hashtable<String, String>();

		hm.put("it001", "hello");
		// hm.put(null, "world"); //NullPointerException
		// hm.put("java", null); // NullPointerException

		System.out.println(hm);
	}
}

2 Collections工具类

2.1 Collections概述

 * Collections:是针对集合进行操作的工具类,都是静态方法。
 * 
 * 面试题:
 * Collection和Collections的区别?
 * Collection:是单列集合的顶层接口,有子接口List和Set。
 * Collections:是针对集合操作的工具类,有对集合进行排序和二分查找的方法

2.2 Collections功能概述

 * 要知道的方法
 * public static <T> void sort(List<T> list):排序 默认情况下是自然顺序。
 * public static <T> int binarySearch(List<?> list,T key):二分查找
 * public static <T> T max(Collection<?> coll):最大值
 * public static void reverse(List<?> list):反转
 * public static void shuffle(List<?> list):随机置换

2.3 Collections对集合排序

两种参数形式:

public static <T extends Comparable<? super T>> void sort(List<T> list) {
    list.sort(null);
}
public static <T> void sort(List<T> list, Comparator<? super T> c) {
    list.sort(c);
}

举个例子:

// 排序
// 自然排序
Collections.sort(list);
// 比较器排序
// 如果同时有自然排序和比较器排序,以比较器排序为主
Collections.sort(list, new Comparator<Student>() {
	@Override
	public int compare(Student s1, Student s2) {
		int num = s2.getAge() - s1.getAge();
		int num2 = num == 0 ? s1.getName().compareTo(s2.getName())
				: num;
		return num2;
	}
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值