目录
一、Map集合的特点
1、特点:
①、增删改查
②、键值对形式存在
③、key可以为空
2、遍历方式
①keySet
②entrySet
代码如下(特点):
Map<String,Integer> map = new HashMap<>();
//V put(K key, V value);
//增加数据 map.put
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
map.put("d", 4); map.put(null,null);
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"));
运行结果
遍历方式(代码如下)
查询所有两种: 1、先拿到map集合中所有的key map.keySet
2、拿到映射关系 map.entrySet
package com.zwc.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 Administrator
*
*/
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
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
map.put("d", 4); /*map.put(null,null);*/
//
// 查询所有
1、先拿到map集合中所有的key
Set set = map.keySet();
for (Object key : set) {
System.out.println("键:"+key+":值:"+map.get(key));
}
System.out.println("------------------");
2、拿到映射关系
Set<Entry<String,Integer>> entrySet = map.entrySet();
for (Entry<String, Integer> entry : entrySet) {
System.out.println("键:"+entry.getKey()+":值:"+entry.getValue());
}
}
}
运行结果:
面试题:
Hashmap与Hashtable的区别:
1、Hashtable线程是安全的
2、JDK1.8以下Hashtable的key是不能放null值
代码如下:
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
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
map.put("d", 4);
map.put(null,null);
注意:JDK在1.8以下的键是不能放null值的
二、常用实现类HashMap
案例:1、统计字符串各字母出现的次数
对于改案例的思路:
1、做字符串切割,得到一个字符数组
2、接下来遍历,拿到单个字符
3、如果该字符没有出现过,即value值为null,那么该字符为key,值初始化为1
4、如果出现过,拿到原来的值加1
代码如下:
package com.zwc.map;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;
import java.util.stream.Stream;
public class Demo2 {
public static void main(String[] args) {
String s ="sjflajaflajflwajjjlfwajflwajfwajflwajflwa";
/**
* 实现思路:
* 1、做字符串切割,得到一个字符数组
* 2、接下来遍历,拿到单个字符
* 3、如果该字符没有出现过,即value值为null,那么该字符为key,值初始化为1
* 4、如果出现过,拿到原来的值加1
*
*/
char[] arr = s.toCharArray();
Map<Character, Integer> map = new TreeMap<>();
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中的值进行比较然后排序
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 快速导包
代码如下:
* 需求:按照字符出现的次数进行排序--->想按照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();
List<Entry<Character, Integer>> list = new ArrayList<>(entrySet2);
System.out.println("--------没有按字符出现次数-----------");
System.out.println(map);
System.out.println(list);
Collections.sort(list,(x,y) -> x.getValue()-y.getValue());
System.out.println("--------按字符出现次数-----------");
System.out.println(list);
运行结果
三、泛型
泛型之前:(不健壮代码,会在运行时才会把错暴露出来)
代码如下:
package com.zwc.map;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* 泛型
* 之前:不健壮代码,会在运行时才会把错暴露出来
* 之后:将潜在的问题暴露出来,早预防早治疗
* 将运行期出现的异常转化为编印期的错误
* @author Administrator
*
*/
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);
}
}
}
运行结果:
数据类型转换错误
泛型之后
将潜在的问题暴露出来,早预防早治疗
将运行期出现的异常转化为编印期的错误
代码:
package com.zwc.map;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* 泛型
* 之前:不健壮代码,会在运行时才会把错暴露出来
* 之后:将潜在的问题暴露出来,早预防早治疗
* 将运行期出现的异常转化为编印期的错误
* @author Administrator
*
*/
public class Demo3 {
public static void main(String[] args) {
Set<Integer> set = new HashSet<>();
set.add(1);
set.add(2);
set.add(3);
set.add(4);
set.add(5);
for (Object obj : set) {
if(Integer.valueOf(obj.toString()) % 2 ==0) {
System.out.println(obj);
}
// set.remove(obj);
}
}
}
运行结果
四、集合框架工具类
代码展示:
package com.zwc.map;
import java.util.Arrays;
import java.util.List;
/**
* 集合之间的相互转换
* 1、数组转成集合,本质上依然是一个数组,长度是不可变的
* 2、集合与数组所具备的方法是不一样的,对于数组而言,就没有判断内部包含哪个元素
* @author Administrator
*
*/
public class Demo4 {
public static void main(String[] args) {
String[] arr= {"a","b","c","d"};
List<String> list = Arrays.asList(arr);
// Object[] array = list.toArray();
list.add("e");
// java.lang.UnsupportedOperationException
System.out.println(list.size());
}
}
结论:
集合之间的相互转换
1、数组转成集合,本质上依然是一个数组,长度是不可变的
2、集合与数组所具备的方法是不一样的,对于数组而言,就没有判断内部包含哪个元素
代码如下:
package com.zwc.map;
import java.util.Arrays;
import java.util.List;
/**
* 集合之间的相互转换
* @author Administrator
*
*/
public class Demo4 {
public static void main(String[] args) {
String[] arr= {"a","b","c","d"};
List<String> list = Arrays.asList(arr);
// Object[] array = list.toArray();
list.add("e");
// java.lang.UnsupportedOperationException
System.out.println(list.size());
}
}
运行结果:
其他工具类方法的应用
sort
tostring
package com.zwc.map;
import java.util.ArrayList;
import java.util.Arrays;
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", 18));
list.add(new Person("c", 20));
list.add(new Person("a", 22));
System.out.println("--------直接打印--------");
System.out.println(list);
// Collections.sort(list);
System.out.println("--------按字母顺序--------");
Collections.sort(list, (x,y) -> x.getName().compareTo(y.getName()));
System.out.println(list);
Integer[] arr = {2,5,6,3,8,9};
Arrays.sort(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() {
// TODO Auto-generated constructor stub
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
// @Override
// public int compareTo(Person o) {
// return o.getName().compareTo(this.name);
// }
}
运行结果