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,本身并没有增加任何新的方法;

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

添加及输出

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

输出结果:

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

获取map中的所有键

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

输出结果:

jay

zhangsan

marry

获取map中的所有值

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

输出结果:

小明

李四

小红

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

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

输出结果:

jay--小明

zhangsan--李四

marry--小红

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

输出结果:

3

false

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

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

输出结果:

jay----小明

zhangsan----李四

marry----小红

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

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

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

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

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

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

哈希码的产生和使用

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

② hashCode的常协议:

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

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

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

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

创建一个Student 类

 class Student{
private String name;
private int age;
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}

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

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

输出结果:

{com.iotek.map.Student@7852e922=小明, com.iotek.map.Student@2a139a55=张三, com.iotek.map.Student@15db9742=李四, com.iotek.map.Student@6d06d69c=王五}

4

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

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

     @Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}

再次执行,输出结果:

{com.iotek.map.Student@14e0=小明, com.iotek.map.Student@379830=王五, com.iotek.map.Student@6e7fa19=张三}

3

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

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

    TreeMap及常用API ①   TreeMap类通过使用红黑树实现Map接口; ②   TreeMap提供按排序顺序存储键/值对的有效手段,同时允许快速检索; ③   不像散列(HashMap), ...

  2. Set容器——HashSet及常用API

    Set容器特点: ①   Set容器是一个不包含重复元素的Collection,并且最多包含一个null元素,它和List容器相反,Set容器不能保证其元素的顺序; ②   最常用的两个Set接口的实 ...

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

    LinkedList及常用API ①   LinkedList----链表 ②   LinkedList类扩展AbstractSequentialList并实现List接口 ③   LinkedLis ...

  4. List容器——ArrayList及常用API

    List: ①   List容器是有序的collection(也称为序列).此接口的用户可以对List容器中每个元素的插入位置进行精确地控制.用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜 ...

  5. Set容器——TreeSet及常用API

    TreeSet及常用Api ①   TreeSet为使用树来进行存储的Set接口提供了一个工具,对象按升序存储,访问和检索很快; ②   在存储了大量的需要进行快速检索的排序信息的情况下,TreeSe ...

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

    ECMAScript 6中的Map类型是一种存储着许多键值对的有序列表.键值对支持所有的数据类型. 键 0 和 ‘0’会被当做两个不同的键,不会发生强制类型转换. 如何使用Map? let map = ...

  7. Java学习之模拟纸牌游戏,List的ArrayList,Map的HashMap,重写Collections类的sort方法对指定类进行通过特定属性排序,输入异常处理等的学习

    首先放上测试效果图 设计框架 具体的代码实现 创建玩家类 public class Player implements Comparable<Player>{ int id; String ...

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

    尊重原创: http://www.cnblogs.com/lzq198754/p/5780165.html 概要: java.util 中的集合类包含 Java 中某些最常用的类.最常用的集合类是 L ...

  9. JsRender 前端渲染模板常用API学习

    JsRender 常用API 1. $.templates() $.templates()方法是用来注册或编译模板的,使用的情况有以下几种. 把html字符串编译编译成模板 获取使用script标签声 ...

随机推荐

  1. SQL Server 2012安装配置(Part3 )

    SQL Server 2012安装配置(Part1 ) SQL Server 2012安装配置(Part2 ) SQL Server 2012安装配置(Part3 ) 3 客户端安装 3.1 安装客户 ...

  2. JavaScript_6_函数

    函数是由事件驱动的或者当它被调用执行的可重复使用的代码块 调用带参数的函数 带有返回值的函数 <!DOCTYPE html> <html> <head> <t ...

  3. 洛谷 P2424 约数和

    题目背景 Smart最近沉迷于对约数的研究中. 题目描述 对于一个数X,函数f(X)表示X所有约数的和.例如:f(6)=1+2+3+6=12.对于一个X,Smart可以很快的算出f(X).现在的问题是 ...

  4. 如何远程连接Windows server上的MySQL服务

    废话不多说,直接开干 首先要打开服务器的MySQL端口号:3306(当然,也可以把服务器的防火墙直接关闭,不过不安全) 1.打开服务器管理器,有个高级安全Windows防火墙,下面有一个入站规则, 右 ...

  5. CF-1140 E - Palindrome-less Arrays

    题意:给定一个没有填完的序列,数值为-1表示你可以用 1~k 中的数字去覆盖它,求将该序列填充后,不存在长度为奇数的回文串的方案数 分析: 使之不存在长度为奇数的回文串,只需要满足不存在长度为3的回文 ...

  6. scipy应用积分操作

    1.什么是scipy? SciPy是一款方便.易于使用.专为科学和工程设计的Python工具包.它包括统计,优化,整合,线性代数模块,傅里叶变换,信号和图像处理,常微分方程求解器等等. integra ...

  7. PHP四种序列化方案

    原文地址:https://t.ti-node.com/thread/... 数据的序列化是一个非常有用的功能,然而目测很多人跟我一样,在刚接触这玩意的时候压根就不理解这货色到底是干啥用的,反正老师说了 ...

  8. java的面向对象 (2013-09-30-163写的日志迁移

    1)面向对象的特征 1. 抽象:(从java方面来说抽象大多数人还是把它作为java中的一种特征来对待) 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象包括 ...

  9. python计算机基础(三)

    简述Python垃圾回收机制: 当x=10,赋值x=11,的代码,也就是10没有对应的变量名, 10在python眼中相当于垃圾,就会被清理掉,释放内存. 对于下述代码: x = 10 y = 10 ...

  10. Java-basic-2-

    接口只定义派生要用到的方法,但是方法的具体实现完全取决于派生类. 如果一个类定义在某个包中,那么package语句应该在源文件的首行. 如果源文件包含import语句,那么应该放在package语句和 ...