目录
2.2:对于这个集合而言,集合也是可以转换为数组的toArray
一.特点
1.增删改查
package com.jiangwenjuan.map;
import java.util.Map;
import java.util.Set;
/**
* map集合的特点
*
* @author JWJ
*
* @date 2022年6月9日 上午11:26:38
*/
public class Demo1 {
public static void main(String[] args) {
Map<String,Integer> map = new HashMap<>();
// 增加
// V put(K key, V value);
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
map.put("d", 4);
System.out.println(map);
// 删除
Object remove = map.remove("b");
System.out.println("被删除的"+remove);
System.out.println(map);
// 修改也是调用put方法
map.put("c", 32);
System.out.println("修改出来的结果:"+map);
// 查询
System.out.println(map.get("c"));
}
}
结果为:
2.键值对形式存在
Map的里面的put的方法,具备添加的功能也具备修改的功能
Map:
Map<String,Integer> map = new HashMap<>();
// 增加:
map.put("a",1);
// 键 值
// V put(K key, V value);
Hashtable:
Hashtable<Object, Object> table = new Hashtable<>();
// 增加
table.put("a", 1);
// 键 值
// public synchronized V put(K key, V value)
3.key可以为空
在jdk1.8以下hashtable的key不能存放null
package com.jiangwenjuan.map;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
/**
* map集合的特点
* 键值对
*
* @author JWJ
*
* @date 2022年6月9日 上午11:26:38
*/
public class Demo1 {
public static void main(String[] args) {
Hashtable<Object, Object> table = new Hashtable<>();
// public synchronized V put(K key, V value)
table.put("a", 1);
table.put("null", null);
Map<String,Integer> map = new HashMap<>();
// 增加
// V put(K key, V value);
map.put("a", 1);
map.put("b", 2);
map.put("null",2);
map.put("c", 3);
map.put("d", 4);
System.out.println(map);
}
}
二.遍历方式
1.entrySet
2.keySet
区别1:注意:Hashtable有同步方法的,相较比较安全
Hashtable<Object, Object> table = new Hashtable<>();
// public synchronized V put(K key, V value)
区别2:而注意:HashMap没有,相对不安全
Map<String,Integer> map = new HashMap<>();
// V put(K key, V value);
面试题:HashMap与Hashtable的区别:1.Hashtable是线程安全的
package com.jiangwenjuan.map;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
/**
* map集合的特点
* 键值对
* 遍历:
* 拿到key:再拿值
* 拿到映射关系:键值都有了
*
* @author JWJ
*
* @date 2022年6月9日 上午11:26:38
*/
public class Demo1 {
public static void main(String[] args) {
Hashtable<Object, Object> table = new Hashtable<>();
//注意:Hashtable有synchronized同步方法,相较比较安全
// public synchronized V put(K key, V value)
table.put("a", 1);
// table.put("null", null);
Map<String,Integer> map = new HashMap<>();
// 增加
//注意:HashMap没有,相对不安全
// V put(K key, V value);
map.put("a", 1);
map.put("b", 2);
map.put("null",2);
map.put("c", 3);
map.put("d", 4);
System.out.println(map);
// 查询所有
// 第一种方式:先拿到map集合中的所以的key
Set keys = map.keySet();
for (Object key : keys) {
System.out.println("键:"+key+";值:"+map.get(key));
}
System.out.println("===============");
// 第二种方式:拿到映射关系
Set<Entry<String,Integer>> entrySet = map.entrySet();
for (Entry<String, Integer> entry : entrySet) {
System.out.println("键:"+entry.getKey()+";值:"+entry.getValue());
}
}
}
结果为:
三.常用实现类HashMap
1.面试题:统计字符串个字母出现的次数
String s="sjflajlfjalewfjwjelkfjwlkefjlkwajflajljfl";
需要一个Map容器,比如这张图:
实现思路:
1.做字符串切割,得到一个字符数组
2.接下来遍历,拿到单个字符
3.如果该字符没有出现过,即value值为null,那么该字符为key,值初始化为1
4.如果已经出现过,拿到原来的值+1
代码块:
package com.jiangwenjuan.map;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class Demo2 {
public static void main(String[] args) {
String s="sjflajlfjalewfjwjelkfjwlkefjlkwajflajljfl";
char[] arr = s.toCharArray();
Map<Character, Integer> map = new HashMap<Character, Integer>();
for (char c : arr) {
Integer value = map.get(c);
if(value == null) {
map.put(c, 1);
}
else {
map.put(c, value+1);
}
// System.out.println(value);
}
Set<Entry<Character,Integer>> entrySet = map.entrySet();
for (Entry<Character, Integer> entry : entrySet) {
System.out.println(entry.getKey()+":"+entry.getValue());
}
}
}
运行代码块结果:
2.怎么能够按字符进行排序
直接改map集合
Map<Character, Integer> map = new TreeMap<>();
结果为:
3.debugger的使用:调试代码
1.打断点 双击即可
2.采用debugger的方式运行程序
3.进入调试窗口,左上方有一个step over调试箭头,快捷键F6
这里下一步,下一步就一个一个字符出现的出现.
4.接下来可以通过F6一步步调试当前程序对应的每一个变量值
四.泛型
1.作用
①.将运行时产生的异常转换为编译期的错误什么意思:下面讲解
②.提高代码的健壮性
当这行代码你还没有运行时是:之前:不健壮的代码,会在运行时才会把错误暴露出来
加上Set<Integer> set = new HashSet<>();就会直接告诉你不能加入字符串,因为是整数
Set<Integer> set = new HashSet<>(); set.add(1); set.add(2); set.add(3); set.add(4); set.add(5); set.add("a");
package com.jiangwenjuan.map;
import java.util.HashSet;
import java.util.Set;
/**
* 泛型
*
* @author JWJ
*
* @date 2022年6月9日 下午8:12:53
*/
public class Demo3 {
public static void main(String[] args) {
Set set = new HashSet<>();
set.add(1);
set.add(2);
set.add(3);
set.add(4);
set.add(5);
set.add("a");
for (Object obj : set) {
if(Integer.valueOf(obj.toString()) % 2 == 0) {
System.out.println(obj);
}
// set.remove(obj);//出错
}
}
}
当你运行的时候结果出来时:之后:将潜在的问题暴露出来,早预防早治疗
2.泛型
①.通用的增删改查
之前我们就是要在BookDao里面写很多增删改查方法,现在只要写一个方法即可通用
下面这些就是泛型的作用
class BookDao{
// add(Bokk book)
// add(Bokk book)
// add(Bokk book)
// add(Bokk book)
}
class UserDao extends BaseDao{
}
class BaseDao<T>{
void add(T t) {
}
void del(T t) {
}
void edit(T t) {
}
List<T> list(T t) {
return null;
}
}
3.泛型方法
②.通用结果集处理
当Result 的类没有任何的这个 <T> 你又想添加一个方法,怎么加呢,
就在前面加<T> 这就是泛型方法
class Result{
<T> void del(T t) {
}
}
五.集合框架工具类
1.Collections 集合
①.排序
②.集合转数组:toArray
2.Arrays 数组
①.toString
②.asList 数组可以转换为集合
③.sort
面试题:
arr是数组,数组长度是不可变的,然后把它转为list,list集合的长度是可变的,这个list集合本身到底是集合还是数组,list能用集合的方法,但是会报错。
你把arr工具类转换成list集合,它底层还是一个数组,数组长度是不可变的,所以说你往这个数组里面在加一个元素,是没有用的,加不了
package com.jiangwenjuan.map;
import java.util.Arrays;
import java.util.List;
/**
* 集合之间的相互转换
* @author JWJ
*
* @date 2022年6月9日 下午8:40:15
*/
public class Demo4 {
public static void main(String[] args) {
// 数据长度是不可变的
String[] arr = {"a","b","c","d"};
// list长度是可变的
List<String> list = Arrays.asList(arr);
list.add("e");
// java.lang.UnsupportedOperationException
System.out.println(list.size());
}
}
就会出错:
解决方案:
集合之间的相互转换:
1.数组转成集合:本质上依然是一个数组,长度是不可变的
2.集合与数组所具备的方法是不一样的,如对于数组而言,就没有判断内部包含哪个元素
解释:
把数组转换成一个集合,它本质上依然是一个数组,只不过你可以利用集合的方式去操作这个数组,因为集合里面有很多的方法,比如说:String element = list.add(index, element); 方法,这个在数组里面就没有
2.2:对于这个集合而言,集合也是可以转换为数组的toArray
数据长度是不可变的
String[] arr = {"a","b","c","d"};
// list长度是可变的
List<String> list = Arrays.asList(arr);
//转换为数组
Object[] array = list.toArray();
①.Collections的自带排序及sort代码:
package com.jiangwenjuan.map;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* 对于工具类其他方法的应用
* sort
* toString
* @author JWJ
*
* @date 2022年6月9日 下午9:05:49
*/
public class Demo5 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("b");
list.add("c");
list.add("a");
System.out.println(list);
// 自带排序规则
Collections.sort(list);
System.out.println("排序"+list);
// 改变排序
// 这里面x,y指的是集合中的元素
Collections.sort(list, (x,y)-> y.compareTo(x) );
System.out.println("倒序排序"+list);
}
}
结果为:
排序代码块:
这行就会报错:什么原因呢?
Collections.sort(list);
package com.jiangwenjuan.map;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* 对于工具类其他方法的应用
* sort
* toString
* @author JWJ
*
* @date 2022年6月9日 下午9:05:49
*/
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", 20));
System.out.println(list);
Collections.sort(list);
}
}
class Person{
private String name;
private int age;
public Person() {
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
public Person(String name, int age) {
super();
this.name = name;
this.age = 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;
}
}
怎么解决呢?
用昨天的方法:Person实现Comparable<>方法,然后在重写
class Person implements Comparable<Person>{
private String name;
private int age;
@Override
public int compareTo(Person o) {
// TODO Auto-generated method stub
return o.getName().compareTo(this.name);
}
}
结果为:
可不可以不实现Comparable<>,可以,怎么不实现呢,调用下一个方法:
Collections.sort(list, (x,y)-> x.getName().compareTo(y.getName()));
System.out.println("排序:"+list);
结果为:
降序排序与升序的排序:
Integer[] arr = {3,6,9,2,5,8};
// 降序排序
Arrays.sort(arr, (x,y)-> y-x);
// 升序排序
// Arrays.sort(arr);
System.out.println("默认地址:"+arr);
System.out.println("排序:"+Arrays.toString(arr));
结果为:
降序:
降序排序:[9, 8, 6, 5, 3, 2]
升序:
排序:[2, 3, 5, 6, 8, 9]
案例:按照字符出现的次数进行排序-->想按照map中的值进行比较然后排序
分析:
1.拿到值有两种方式--->①.map.get(key) ②.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:快速导包
Set<Entry<Character,Integer>> entrySet2 = map.entrySet();
// 把map集合转换成list
List<Entry<Character, Integer>> list = new ArrayList<>(entrySet2);
System.out.println(map);
System.out.println(list);
Collections.sort(list, (x,y)->x.getValue() - y.getValue());
System.out.println(list);
结果: