Map集合的学习

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:切换到控制台

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值