深入学习

java Map 的学习,javamap学习

一、常用API: 

clear() 从 Map 中删除所有映射
remove(Object key) 从 Map 中删除键和关联的值
put(Object key, Object value) 将指定值与指定键相关联
putAll(Map t) 将指定 Map 中的所有映射复制到此 map
entrySet() 返回 Map 中所包含映射的 Set 视图。Set 中的每个元素都是一个 Map.Entry 对象,可以使用 getKey() 和 getValue() 方法(还有一个 setValue() 方法)访问后者的键元素和值元素
keySet() 返回 Map 中所包含键的 Set 视图。如果要删除 Set 中的元素还将会删除 Map 中相应的映射(键和值)
values() 返回 map 中所包含值的 Collection 视图。如果要删除 Collection 中的元素还将会删除 Map 中相应的映射(键和值)
get(Object key) 返回与指定键关联的值
containsKey(Object key) 如果 Map 包含指定键的映射,则返回 true
containsValue(Object value) 如果此 Map 将一个或多个键映射到指定值,则返回 true
isEmpty() 如果 Map 不包含键-值映射,则返回 true
size() 返回 Map 中的键-值映射的数目

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

二、对map的一顿操作:

 1         // Map的声明,初始化
 2         Map<String, Object> map1 = new HashMap<>();
 3         Map<String, Object> map2 = new HashMap<>();
 4         Map<String, Object> map3 = new HashMap<>();
 5         // put操作
 6         map1.put("name", "xiaoming");
 7         map1.put("sex", "0");
 8         map1.put("phone", "13566668888");
 9         map1.put("email", "[email protected]");
10         map1.put("age", "18");
11         // get操作
12         Object phone = map1.get("phone");
13         // keySet操作
14         for (String key : map1.keySet()) {
15             map2.put(key, map1.get(key));
16         }
17         // putAll操作
18         map3.putAll(map1);
19         int size = 0;
20         // containsKey操作
21         if (map2.containsKey("name")) {
22             // containsValue操作
23             if (map3.containsValue("xiaoming")) {
24                 // remove操作
25                 map1.remove("sex");
26                 // size操作
27                 size = map1.size();
28             }
29         }
30         // clear操作
31         map2.clear();
32         // imEmpty操作
33         if (map2.isEmpty()) {
34             map2.putAll(map);
35         }

1         // entrySet操作,注意entry的类型
2         for (Map.Entry<String, Object> entry : map3.entrySet()) {
3             System.out.println(entry.getKey() + " :" + entry.getValue());
4         }

  图片 1

 

  参考文章:

 

Map 的学习,javamap学习 一、常用API:
clear() 从 Map 中删除所有映射 remove(Object key) 从 Map
中删除键和关联的值 put(Object key, Object value) 将指…

1 Set集合主要源码分析

上一篇,我们介绍了Java集合框架中的Set集合,主要讲了HashSet和TreeSet这两个实现类。本篇,依旧对这两个实现类进行学习,通过学习源码来深入地了解。

1.1 HashSet源码分析(基于JDK1.7.0_75)

HashSet基于HashMap,底层方法是通过调用HashMap的API来实现,因此HashSet源码结构比较简单,代码较少。

  • 成员变量:

在HashSet中,有两个成员变量比较重要–map、PRESENT;

其中,map就是存储元素的地方,实际是一个HashMap。当有元素插入到HashSet中时,会被当做HashMap的key保存到map属性中去。

对于HashMap来说,光有key还不够,在HashSet的实现中,每个key对应的value都默认为PRESENT属性,也就是new了一个Object对象而已;

public class HashSet<E> 
    extends AbstractSet<E> 
    implements Set<E>, Cloneable, java.io.Serializable{

    static final long serialVersionUID = -5024744406713321676L;

    //HashSet通过HashMap保存集合元素的:
    private transient HashMap<E,Object> map;

    //HashSet底层由HashMap实现,新增的元素为map的key,而value则默认为PRESENT。
    private static final Object PRESENT = new Object();
}
  • 构造方法:

HashSet的构造方法很简单,主要是在方法内部初始化map属性,new了一个HashMap对象;

public class HashSet<E>
        extends AbstractSet<E>
        implements Set<E>, Cloneable, java.io.Serializable {

    //无参构造方法:
    public HashSet() {
        //默认new一个HashMap
        map = new HashMap<>();
    }

    // 带集合的构造函数
    public HashSet(Collection<? extends E> c) {
        // 进行初始化HashMap容量判断,
        map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
        addAll(c);
    }

    // 指定HashSet初始容量和加载因子的构造函数:主要用于Map内部的扩容机制
    public HashSet(int initialCapacity, float loadFactor) {
        map = new HashMap<>(initialCapacity, loadFactor);
    }

    // 指定HashSet初始容量的构造函数
    public HashSet(int initialCapacity) {
        map = new HashMap<>(initialCapacity);
    }

    //与前4个不同,此构造最终new了一个LinkedHashMap对象:
    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
    }
}
  • add():

HashSet的add(E e)方法,主要是调用底层HashMap的put(K key, V value)方法。

其中key就是HashSet集合插入的元素,而value则是默认的PRESENT属性(一个new
Object());

//调用HashMap中的put()方法:
public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}
  • remove():

与add(E e)方法类似,HashSet的remove(Object
o)也是调用了底层HashMap的(Object key)方法;

主要是计算出要删除元素的hash值,在HashMap找到对应的对象,然后从Entry<K,V>[]数组中删除;

//调用HashMap中的remove方法:
public boolean remove(Object o) {
    return map.remove(o)==PRESENT;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注