目录
一、Map集合概述
⬇特点&遍历方式
特点:无序、以键值对的形式存储元素,键不能重复,值可以重复
- 遍历方式:keySet entrySet
源代码:
package com.hemingxiang.Map; import java.util.HashMap; import java.util.Hashtable; import java.util.Map; import java.util.Map.Entry; import java.util.Set; /** * Map集合特点 * @author Administrator * */ public class Demo1 { public static void main(String[] args) { Map<String, Integer> map=new HashMap<>(); //以键,值对的形式存储 map.put("a", 1); map.put("b", 2); map.put("c", 3); map.put("d", 4); map.put("e", 5); System.out.println(map); //删除 Object remove = map.remove("b"); System.out.println(map+"\t删除为第"+remove+"位"); //修改 同样调用put方法 map.put("c", 32); System.out.println(map); //查询 单个 System.out.println("查询单个"+map.get("c")); //查询所有 特点二 //1.先拿到map集合中所有的key Set key = map.keySet();//拿到所有键 //将key遍历 for (Object obj : key) { System.out.println("键"+obj+"值"+map.get(obj)); } System.out.println("----------------------------------"); //2.拿到映射关系 Set<Entry<String,Integer>> entrySet = map.entrySet(); for (Entry<String, Integer> entry : entrySet) { System.out.println("键"+entry.getKey()+"值"+entry.getValue()); } } }
源码运行效果:
⬇Map接口和Collection接口的不同
- Map是双列的(是双列集合的根接口),Collection是单列的(是单列集合的根接口)
- Map的键唯一,Collection的子体系Set是唯一的
- Map集合的数据结构值针对键有效,跟值无关;如:TreeMap:键是用二叉树算法,HashMap:键是hash算法, Collection集合的数据结构是针对元素有效
⬇HashMap与Hashtable之间的区别
HashMap非同步(V put(k key, v value)) 线程不安全
Hashtable同步(public synchonized V put(k key, v value)) 线程安全 同步既排队
二、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():获取集合中 * int size():返回集合中的键值对的个数所有值的集合
⬇案例:统计字符串各字母出现的次数
源代码:
package com.hemingxiang.Map;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
/**
* 案例
* @author Administrator
*
*/
public class Demo2 {
public static void main(String[] args) {
//统计字符串各字母出现的次数
String str="sjfjlujkpfmjwpkjmslpls";
/**
* 思路:
* 1.字符串切割,得到字符数组
* 2.遍历,拿到单个字符,如果该字符没有出现过,即value值为null那么该字符为key,值初始化为1
* 3.如果已经出现过,则拿到原来的值+1
*
* debugger:调式代码
* 1.打断点
* 2.采用debugger的方式运行程序
* 3.进入调式窗口(左上方step over调式箭头,快捷键F6)
* 4.接下来可以通过F6一步步调式当前程序对应的每一个变量值
*/
char[] cs = str.toCharArray();
//添加一个map容器
Map<Character, Integer> map=new HashMap<Character, Integer>();//如要将字母出现的次
//数按照26个字母先后顺序排序把HashMap<Character, Integer>改为TreeMap<>();即可
for (char c : cs) {
Integer value=map.get(c);
if(value==null) {
map.put(c, 1);
}
else {
map.put(c, value+1);
}
Set<Entry<Character,Integer>> entrySet = map.entrySet();
for (Entry<Character, Integer> entry : entrySet) {
System.out.println(entry.getKey()+" : "+entry.getValue());
}
}
}
}
代码运行出来的结果:s:3 j:5 f:2 l:3 u:1 k:2 p:3 m:2 w:1
如果说现在的需求要求按照字符出现的次数从小到大排序输出该怎么做?
在上面的代码基础上做:
/**
* 实现按照字符的出现次数进行排序输出
* -->按照Map中的值进行比较然后排序
* -->1)拿到值有两种方式 1、map.get(key); 2、entry.getvalue();
* -->2)进行排序,那么需要定义排序规则,实现java.util.comparator接口 (x,y)->{}->x/y 必须拿到map集合中的value
* x可以是map集合本身,也可以是entry
* -->3)x怎么做到代表是entry,当list集合中放的是entry,那么x就代表entry
*
* 思路:
* 1.将map集合转成list集合,并且list集合中的元素是entry
* 2.针对list集合进行排序
*
* ctrl+shift+o 快速导包
*/
//map集合
Set<Entry<Character,Integer>> entrySet = map.entrySet();
//转list
List<Entry<Character, Integer>> ls = new ArrayList<>(entrySet);
System.out.println(map);
//调用collections
Collections.sort(ls,(x,y)->x.getValue()-y.getValue());
System.out.println(ls);
//map.entrySet().stream().sorted((x,y)->x.getValue() - y.getValue()).forEach(System.out::println);//不想这么繁琐,直接运行这行代码也可行
细心的朋友一定已经注意到这里提到的调式器吧!是的,这个案例借助到了调式器的帮助,下面看图,更形象看一下怎么用吧🤔
三、泛型的作用
①提高代码健壮性;不健壮的代码,在运行时才会把错误暴露出来
②将运行期出现的异常转换为编译错误;错误代码,将潜在问题暴露出来,早预防早治疗
四、集合框架工具类
Collections ---->aslist排序;toArray集合转数组
看源码:
package com.hemingxiang.Map;
import java.util.Arrays;
import java.util.List;
/**
* 工具类 Collections Arrays
* 集合之间的相互转换
* 1.数组转成集合,本质上依然是一个数组,长度不可变
* 2.集合与数组所具备的方法是不一样的,对于数组而言,就没有判断内部包含哪个元素
* @author Administrator
*
*/
public class Demo4 {
public static void main(String[] args) {
//字符串数组
String[] arr = {"a","b","c","d"};
List<String> ls = Arrays.asList(arr);//排序
System.out.println(ls);
//数组转集合
//ls.add("e");
//集合转数组
Object[] array = ls.toArray();
System.out.println(ls.size());
}
}
输出结果:
(先看一个错误❗❗)
Arrays---->sort排序;toString
看源码:
package com.hemingxiang.Map;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
/**
* 对于工具类其他方法的应用
* Sort
* toString
* @author Administrator
*
*/
public class Demo5 {
public static void main(String[] args) {
List<Person> list = new ArrayList<>();
list.add(new Person("b", 16));
list.add(new Person("c", 18));
list.add(new Person("a", 17));
list.add(new Person("d", 15));
/*Collections.sort(list);//使上方字母按顺序输出
System.out.println(list);
//这里的x,y指的是集合中的元素
Collections.sort(list,(x,y)->y.compareTo(x));//使上方字母按倒序输出
System.out.println(list);*/
//Collections.sort(list);
Collections.sort(list, (x,y)->x.getName().compareTo(y.getName()));
System.out.println(list);
Integer[] arr= {3,6,9,5,4,8};
Arrays.sort(arr);//升序
System.out.println("升序"+Arrays.toString(arr));
Arrays.sort(arr, (x,y) -> y - x);//降序
System.out.println("降序"+Arrays.toString(arr));
}
}
class Person /*implements Comparable<Person>*/{
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 Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person() {
super();
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
//重写Comparable
/*@Override
public int compareTo(Person o) {
// TODO Auto-generated method stub
return o.getName().compareTo(this.name);
}*/
}
使上方字母按顺序倒序输出效果图:
获取实体类的数值,错误演示:
也可以不同实现Comparable接口⬇⬇
升降序: