Map容器——HashMap及常用API,及put,get方法解析,哈希码的产生和使用

Map接口

①   映射(map)是一个存储键/值对的对象。给定一个键,可以查询到它的值,键和值都是对象;

②   键必须是唯一的,值可以重复;

③   有些映射可以接收null键和null值,而有的不行;

④   下面的接口可以支持映射:


接口


描述


Map


映射唯一关键字给值


Map.Entry


描述映射中的元素(关键字/值对)。这是Map的一个内部类


SortedMap


扩展Map以便关键字按升序保持

⑤   Map接口映射唯一键到值;

⑥   键(key)是以后用于检索值的对象。给定一个键和一个值,可以存储这个值到Map对象中,以后可以使用对应键来检索它;

⑦   Map接口定义的方法:

a)   int size()

b)   boolean isEmpty()

c)  boolean containsKey(Object key)

d)    boolean containsValue(Object value)

e)    V get(Object key)

f)     V put(K key,V value)

g)    V remove(Object key)

h)    Collection<V> values()

i)     Set<Map.Entry<K,V>> entrySet() 返回包含映射关系的set视图

⑧   Map.Entry接口代表映射项(键-值对)类型,是Map的嵌套类型;

⑨   Map接口定义的entrySet()方法返回包含映射项Entry的集合(Set),集合中的元素是Map.Entry类型;

⑩   Map.Entry接口定义的方法:

a)   K getKey()

b)   V getValue()

c)   V setValue(V value)

HashMap及常用API

①   HashMap类是基于哈希表的map接口的实现,并允许使用null键和null值;

②   构造方法:

a)   HashMap()

b)   HashMap(Map m)

c)   HashMap(int capacity)

d)   HashMap(int capacity,float fillRatio)

③   HashMap实现Map并扩展AbstractMap,本身并没有增加任何新的方法;

④   散列映射不保证它的元素的顺序,元素加入散列映射的顺序并不一定是它们被迭代读出的顺序;

添加及输出

1 Map<String, String> map = new HashMap<String, String>();
2         map.put("zhangsan", "张三");
3         map.put("zhangsan", "李四");//会覆盖上面的‘张三‘值
4         map.put("jay", "小明");
5         map.put("marry", "小红");
6         System.out.println(map);

输出结果:

{jay=小明, zhangsan=李四, marry=小红}

获取map中的所有键

1 Set<String> keys=map.keySet(); 2 for(String key:keys){ 3 System.out.println(key); 4 }

输出结果:

jay

zhangsan

marry

获取map中的所有值

1 Collection<String> values=map.values(); 2 for(String value:values){ 3 System.out.println(value); 4 }

输出结果:

小明

李四

小红

得到key的同时得到key所对应的值

1 Set<String> keys=map.keySet(); 2 for(String key:keys){ 3 System.out.println(key+"--"+map.get(key)); 4 }

输出结果:

jay--小明

zhangsan--李四

marry--小红

1 System.out.println(map.size());// 返回此映射中的键-值映射关系数 2 System.out.println(map.isEmpty());// 如果此映射不包含键-值映射关系,则返回 true

输出结果:

3

false

返回此映射所包含的映射关系的 Set 视图

1 //当我们调用put(key,value)方法时,首先会把key和value封装到
2         //Entry这个静态内部类对象中,把Entry对象再添加到数组中,
3         //所以我们想获取map中的所有键值对时,我们只要获取数组中的所有Entry对象
4         //接下来调用Entry对象中的getKey和getValue方法就能获得键值对
5         Set<Entry<String, String>> entrys= map.entrySet();
6         for(Entry<String,String> entry:entrys){
7             System.out.println(entry.getKey()+"----"+entry.getValue());
8         }

输出结果:

jay----小明

zhangsan----李四

marry----小红

put方法步骤解析
 1           /*
 2          * put方法步骤解析
 3          * HashMap调用默认构造方法会产生一个底层长度为16的Entry数组
 4          * int hash=hash(key.hashCode());
 5          * 首先调用key的hashCode方法来得到一个整数--哈希码
 6          * 把哈希码作为参数传到hash函数中进行运算--散列运算--得到一个整型--散列值
 7          * int i=indexFor(hash,table.length)
 8          * 把散列值和数组的长度来进行运算,最终得到存放到数组的位置(i)
 9          *
10          * HashMap内部的结构是数组链表结构
11          * 因为不同的key有可能算出来的事相同的散列值,根据散列值计算出存放
12          * 到数组的下标会冲突
13          * */

int i=hash(zhang.hashCode());

int j=hash(li.hashCode());

i可能与j相同,假如都为4,则 zhan—‘张三’ 存放在4的位置上,

li—‘李四’ 存放在4的位置上

get方法解析
1             /*
2          * get方法解析
3          * 使用关键字查找时,可能会在同一个散列值位置下有多个key-value,
4          * 多个key-value以链表的形式存放,再一个一个比较,直到找到为止
5          * 若找不到返回null
6          * */
7     

哈希码的产生和使用

① 当调用对象的hashCode()方法时就会返回当前对象的哈希码值。支持此方法是为了提高哈希表的性能;

② hashCode的常协议:

a)  在Java应用程序执行期间,在对同一对象多次调用hashCode方法时,必须一致地返回相同的整数,前提是将对象进行equals比较时所用的信息没有被修改,从某一应用程序的一次执行到同一应用程序的另一次执行该整数无需保持一致;

b)  如果根据equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用hashCode方法都必须生成相同的整数结果;

注:这里说的equals(Object)方法是指Object类中未被子类重写过的equals方法;

c)  如果根据equals(java.lang.Object)方法,两个对象不相等,那么对这两个对象中的任一对象上调用hashCode方法不要求一定生成不同的整数结果。但是,我们应该意识到,为不相等的对象生成不同的整数结果可以提高哈希表的性能;

创建一个Student 类

 1 class Student{
 2     private String name;
 3     private int age;
 4     public Student(String name, int age) {
 5         super();
 6         this.name = name;
 7         this.age = age;
 8     }
 9     public String getName() {
10         return name;
11     }
12     public void setName(String name) {
13         this.name = name;
14     }
15     public int getAge() {
16         return age;
17     }
18     public void setAge(int age) {
19         this.age = age;
20     }
21 }

在主方法中创建对象,赋值,查看元素

1         Map<Student,String> map=new HashMap<Student, String>();
2         map.put(new Student("zhang",20), "张三");
3         map.put(new Student("li",30), "李四");
4         map.put(new Student("wang",20), "王五");
5         map.put(new Student("li",30), "小明");
6         System.out.println(map);
7         System.out.println(map.size());

输出结果:

{[email protected]=小明, [email protected]=张三, [email protected]=李四, [email protected]=王五}

4

此处放入2个new Student("li",30)相同的键,被看作是2个

若要当做1个则要重写hashCode 方法与equals方法,(可生成)。

 1     @Override
 2     public int hashCode() {
 3         final int prime = 31;
 4         int result = 1;
 5         result = prime * result + age;
 6         result = prime * result + ((name == null) ? 0 : name.hashCode());
 7         return result;
 8     }
 9     @Override
10     public boolean equals(Object obj) {
11         if (this == obj)
12             return true;
13         if (obj == null)
14             return false;
15         if (getClass() != obj.getClass())
16             return false;
17         Student other = (Student) obj;
18         if (age != other.age)
19             return false;
20         if (name == null) {
21             if (other.name != null)
22                 return false;
23         } else if (!name.equals(other.name))
24             return false;
25         return true;
26     }

再次执行,输出结果:

{[email protected]=小明, [email protected]=王五, [email protected]=张三}

3

时间: 2024-10-07 14:02:37

Map容器——HashMap及常用API,及put,get方法解析,哈希码的产生和使用的相关文章

Map容器——TreeMap及常用API,Comparator和Comparable接口

TreeMap及常用API ①   TreeMap类通过使用红黑树实现Map接口; ②   TreeMap提供按排序顺序存储键/值对的有效手段,同时允许快速检索; ③   不像散列(HashMap),树映射保证它的元素按关键字升序排序; ④   TreeMap构造方法: a)   TreeMap() b)   TreeMap(Comparator comp) c)   TreeMap(Map m) d)   TreeMap(SortedMap sm) ⑤   TreeMap实现SortedMap

List容器——ArrayList及常用API

List: ①   List容器是有序的collection(也称为序列).此接口的用户可以对List容器中每个元素的插入位置进行精确地控制.用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素.List容器允许插入重复的值,包括null; ②   最常见的两个List接口的实现类是ArrayList和LinkedList; ArrayList及常用API: ①   ArrayList—动态数组; ②   ArrayList类扩展了AbstractList并实现了List接口

List容器——LinkedList及常用API,实现栈和队列

LinkedList及常用API ①   LinkedList----链表 ②   LinkedList类扩展AbstractSequentialList并实现List接口 ③   LinkedList提供了一个链表数据结构 ④   LinkedList有两个构造方法 a)   LinkedList() b)   LinkedList(Collection c) ⑤   除了继承的方法之外,LinkedList类还定义了一些有用的方法用于操作和访问容器中的数据; a)   void addFir

[js高手之路] es6系列教程 - Map详解以及常用api

ECMAScript 6中的Map类型是一种存储着许多键值对的有序列表.键值对支持所有的数据类型. 键 0 和 ‘0’会被当做两个不同的键,不会发生强制类型转换. 如何使用Map? let map = new Map(); 常用方法: set( 键,值 ):  添加新的键值对元素 get( 键 ): 获取键对应的值,如果这个值不存在,返回undefined 1 let map = new Map(); 2 map.set( '0', 'ghostwu' ); 3 map.set( 0, 'gho

Java map 详解 - 用法、遍历、排序、常用API等

尊重原创:http://www.cnblogs.com/lzq198754/p/5780165.html 概要: java.util 中的集合类包含 Java 中某些最常用的类.最常用的集合类是 List 和 Map. Map 提供了一个更通用的元素存储方法.Map 集合类用于存储元素对(称作"键"和"值"),其中每个键映射到一个值. 本文主要介绍java map的初始化.用法.map的四种常用的遍历方式.map的排序以及常用api. | |目录 1Map用法 ·类

JAVA基础学习day16--集合三-Map、HashMap,TreeMap与常用API

一.Map简述 1.1.简述 public interface Map<K,V> 类型参数: K - 此映射所维护的键的类型 key V - 映射值的类型 value 该集合提供键--值的映射.key不能重复,一对对的存储方式 将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值. 1.2.方法 嵌套类摘要 static interface Map.Entry<K,V> 映射项(键-值对). 方法摘要 void clear() 从此映射中移除所有映射关系(可选操

JAVA基础学习-集合三-Map、HashMap,TreeMap与常用API

一.Map简述 1.1.简述 public interface Map<K,V> 类型参数: K - 此映射所维护的键的类型 key V - 映射值的类型 value 该集合提供键--值的映射.key不能重复,一对对的存储方式 将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值. 1.2.方法 嵌套类摘要 static interface Map.Entry<K,V> 映射项(键-值对). 方法摘要 void clear() 从此映射中移除所有映射关系(可选操

java:容器/集合(Map(HashMap,TreeMap))

HashMap: *Map接口:采用是键值对的方式存放数据.无序 *常见的实现类: *--HashMap:基于哈希表的 Map 接口的实现. *常用的构造方法: * HashMap()构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap. * HashMap(int initialCapacity) 构造一个带指定初始容量和默认加载因子 (0.75) 的空 HashMap *常用方法: * put(K key, V value)在此映射中关联指定值与指定键. *

Java容器深入浅出之Map、HashMap、Hashtable及其它实现类

在Java中,Set的底层事实上是基于Map实现的,Map内部封装了一个Entry内部接口,由实现类来封装key-value对,当value值均为null时,key的集合就形成了Set.因此,Map集合具有如下的一些特点: 1. Key集因为是Set的实现,因此是无顺序.不可重复的. 2. Value集是List的实现,因此是可以重复的,每个元素根据key来索引. 3. Map内部包含一个Entry内部接口,用于定义key-value对,由实现类来对外提供查找和设置value的方法. Map的基