赞
踩
目录
2.2:对于这个集合而言,集合也是可以转换为数组的toArray
- 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"));
-
-
-
-
- }
-
- }
结果为:
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)
在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:注意: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());
- }
- }
-
- }
结果为:
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());
- }
- }
-
- }
运行代码块结果:
直接改map集合
Map<Character, Integer> map = new TreeMap<>();
结果为:
1.打断点 双击即可
2.采用debugger的方式运行程序
3.进入调试窗口,左上方有一个step over调试箭头,快捷键F6
这里下一步,下一步就一个一个字符出现的出现.
4.接下来可以通过F6一步步调试当前程序对应的每一个变量值
①.将运行时产生的异常转换为编译期的错误什么意思:下面讲解
②.提高代码的健壮性
当这行代码你还没有运行时是:之前:不健壮的代码,会在运行时才会把错误暴露出来
加上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);//出错
- }
- }
-
- }
当你运行的时候结果出来时:之后:将潜在的问题暴露出来,早预防早治疗
①.通用的增删改查
之前我们就是要在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;
- }
-
- }
②.通用结果集处理
当Result 的类没有任何的这个 <T> 你又想添加一个方法,怎么加呢,
就在前面加<T> 这就是泛型方法
- class Result{
- <T> void del(T t) {
-
- }
- }
①.排序
②.集合转数组:toArray
①.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); 方法,这个在数组里面就没有
- 数据长度是不可变的
- 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);
结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。