集合知识点总结(二)

双列集合:

Map<K,V> 有两个实现类 k-v映射关系 一个键可以有多个值,但一个值只能对应一个键

特点:将键映射到值的对象。 地图不能包含重复的键; 每个键可以映射到最多一个值。
1> Map界面提供了三个集合视图 ,允许将映射内容视为一组键,值集合或键值映射集合。
2>包含在该界面中的“破坏性”的方法,即,修改其操作地图的方法,被指定抛出UnsupportedOperationException如果此映射不支持该操作。
3>不能插入null
4>执行递归遍历地图的一些地图操作可能会失败,并且地图直接或间接包含自身的自引用实例有异常。 这包括clone() , equals() , hashCode()和toString()方法。

常用方法
- void clear() 从该地图中删除所有的映射(可选操作)。
- boolean containsKey(Object key) 如果此映射包含指定键的映射,则返回 true 。   
- boolean containsValue(Object value) 如果此地图将一个或多个键映射到指定的值,则返回 true 。  
- Set<Map.Entry<K,V>> entrySet() 返回此地图中包含的映射的Set视图。  
- boolean equals(Object o) 将指定的对象与此映射进行比较以获得相等性。  
- V get(Object key) 返回到指定键所映射的值,或 null如果此映射包含该键的映射。 
- int hashCode() 返回此地图的哈希码值。  
- boolean isEmpty() 如果此地图不包含键值映射,则返回 true 。 
- Set<K> keySet() 返回此地图中包含的键的Set视图 
- V remove(Object key) 如果存在(从可选的操作),从该地图中删除一个键的映射。 
- V put(K key, V value) 将指定的值与该映射中的指定键相关联(可选操作)。 
- void putAll(Map<? extends K,? extends V> m) 将指定地图的所有映射复制到此映射(可选操作)。  
- V remove(Object key) 如果存在(从可选的操作),从该地图中删除一个键的映射。  
- int size() 返回此地图中键值映射的数量。 
- Collection<V> values() 返回此地图中包含的值的Collection视图。  
HashMap
 实现类介绍:public class HashMap<K,V>extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable             

实现了Map的相应接口,可以克隆 可以序列化 底层数据结构:数组(key)+链表(值)
1>基于哈希表的实现的Map(.75)接口。 此实现提供了所有可选的地图操作,并允许null的值和null键。
2>HashMap的一个实例有两个影响其性能的参数: 初始容量和负载因子 。
3>*请注意,此实现不同步。*外部进行同步Map m = Collections.synchronizedMap(new HashMap(…));
4>迭代器故障快速

Set<Student>set =map.keySet();
        /*遍历取值*/
        Iterator<Student>iterator=set.iterator();
        while (iterator.hasNext()){
            Student key=iterator.next();
            String value=map.get(key);
            System.out.println(key+" " + value);
        }
      Set<Map .Entry<Student,String>>entrySet= map.entrySet();
        Iterator <Map .Entry<Student,String>>entryIterator=entrySet.iterator();
        while (entryIterator.hasNext()){
            Map .Entry<Student ,String>entry=entryIterator.next();
            System.out.println( entry.getValue()+"===="+ entry.getKey());
        }
        for (Map.Entry<Student, String> studentStringEntry : entrySet) {
            System.out.println(studentStringEntry.hashCode() +""+studentStringEntry.getValue() );
        }
         - LinkedHashMap

实现类介绍:public class LinkedHashMap<K,V>extends HashMap<K,V>implements Map<K,V>
1> 哈希表和链表实现的Map接口,具有可预测的迭代次序。 这种实现不同于HashMap,它维持于所有条目的运行双向链表。 此链接列表定义迭代排序,通常是将键插入到地图(插入顺序 )中的顺序 。 请注意,如果将键重新插入到地图中,则插入顺序不受影响。 (A键k被重新插入到地图m如果当m.containsKey(k)将返回true之前立即调用m.put(k, v)被调用。)
2>允许null值
3>*请注意,此实现不同步。*外部进行同步Map m = Collections.synchronizedMap(new LinkedHashMap(…));
4>迭代器故障快速
5>提供了一种特殊的constructor来创建一个链接的哈希映射,其迭代顺序是最后访问的条目的顺序,从最近最近访问到最近的( 访问顺序 )。 这种地图非常适合建立LRU缓存。

 Set<Student>set1=map.keySet();
        Iterator<Student>itter=set1.iterator();
        while (itter.hasNext()){
            Student s=itter.next();
            String v=map.get(s);
            System.out.println(s+" "+v);
        }
TreeMap

实现类介绍:public class TreeMap<K,V>extends AbstractMap<K,V>implements NavigableMap<K,V>, Cloneable, Serializable
1>一个红黑树基于NavigableMap实现。
2>*请注意,此实现不同步。*外部进行同步Map m = Collections.synchronizedMap(newTreeMap(…));
3>迭代器故障快速
4>通过此类中的方法返回的所有Map.Entry对,其视图表示生成时映射的快照。 他们不支持Entry.setValue方法。 (请注意,可以使用put更改关联地图中的put 。)

  Set<Map.Entry<Integer,Person>> set=tm.entrySet();
        for (Map.Entry<Integer, Person> entry : set) {
            System.out.println(entry.getKey()+"---"+entry.getValue());
        }
        Set<Integer> set1=tm.keySet();
        Iterator<Integer> itter=set1.iterator();
        while (itter.hasNext()){
            Integer s=itter.next();
            Person v=tm.get(s);
            System.out.println(s+"---"+v);
        }
HashTable

实现类介绍:extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable
扩容方式:HashMap的是对原来的容量*2+1
默认值:
底层数据结构:数组+链表
CRUD方式:
HashTable特点:
1.底层数据结构:数组+链表
2.Null值:key和value 都不能为null
3.Key的重复性问题:key不能重复
4.有序性:不能保证插入有序;

HashMap和HashTable的异同点:
形同点:1.底层数据结构相同
2.key都不能重复
3.插入元素都不能保证插入有序
4.hash过程通过key进行hash

  1. 扩容机制不同:HashMap的是对原来容量* 2
    HasnTable的是对原来的容量*2+1

  2. 安全性问题:HashMap不能保证线程安全
    HasnTable适用于多线程(保证线程安全) 有synchronized关键字

  3. 对Entry[]数组的初始化不同:hashtable对数组在自定义的构造函数时被初始化
    而hashMap没有初始化

  4. Null值: HashMap中key和valu可以为null;

  5. HashtTable中key和value都不能为null

  6. 继承关系:HashMap继承AbstractMap
    HashTable继承了Dictionary

  7. 默认初始值问题:HashMap数组默认值大小为:16
    Hashtable数组默认值大小为:11

  8. Hash算法不同:1.key的比较;(HashMap少了==key)

  9. 效率不同:HashMap在单线程下效率高
    HashTable在单线程下效率低

qes: 1.怎样使HashMap在多线程安全?
答:使用集合工具类collections时hashMap具有线程安全性
qes: 2.HashTable能保证线程安全原理:
答:HashTable在相应方法添加Synchronized的关键字,该关键字是互斥锁的目的是保证同一时刻只能有一个线程对资源进行访问 在hashMap中 add put等一般方法添加Synchronized关键字,修饰的是类对象,该对象调用put操作即为该hashtable对象添加了一个互斥锁。
qes: 3.HashMap在jdk1.7和jdk1.8的区别???
1.8 —> 数组+红黑树+链表
1.7-数组+链表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值