HashMap&Collections类的简单使用

本文深入解析Java中Map集合的功能,包括添加、删除、判断、获取和长度操作,探讨HashMap、LinkedHashMap及TreeMap的特性与应用场景,同时对比HashMap与Hashtable的异同。
Map集合的添加功能:
* V put(K key,V value):添加元素
* 如果键是第一次存储,就直接存储元素,返回null
* 如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值
Map集合的删除功能:
* void clear():移除所有的键值对元素
* V remove(Object key):根据键删除键值对元素,并把值返回
Map集合的判断功能:
* boolean containsKey(Object key):判断集合是否包含指定的键
* boolean containsValue(Object value):判断集合是否包含指定的值
* boolean isEmpty():判断集合是否为空
Map集合的获取功能:
* Set<Map.Entry<K,V>> entrySet=map.entrySet():
* V get(Object key):根据键获取值
* Set<K> keySet=map.KeySet():获取集合中所有键的集合
* Collection<V> values=map.values():获取集合中所有值的集合
Map集合的长度功能:
* int size():返回集合中的键值对的个数




Map<String, Integer> map = new HashMap<>();    //Map接口的创建
System.out.println(map);            //输出顺序根据底层的哈希算法
Map的new为什么是Map map=new HashMap();而不是new Map();?
因为map是个接口,而接口不能被实例化!
HashMap是map接口的实现类





Map.Entry说明Entry是Map的内部接口,将键和值封装成了Entry对象
Map<String, Integer> map = new HashMap<>();
for(Entry<String, Integer> en : map.entrySet()) {
    System.out.println(en.getKey() + "=" + en.getValue());
}
en.getKey():获取键
en.getValue():获取值




interface Inter {                //接口的接口
    interface Inter2 {
        public void show();
    }
}
class Demo implements Inter.Inter2 {        //实现
    @Override
    public void show() {
    }
}




//LinkedHashMap可以保证怎么存就怎么取
LinkedHashMap<String, Integer> lhm = new LinkedHashMap<>();
lhm.put("张三", 23);
System.out.println(lhm);





//创建TreeMap类
TreeMap<Integer, String> tm = new TreeMap<>();





//Collecitons集合中的常见方法
ArrayList<String> list = new ArrayList<>();
Collections.sort(list);                //将集合排序
Collections.binarySearch(list, String str);    //二分查找
Collections.shuffle(list);            //随机打乱顺序,可以用来洗牌
Collections.reverse(list);            //反转集合
Collections.max(list);                //根据默认排序结果获取集合中的最大值






* Collection
     *         List(存取有序,有索引,可以重复)
     *             ArrayList
     *                 底层是数组实现的,线程不安全,查找和修改快,增和删比较慢
     *             LinkedList
     *                 底层是链表实现的,线程不安全,增和删比较快,查找和修改比较慢
     *             Vector
     *                 底层是数组实现的,线程安全的,无论增删改查都慢
     *             如果查找和修改多,用ArrayList
     *             如果增和删多,用LinkedList
     *             如果都多,用ArrayList
     *         Set(存取无序,无索引,不可以重复)
     *             HashSet
     *                 底层是哈希算法实现
     *                 LinkedHashSet
     *                     底层是链表实现,但是也是可以保证元素唯一,和HashSet原理一样
     *             TreeSet
     *                 底层是二叉树算法实现
     *             一般在开发的时候不需要对存储的元素排序,所以在开发的时候大多用HashSet,HashSet的效率比较高
     *             TreeSet在面试的时候比较多,问你有几种排序方式,和几种排序方式的区别
* Map
     *         HashMap
     *             底层是哈希算法,针对键
     *             LinkedHashMap
     *                 底层是链表,针对键
     *         TreeMap
     *             底层是二叉树算法,针对键
     *                 开发中用HashMap比较多





//嵌套HashMap的使用
HashMap<Student, String> hm1 = new HashMap<>();
HashMap<Student, String> hm2 = new HashMap<>();
HashMap<HashMap<Student, String>, String> hm = new HashMap<>();
hm.put(hm1, "");
hm.put(hm2, "");
//遍历双列集合
for(HashMap<Student, String> h : hm.keySet()) {                //hm.keySet()代表的是双列集合中键的集合
    String value = hm.get(h);                    //get(h)根据键对象获取值对象
    //遍历键的双列集合对象
    for(Student key : h.keySet()) {                    //h.keySet()获取集合总所有的学生键对象
        String value2 = h.get(key);    
        System.out.println(key + "=" + value2 + "=" + value);
    }
}





HashMap和Hashtable的共同点与区别
* 共同点:
* 底层都是哈希算法,都是双列集合
* 区别:
* 1,HashMap是线程不安全的,效率高,JDK1.2版本
*   Hashtable是线程安全的,效率低,JDK1.0版本的
* 2,HashMap可以存储null键和null值
*   Hashtable不可以存储null键和null值

 

<think>好的,我现在需要帮用户解决如何通过Java的Collections工具使HashMap变为线程安全的Map的问题。首先,用户提到了Collections.synchronizedMap()方法,所以我要先确认这个方法的具体用法和效果。根据用户提供的引用[1]和[3],HashMap本身不是线程安全的,多线程环境下需要使用ConcurrentHashMap或者用Collections.synchronizedMap()来包装。 接下来,我需要给出一个具体的示例代码,展示如何使用synchronizedMap。比如,用户可能需要看到如何将普通的HashMap转换为同步的Map。代码应该包括创建HashMap,然后调用Collections.synchronizedMap()方法,并展示如何在多线程环境中使用。 然后,我需要解释这个方法是如何实现线程安全的。根据引用[2],synchronizedMap返回的是一个SynchronizedMap实例,它在每个方法上加了同步锁,使用mutex对象作为锁。这样,所有操作都是同步的,但可能在高并发下性能不如ConcurrentHashMap。 还要注意用户可能关心的问题,比如迭代时的同步。根据引用[3],即使使用synchronizedMap,在迭代时仍然需要外部同步,否则可能引发并发修改异常。所以需要在示例代码中加入手动同步的步骤,比如使用synchronized块包裹迭代操作。 另外,用户可能想知道synchronizedMap和ConcurrentHashMap的区别,引用[2]提到两者的实现方式不同,ConcurrentHashMap内部使用分段锁,而synchronizedMap是全局锁。这可能影响性能,特别是在高并发场景下,需要指出这点。 然后,我需要确保回答结构清晰,分步骤说明,包括示例代码、实现原理、注意事项以及两者的比较。同时,按照用户的要求,生成相关问题,可能涉及性能优化、使用场景、与ConcurrentHashMap的对比等。 最后,检查是否符合系统级指令,比如行内公式是否正确使用$符号,独立公式是否用$$,但在这个问题中可能涉及较少数学公式。确保使用中文回答,引用标记正确添加,比如引用[1]、[2]、[3]的位置是否准确。</think>### 如何通过Collections工具使HashMap线程安全? 在Java中,若需将非线程安全的`HashMap`转换为线程安全的`Map`,可通过`Collections.synchronizedMap()`方法实现。以下是具体步骤和示例: --- #### 1. **基本实现示例** ```java import java.util.Collections; import java.util.HashMap; import java.util.Map; public class ThreadSafeMapExample { public static void main(String[] args) { // 创建普通HashMap Map<String, Integer> hashMap = new HashMap<>(); // 转换为线程安全的Map Map<String, Integer> synchronizedMap = Collections.synchronizedMap(hashMap); // 多线程操作示例 Runnable task = () -> { for (int i = 0; i < 1000; i++) { synchronizedMap.put(Thread.currentThread().getName() + i, i); } }; Thread thread1 = new Thread(task); Thread thread2 = new Thread(task); thread1.start(); thread2.start(); try { thread1.join(); thread2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Map size: " + synchronizedMap.size()); } } ``` --- #### 2. **实现原理** - **同步机制**:`Collections.synchronizedMap()`返回一个`SynchronizedMap`实例,其所有方法(如`put`、`get`)均通过`synchronized`关键字加锁,使用内部`mutex`对象作为锁[^2]。 - **全局锁**:所有操作共用同一把锁,保证原子性但可能影响并发性能。 --- #### 3. **注意事项** - **迭代器需手动同步**:遍历时需显式加锁,否则可能抛出`ConcurrentModificationException`: ```java synchronized (synchronizedMap) { for (Map.Entry<String, Integer> entry : synchronizedMap.entrySet()) { // 操作entry } } ``` - **性能瓶颈**:高并发场景下,全局锁可能导致竞争,此时推荐改用`ConcurrentHashMap`(分段锁机制)[^3]。 --- #### 4. **与ConcurrentHashMap的对比** | 特性 | `Collections.synchronizedMap` | `ConcurrentHashMap` | |--------------------|------------------------------------|------------------------------------| | **锁粒度** | 全局锁 | 分段锁(JDK 8后为CAS + synchronized) | | **迭代器弱一致性** | 不支持(需手动同步) | 支持 | | **适用场景** | 低并发或简单操作 | 高并发或复杂操作 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值