1 概念
Collection 中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储。
Map 中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的 值。
Collection 中的集合称为单列集合, Map 中的集合称为双列集合。
注意: Map 中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。
特点:
1,Map集合是一个双列集合,一个元素包含两个值(一个key,一个value)
2,Map集合中的元素,key和value的数据类型是可以相同的,也可以不同。
3,Map集合中的额元素,key不允重复,value是可以重复的。
4,Map集合中的元素,key和value是一 一对应的。
2.常用子类
HashMap:
特点:
1,底层是哈希表结构,查询速度特别快。
2,是一个无序的集合,存储元素和取出元素的顺序有可能不一致。
LinkedHashMap:
特点:
1,集合底层是哈希表+链表(保证迭代顺序)
2,是一个有序的集合,存储元素和取出元素的顺序可能不一致。
注意:Map接口中的集合都有两个泛型变量,在使用时,要为两个泛型变量赋予数据类型。两个泛型变量的数 据类型可以相同,也可以不同。
3,Map接口中的常用方法
Map接口中定义了很多方法,常用的如下:
public V put(K key, V value)
: 把指定的键与指定的值添加到Map集合中。
public V remove(Object key)
: 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的 值。
public V get(Object key)
根据指定的键,在Map集合中获取对应的值。
public Set<K> keySet()
: 获取Map集合中所有的键,存储到Set集合中。
public Set<Map.Entry<K,V>> entrySet()
: 获取到Map集合中所有的键值对对象的集合(Set集合)。
boolean containKey(Object key)
:判断集合中是否包含指定的键
Map集合的第一种遍历方式:通过找键值的方式
Map集合中的方法:Set keySet(),把Map集合所有的key取出来,存储到一个Set集合中
步骤:
1,使用Map集合方法keySet(),把Map集合所有的key找出来,存到Set集合中
2,遍历set集合,获取Map集合中的每一个key
3,通过Map集合中方法get(Key),通过key找value
4,Entry键值对对象
Map.Entry<K,V>:在Map接口中有一个内部接口Entry
作用:当Map集合一创建,那么就会在Map集合中创建一个Entry对象,用来记录键与值(简直对对象,键与值的映射关系)
既然Entry表示了一对键和值,那么也同样提供了获取对应键和对应值得方法:
public K getKey()
:获取Entry对象中的键。
public V getValue()
:获取Entry对象中的值。
在Map集合中也提供了获取所有Entry对象的方法:
public Set<Map.Entry<K,V>> entrySet()
: 获取到Map集合中所有的键值对对象的集合(Set集合)。
Map集合遍历第二种方法:使用Entry对象遍历
Map<String,Integer> map = new HashMap<>();`
map.put("刘德华",170);
map.put("郭富城",165);
Set<Map.Entry<String,Integer>> set = map.entrySet();
Iterator<Map.Entry<String,Iteger>> it = set.iterator();
while(it.hasNext()){
Map.Entry<String,Integer> entry = it.next();
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key+"="+value);
}
用加强for循环遍历
for(Map.Entry<String,Integer> entry:Set){
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key+"="+value);
}
5,HashMap存储自定义类型键值
当给HashMap中存放自定义对象时,如果自定义对象作为key存在,这时要保证对象唯一,必须复写对象的hashCode和equals方法(如果忘记,请回顾HashSet存放自定义对象)
6,LinkedHashMap
LinkedHashMap继承了HashMap
Map接口的哈希表和链接列表,具有可预知的迭代顺序。
底层原理:哈希表+链表(记录元素的顺序)
7 Hashtable集合
最早期的Hash表,单线程,速度慢。
Hashtable底层也是一个哈希表,是一个线程安全的集合,是单线集合,速度慢
HashMap:底层是一个哈希表,是一个线程不安全的集合,是多线程的集合,速度快
HashMap集合(之前学的所有集合):可以存储null值,null键
Hashtable集合,不能存储null值,null键
Hashtable和Vector集合一样,在JDK1.2版本之后被更先进的集合(HashMap,ArrayList)取代了。Hashtable的子类Properties依然活跃在舞台,Properties集合是一个唯一和IO流相结合的集合。
练习:计算一个字符中每个字符出现次数
public class Test1114 {
public static void main(String[] args) {
//1,使用Scanner获取用户输入的字符串
Scanner sc =new Scanner(System.in);
System.out.println("请输入字符:");
String str = sc.next();
//2,创建Map集合,key是字符串中的字符,value是字符的个数
HashMap<Character,Integer> map = new HashMap<>();
//3,增强for循环,遍历字符串,获取每一个字符
for(char c:str.toCharArray()){
//4,使用获取到的字符,去Map集合判断key是否存在
if (map.containsKey(c)){
//key已经存在,value(字母数量+1)
Integer value = map.get(c);
value ++;
//把相关字母和当前的出现次数输入到Map集合中,
// 下次再出现同样的就新数字替代了
map.put(c,value);
//如果没有就是第一次出现,设定值为输入
}else{
map.put(c,1);
}
}
//遍历Map集合
for(Character key:map.keySet()){
Integer it = map.get(key);
System.out.println(key+"="+it);
}
}
}
8. JDK9对集合的优化
JDK9的新特性:
List接口,Set接口,Map接口,里边增加了一个静态的方法of,可以集合一次性添加多个元素
使用前提:当集合中存储的元素个数已经确认,不再改变
注意:
1.of方法只适用于List接口,Set接口,Map接口,不适用于接口的实现类。
2.of方法返回值是一个不能改变的集合,集合不能再使用add,put方法,会抛异常。
3.Set接口和Map接口在调用of方法的时候,不能有重复元素,否则会抛异常。
9. Dbug追踪
让代码逐行执行,
查看代码执行的过程,调式程序中出现的bug
使用方法:
1,在行号的右边,鼠标左键单击,断点(每一个方法的第一行,哪里有bug添加到哪里)
2,右键,选择Dbug执行程序
程序会停留在添加的第一个断点
执行程序:
f8:逐行执行程序
f7进入到方法中
shift + f8 跳出方法
f9 跳到下一个断点,没有则结束程序
ctrl + f2 退出Debug模式,停止程序
Console:切换到控制台