集合(4)-Map

1.Map集合概述和特点

* A:Map接口概述
* 查看API可以知道:
* 将键映射到值的对象
* 一个映射不能包含重复的键
* 每个键最多只能映射到一个值
* B:Map接口和Collection接口的不同
* Map是双列的,Collection是单列的
* Map的键唯一,Collection的子体系Set是唯一的

* Map集合的数据结构值针对键有效,跟值无关;Collection集合的数据结构是针对元素有效

2.Map集合的功能概述

* A:Map集合的功能概述
* a:添加功能
* V put(K key,V value):添加元素。
* 如果键是第一次存储,就直接存储元素,返回null
* 如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值
* b:删除功能
* void clear():移除所有的键值对元素
* V remove(Object key):根据键删除键值对元素,并把值返回
* c:判断功能
* boolean containsKey(Object key):判断集合是否包含指定的键
* boolean containsValue(Object value):判断集合是否包含指定的值
* boolean isEmpty():判断集合是否为空
* d:获取功能
* Set<Map.Entry<K,V>> entrySet():
* V get(Object key):根据键获取值
* Set<K> keySet():获取集合中所有键的集合
* Collection<V> values():获取集合中所有值的集合
* e:长度功能

* int size():返回集合中的键值对的个数

3.Map集合的遍历之键找值

* A:键找值思路:
* 获取所有键的集合
* 遍历键的集合,获取到每一个键
* 根据键找值
* B:案例演示

* Map集合的遍历之键找值

HashMap<String,Integer> hm=nwe HashMap<>();
hm.put("张三",23);
hm.put("李四",24);
/*
Set<String> keySet=hm.keySet(); //获取集合中所有的键
Iterator<String> it=keySet.iterator(); //获取迭代器
while(it.hasNext()){
  String key=it.next();  //获取集合中的每一个元素,其实就是双列集合中的键
Integer value=hm.get(key); //根据键获取值
System.out.println(key+"="+value);//打印键值对
}
*/
for(String key:hm.keySet()){//增强for循环迭代双列集合第一张方式
  System.out.println(key+"="+hm.get(key));
}

4.Map集合的遍历之键值对对象找键和值

* A:键值对对象找键和值思路:
* 获取所有键值对对象的集合
* 遍历键值对对象的集合,获取到每一个键值对对象
* 根据键值对对象找键和值
* B:案例演示

* Map集合的遍历之键值对对象找键和值

HashMap<String,Integer> hm=new HashMap<>();
hm.put("张三",23);
hm.put("李四",24);
/*
Set<Map.Entry<String,Integer>> entrySet=hm.entrySet();//获取所有的键值对象的集合
Iterator<Entry<String,Integer>> it=entrySet.iterator(); //获取迭代器
while(it.hasNext()){//获取键值对对象
  Entry<String,Integer> en=it.next();//根据键值对对象获取键
  Integer value=en.getValue(); //根据键值对对象获取值
System.out.println(key+"="+value);
}*/
for(Entry<String,Integer> en:hm.entrySet()){
  System.out.println(en.getKey()+"="+en.getValue());
}

5.LinkedHashMap的概述和使用

* A:案例演示
* LinkedHashMap的特点

* 底层是链表实现的可以保证怎么存就怎么取

	/**
	 * @param args
	 * LinkedHashMap可以保证怎么存就怎么取
	 */
	public static void main(String[] args) {
		LinkedHashMap<String, Integer> lhm = new LinkedHashMap<>();
		lhm.put("张三", 23);
		lhm.put("李四", 24);
		lhm.put("赵六", 26);
		lhm.put("王五", 25);
		
		System.out.println(lhm);
	}

6.TreeMap集合键是Student值是String的案例

* A:案例演示

* TreeMap集合键是Student值是String的案例

	/**
	 * * A:案例演示
	 * TreeMap集合键是Student值是String的案例
	 */
	public static void main(String[] args) {
		//demo1();
		TreeMap<Student, String> tm = new TreeMap<>(new Comparator<Student>() {

			@Override
			public int compare(Student s1, Student s2) {
				int num = s1.getName().compareTo(s2.getName());		//按照姓名比较
				return num == 0 ? s1.getAge() - s2.getAge() : num;
			}
		});
		tm.put(new Student("张三", 23), "北京");
		tm.put(new Student("李四", 13), "上海");
		tm.put(new Student("赵六", 43), "深圳");
		tm.put(new Student("王五", 33), "广州");		
		System.out.println(tm);
	}

7.统计字符串中每个字符出现的次数

* A:案例演示

* 需求:统计字符串中每个字符出现的次数

String str="aaaaaaaabbbbbccc";
char[] arr=str.toCharArray();//将字符串转换成字符数组
HashMap<Character,Integer> hm=new HashMap<>();//创建双列集合存储键和值
for(char c:arr){//遍历字符数组
  /*
  if(!hm.containsKey(c)){//如果不包含这个键
       hm.put(c,1); //就将键和值为1添加
   }else{ //如果包含这个键
      hm.put(c,hm.get(c)+1); //就将键和值再添加1添加进来
    }
    */
   Integer i=!hm.containsKey(c)?hm.put(c,1):hm.put(c,hm.get(c)+1);
}
for(Character key:hm.keySet()){
   System.out.println(key+"="+hm.get(key));
}

8.集合嵌套之HashMap嵌套HashMap

/**
	 * * A:案例演示
	 * 集合嵌套之HashMap嵌套HashMap
	 * 
	 * 需求:
	 * 双元课堂有很多基础班
	 * 第88期基础班定义成一个双列集合,键是学生对象,值是学生的归属地
	 * 第99期基础班定义成一个双列集合,键是学生对象,值是学生的归属地
	 * 
	 * 无论88期还是99期都是班级对象,所以为了便于统一管理,把这些班级对象添加到双元课堂集合中
	 */
	public static void main(String[] args) {
		//定义88期基础班
		HashMap<Student, String> hm88 = new HashMap<>();
		hm88.put(new Student("张三", 23), "北京");
		hm88.put(new Student("李四", 24), "北京");
		hm88.put(new Student("王五", 25), "上海");
		hm88.put(new Student("赵六", 26), "广州");
		
		//定义99期基础班
		HashMap<Student, String> hm99 = new HashMap<>();
		hm99.put(new Student("唐僧", 1023), "北京");
		hm99.put(new Student("孙悟空",1024), "北京");
		hm99.put(new Student("猪八戒",1025), "上海");
		hm99.put(new Student("沙和尚",1026), "广州");
		
		//定义双元课堂
		HashMap<HashMap<Student, String>, String> hm = new HashMap<>();
		hm.put(hm88, "第88期基础班");
		hm.put(hm99, "第99期基础班");
		
		//遍历双列集合
		for(HashMap<Student, String> h : hm.keySet()) {		//hm.keySet()代表的是双列集合中键的集合
			String value = hm.get(h);						//get(h)根据键对象获取值对象
			//遍历键的双列集合对象
			for(Student key : h.keySet()) {					//h.keySet()获取集合总所有的学生键对象
				String value2 = h.get(key);
				
				System.out.println(key + "=" + value2 + "=" + value);
			}
		}
		
	}

9.HashMap和Hashtable的区别

* A:面试题
* HashMap和Hashtable的区别
* Hashtable是JDK1.0版本出现的,是线程安全的,效率低,HashMap是JDK1.2版本出现的,是线程不安全的,效率高

* Hashtable不可以存储null键和null值,HashMap可以存储null键和null值

10.Collections工具类的概述和常见方法讲解

* A:Collections类概述
* 针对集合操作 的工具类
* B: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)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值