Map的常用方法,应用以及工具

一.集合框架Map介绍

先看看专业说法
Map的常用方法,应用以及工具_第1张图片
本人理解:
map集合中存放的都是一组组映射关系
(可以理解为结婚证,一夫一妻制 key对应着value)

二.map集合中的特别方法的理解(put,entrySet,keySet)

常用方法
Map的常用方法,应用以及工具_第2张图片

代码解释:

package com.wxm.map;

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

/**
 * 三个map集合中特别的方法
 * 1.put
 *      新增的作用
 *      覆盖/修改(当容器中已经存在key,再次存放,那么会覆盖原来的--值的唯一性 理解记忆)
 *      调用此方法可以获取原来key对于的值
 *          案列:
 *          主播刷平台
 *      
 *       
 * 2.entryset
 *   
 * 3.keyset
 *    这两个方法是map集合中特有的遍历方法
 *  HashMap是无序,集合底层是set集合做的
 *  
 *     HashMap 数据结构 哈希表
 *     TreeMap 数据结构  二叉树
 *       能够进行自然排序
 *    
 *    map集合是不继承collection的
 *      就意味着它不能具备迭代器 方法
 * @author wxm
 *
 */
public class MapDemo {
public static void main(String[] args) {
	Map map=new HashMap<>();
	map.put("zs", 12);
	map.put("wanting", 18);
	map.put("xiaopei", 22);
	map.put("yigui", 16);
	map.put("xiaomei", 19);
	map.put("xiaomei", 59);
	
	Object old=map.put("xiaomei", 10);
	System.out.println("可以查看到原来的值"+old);
	map.put("yuanyuan", 18);
	//System.out.println(map);
	/**
	 * HashMap的两种遍历方式:
	 * 
	 * 区别:
	 * 
	 */
	
	//1.通过Map.entrySet遍历key和value:推荐,尤其是容量大时
	
	Set> entrySet=map.entrySet();
     for (Entry entry : entrySet) {
		System.out.println("key:"+entry.getKey()+".value:"+entry.getValue());
	}
     //2.通过Map.keySet遍历key和value;根据键取值(普遍使用,二次取值)

//   Set keyset=map.keySet();
//   for (Object key : keyset) {
//	System.out.println("key:"+key+",value:"+map.get(key));//注意是map.get()根据键得到值
//}
}
}
 
  

最后效果
Map的常用方法,应用以及工具_第3张图片

三、集合框架Map应用

在JavaSE中,对Map的实现主要包括: HashMap, TreeMap, HashTable 和 LinkedHashMap
****这次案列讲解HashMap 与TreeMap

1.HashMap

package com.wxm.map;

import java.util.Comparator;
import java.util.HashMap;
import java.util.Set;
import java.util.TreeMap;

/**HashMap
 * 应用一: 
 * 1、将学生作为键,地址作为值进行存储,名字年龄相同则被认定为一个人,最后输出 
 * 	思路:
 * 		a、封装学生类
 * 		b、判重(hashCode/equals)
 * 		c、打印
 * 2、最后按年龄进行排序 
 * 		a、需要让学生类自身具备比较性,实现Comparable接口
 * 3、需求改变、按姓名进行排序
 * 		改变的代码是不可取的,我们需要新增个比较器来完成需求
 * 		实现java.util.comparator
 * 
 * @author wxm
 *
 */
public class HashMapDemo {
     public static void main(String[] args) {
    //   HashMap map=new HashMap<>(); 
       TreeMap map=new TreeMap<>(new StuNameComp());
       map.put(new Student("zs", 19), "shanghai");
       map.put(new Student("xiaopei", 19), "beijing");
       map.put(new Student("xiapmei", 13), "shanghai");
       map.put(new Student("lisi", 35), "tianjin");
       map.put(new Student("lisi", 35), "tianjin");                                               
       Set keySet=map.keySet();
       for (Object key : keySet) {
		 System.out.println(key);
	}
	}
}
class StuNameComp implements Comparator{

	@Override
	public int compare(Student o1, Student o2) {
	int num=o1.getName().compareTo(o2.getName());
	if(num==0) {
		return o1.getAge()-o2.getAge();
	}
		return num;
	}
	
}


class Student implements Comparable{
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	@Override
	public String toString() {//方便查看
		return "Student [name=" + name + ", age=" + age + "]";
	}
	public Student() {
		super();
	}
	@Override
	public int hashCode() {
		return this.name.hashCode()+this.age;
	}
	
	@Override
	public boolean equals(Object obj) {
		Student stu=(Student) obj;
		return this.name.equals(stu.name)&&this.age==stu.age;
	}
/*
*重写比较器
*/
	@Override
	public int compareTo(Student o) {
		int num=this.age-o.age;
		if(num==0) {//当年龄相等时
			this.name.compareTo(o.name);//进行名字比较
		}
		return num;
	}
}

Map的常用方法,应用以及工具_第4张图片

2.TreeMap

package com.wxm.map;

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

/**
 * 统计字符串字符出现的次数
 * sadfafjdfdfijjfmfldm
 * @author wxm
 *a(?),b(?)...z(?)
 *
 *思路:
 *1.我们需要把字符a-z当作键key,把次数作为值value,
 *也就是说我们需要创建一个map集合来做这些事情
 *2.需要将待处理的字符串转成字符数组以便于获取map集合的key
 *3.如果将字符(a)第一出现 的时候,就给a对应key映射值value赋值为1
 *    如果说该字符在次出现,那么就是value+1
 *4.打印出a-z说明要对key排序
 *    
 *    
 *    
 *    
 *    面试题    String,StringBuffer,StringBuilder三者的区别?
 *    String a=new String("abc");
 *    String b="abc";
 *    a+="de";
 *    StringBuffer sb1=new StringBuffer("abc");
 *    StringBuilder sb2=new StringBuilder("abc");
 *    sb1.append("de");
 *    sb2.append("de");
 *    
 *    StringBuffer与StringBuilder的区别?
 *    StringBuffer  同步 安全
 *    StringBuilder 异步 不安全
 */
public class TreeMapDemo {
public static void main(String[] args) {
	String str="sadfafjdfdfijjfmfldm";
//	Mapmap=new HashMap<>();
	//最后进行排序
	Mapmap=new TreeMap<>();
	
	char [] charArray=str.toCharArray();
	for (char c : charArray) {
		Integer obj=map.get(c);
		if(obj==null) {
		//之前没有出现过,第一次出现	
			map.put(c, 1);
		}else {
		//之前这个字符已经出现过
			map.put(c, ++obj);
		}
	}
	StringBuilder sb=new StringBuilder();
	Set> entrySet=map.entrySet();
	for (Entry entry : entrySet) {
		sb.append(entry.getKey()+"("+entry.getValue()+")");
	}
	System.out.println(sb);
}
}

Map的常用方法,应用以及工具_第5张图片

三.集合框架工具类(Collections、Arrays)

API中的方法


sort(List list) ;
sort(List list, Comparator c) ;
二分搜索法搜索指定元素的位置
如果搜索键包含在列表中,则返回搜索键的索引;否则返回 (-(插入点) - 1))

binarySearch(List> list, T key) ;
binarySearch(List list, T key, Comparator c) ;
替换集合中的所有元素

fill(List list, T obj) ;
替换集合中的某一个元素;

replaceAll(List list, T oldVal, T newVal) ;
反转元素顺序

reverse(List list);
 强行逆转了排序(Comparable、Comparator)规则
 
reverseOrder() ;
reverseOrder(Comparator cmp) ;
指定置换与随机置换(扑克牌)

swap(List list, int i, int j);
交换集合中指定元素索引的位置

shuffle(List list) ;
将有规则的一组数据打乱成无规则数据。

我的代码理解

package com.wxm.map;

import java.util.Arrays;

/**
 * 集合框架工具类(Collections.Arrays)
 * @author wxm
 *
 */
public class UtilDemo {
  public static void main(String[] args) {
	int array[]= {1231,78,99,13};
	System.out.println(array);
	//[I@6d06d69c
//二分搜索法...
	//提供了许多便利数组查询的方法
	System.out.println(Arrays.toString(array));
}
}

效果:[I@6d06d69c [1231, 78, 99, 13]

Arrays
1、数组转为集合的好处和不足
好处:可以使用集合的思想和方法操作数组中的元素。
不足:因为数组的长度是固定的,所以,数组转为集合后,不能使用集合的增加、删除方法。若使用增加、删除,则会报错误(UnsupportedOperationException).
注意:
如果数组中的元素是对象,那么转为集合时,数组中的元素直接转为集合中的元素;
如果数组中的元素都是基本数据类型,那么,会将该数组作为集合中的元素。
补充:集合转为数组,要注意转成后数组的长度!!!
2、那为什么要将集合转为数组呢?
当然是为了限定元素的操作,不需要进行增加、删除啦!
3、指定类型的数组长度怎么定义呢?
当指定类型的数组长度小于集合的size时,该方法内部会创建一个新的数组,长度为集合的size;
当指定类型的数组长度大于集合的size时,是使用传递进来的数组,直接创建一个刚刚好的数组最好。

你可能感兴趣的:(我的第一课,后端,面试题)