Java 集合类 之Map集合及常用的遍历方法(面试常问)

   在Java 开发中,经常需要集中存放多条数据,数据通常使用数组来保存,但在某些情况下无法确认到底需要保存多少个对象,例如,一个餐厅需要统计财务信息,由于餐厅不停地有财务存入,同时餐厅也有财务支出,这时餐厅的财务信息将很难确认,为了保存这些数据不确认的对象,并且长度不变,统称为集合:

    1.集合概述:

      集合类就像容器,现实生活中容器的功能,无非就是添加对象,删除对象,清空容器,判断容器是否为空,集合类就为这些功能提供了对应的方法:

      java Util 包中提供了一系列可使用的集合类,称为集合框架,集合框架主要是由Collection 和 Map 两个根接口派生出来的接口和实现类组成:

     常用的一些集合的继承图:

   HashMap:

  

 HashTable:

 可以从图看出,Map 接口不继承任何接口,与List接口的父接口 是并列存在的,用于存储 键-值(key-value)形式的元素,描述了有不重复的键到值的映射,其中HashMap 类是Map 接口中使用频率最高的实现类,允许使用null 键和null值,

由于HashMap 采用Hash 算法的形式存储值,所以HashMap不能保映射的顺序,同理HashTable也是;

Hashtable是线程安全的,它的每个方法中都加入了Synchronize方法。在多线程并发的环境下,可以直接使用Hashtable,不需要自己为它的方法实现同步,HashMap不是线程安全的,在多线程并发的环境下,可能会产生死锁等问题。使用HashMap时就必须要自己增加同步处理,而HashMap已经成为应用最为广泛的一种数据类型了。造成这样的原因一方面是因为Hashtable是线程安全的,效率比较低。也可能是Hashtable开始设计的时候没有遵循驼峰命名法;其次就是HashMap 支持单个key值为null,HashTable一个也不支持,并且HashMap 还支持多值为null的形式;

LInkedHashMap:

  

从图可以看出LinkedHashMap 类是HashMap 的子类,LinkedHashaMap 类可以维护Map 的迭代顺序,迭代顺序与 键 值 的插入顺序一致,如果需要输出的顺序相同,就可以选用LinkedHashMap 集合;

TreeMap:

 

TreeMap 集合存储键-值对,需要根据键-值 对进行排序,TreeMap 集合可以保证所有的键-值对处于有序状态。

  

   同时Map 集合中还有一个古老的,线程安全的实现类--Hashtable ,与HashMap 集合相同的是它也不能保证其中的键-值对的顺序,它判断两个键,两个值相等的标准与HashMap集合一样,与HashMap集合不同的是它不允许使用null作为键和值。

2.Map 集合中常用的遍历方法:

 1.通过entrySet() 方法,拿到Map 集合中的 key-value值:

/**
* 最常见也是大多数情况下用的最多的,一般在键值对都需要使用
 */
Map <String,String>map = new HashMap<String,String>();
map.put("k1", "v1");
map.put("k2", "v2");
for(Map.Entry<String, String> entry : map.entrySet()){
    String key = entry.getKey();
    String value = entry.getValue();
    System.out.println(key +":"+value );
}

  2.通过 keySet( )方法,遍历key值,然后通过values() 方法拿到value值 。

Map <String,String>map = new HashMap<String,String>();
map.put("k1", "v1");
map.put("k2", "v2");
//遍历key
for(String key : map.keySet()){
    System.out.println(key);
}
//遍历value
for(String value : map.values()){
    System.out.println(value);
}

3.通过Iterator遍历,如果在遍历过程中,有删除某些key-Value 的需求,可以使用这种遍历方式:

Iterator<Entry<String, String>> entries = map.entrySet().iterator();
while(entries.hasNext()){
    Entry<String, String> entry = entries.next();
    String key = entry.getKey();
    String value = entry.getValue();
    System.out.println(key+":"+value);
}

4.jdk8 新增lambda表达式:

map.forEach((key,value) -> {
            System.out.println("key:"+ key + "value:" + value);
        });

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

焱宣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值