关于Map集合
Map接口实现Collection接口,是集合三大接口之一。
Map接口在声明:public interface Map<K,V>;将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值,如果一个键映射到多个值,其前面映射的值将会被后面映射的值所覆盖,其映射关系的实现类主要是HasgMap和TreeMap类,HashMap的映射实现不保存顺序,TreeMap的映射实现,可明确保证其顺序。
1.HashMap
HashMap声明:
public class HashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable
HashMap类是基于哈希表(数组和链表)Map接口的实现,允许使用null键和mull值,非同步,线程不安全,其大致与Hashtable相同,此类不保证映射的顺序,及顺序不能恒久不变。其默认构造方法构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap,也就是当数组容量达到总容量的75%,数组要进行扩充,则要对该哈希表进行 rehash 操作,即重建内部数据结构(哈希表的重新散列)。哈希表保存对象时,根据键(K)对象的hashcode对HashMap此时总容量求余,以确定该键值对代表的映射关系存在数组的哪一个位置,之后在该位置的其他映射关系将以链表的形式存放。
package com.test; import java.util.HashMap;
import java.util.Map;
import java.util.Set; public class HashMapDemo {
public static void hashMap(){
Map<Integer, String> hashmap = new HashMap<>();
hashmap.put(1, "string1");
hashmap.put(2, "string2");
hashmap.put(3, "string3");
hashmap.put(3, "string4");//注意相同键值下的映射关系的覆盖
hashmap.put(null, "string3");
hashmap.put(null, "string4");
/*
* null为作为键时,继续保持键的唯一性(键中只能出现一次),若键有多个映射值,则最后一个映射值覆盖前面的映射值
* null作为值时与键有唯一性,可多次使用
*/
System.out.println("null为键时得到的值:"+hashmap.get(null));
hashmap.put(4, null);//关联键值对
hashmap.put(5, null);
System.out.println("null作为值时返回:"+hashmap.get(5));
/*
* HashMap的遍历
* keySet()返回此映射所包含的所有键的Set视图
*/
System.out.println("******HashMap的遍历******");
Set<Integer> h = hashmap.keySet();
for (Integer i : h) {
System.out.println(hashmap.get(i));
}
}
public static void main(String[] args) {
hashMap();
}
}
运行结果:
null为键时得到的值:string4
null作为值时返回:null
******HashMap的遍历******
string4
string1
string2
string4
null
null
2.Hashtable
Hashtable声明:
public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, Serializable
此类实现一个哈希表,该哈希表将键映射到相应的值。任何非null 对象都可以用作键或值,同步,线程安全,键具有唯一性,同一键值的映射关系后面的赋值会覆盖前面相同键对应的值,其他与HashMap类似。
package com.test; import java.util.Hashtable;
import java.util.Set;
/*
* Hashtable类似于HashMap
* 线程安全,键值对任何一方不能使用null值
*/
public class HashtableDemo {
public static void main(String[] args) {
Hashtable<String,String> hashtable = new Hashtable<>();
hashtable.put("1", "manu1");
hashtable.put("2", "manu2");
hashtable.put("3", "manu3");
// hashtable.put(null, "manu3");//报错
// hashtable.put("4", null);
hashtable.put("3", "manu5");
Set<String> set = hashtable.keySet();
for (String s : set) {
System.out.println(hashtable.get(s));
}
}
}
运行结果:
manu5
manu2
manu1
3.TreeMap
TreeMap类的声明:
public class TreeMap<K,V>
extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, Serializable
TreeMap是基于红黑树实现,是一种平衡二叉树,该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法,非同步,线程不安全,相较HashMap速率稍慢。
package com.test; import java.util.Iterator;
import java.util.Map.Entry;
import java.util.TreeMap; /*
* 基于红黑树实现,又叫平衡二叉树
* 自定义对象作为键时 ,必须实现comparator接口
* 以自然顺序或按照compareto方法规定排序
* 键的唯一性
*/
public class TreeMapDemo {
public static void main(String[] args) {
TreeMap<String,Test> treemap = new TreeMap<>();
Test t1 = new Test(1,"manu1",10);
Test t2 = new Test(2,"manu2",20);
Test t3 = new Test(3,"manu3",30);
treemap.put("a", t1);
treemap.put("a", t2);//Map中键值对的键都具有唯一性,会覆盖前面的
treemap.put("b", t3);
System.out.println(treemap.get("a"));
System.out.println(treemap.get("b"));
/*
* entrySet()
* 返回此映射中包含的映射关系的 Set视图,就是获取键值对对象集合
* 而keySet()返回此映射中包含的键的Set视图 ,就是获取该集合中的K集合
*/
System.out.println("******Iterator******");
Iterator<Entry<String, Test>> i = treemap.entrySet().iterator();
while(i.hasNext()){
System.out.println(i.next());
}
} }
运行结果:
id=2, name=manu2, age=20
id=3, name=manu3, age=30
******Iterator******
a=id=2, name=manu2, age=20
b=id=3, name=manu3, age=30
关于Map集合的更多相关文章
- Java版本:识别Json字符串并分隔成Map集合
前言: 最近又看了点Java的知识,于是想着把CYQ.Data V5迁移到Java版本. 过程发现坑很多,理论上看大部分很相似,实践上代码写起来发现大部分都要重新思考方案. 遇到的C#转Java的一些 ...
- Java常用的几种集合, Map集合,Set集合,List集合
Java中 Object是所有类的根 Java集合常用的集合List集合.Set集合.Map集合 Map接口常用的一些方法 size() 获取集合中名值对的数量 put(key k, value v ...
- Map集合
1:Map (1)将键映射到值的对象. 一个映射不能包含重复的键:每个键最多只能映射到一个值. 键值对的方式存在 (2)Map和Collection的区别? A:Map 存储的是键值对形式的元素,键唯 ...
- MyBatis的一系列问题的处理(遍历Map集合和智能标签和属性和字段不一样的解决办法 和sql片段)(三)
一.字段名与属性名(数据库的名字)不一样怎么办? 方案一:在小配置中配置一个resultMapper <!--方案一:resultMapper 字段名与属性名不一致 --> <res ...
- Map集合及与Collection的区别、HashMap和HashTable的区别、Collections、
特点:将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值. Map集合和Collection集合的区别 Map集合:成对出现 (情侣) ...
- java://Comparator、Comparable的用法(按照要求将map集合的键值对进行顺序输出)
import java.util.*; public class Person implements Comparable<Person>//使Person的属性具有比较性 { priva ...
- Java集合类学习笔记(Map集合)
Map用于保存具有映射关系的数据,因此Map集合里保存着两组数据,一组用于保存Map的key,一组用于保存key所对应的value. Map的key不允许重复. HashMap和Hashtable都是 ...
- java学习第18天(map集合)
Map集合是将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值. 存储的是键值对形式的元素,键唯一,值可以重复,有点类似于数据库中的主键加数据.主要功能有: A:添加功能 put ...
- Map集合 总结
(本人第一次写博客,部分内容有参照李刚老师的疯狂java系列图书,如有遗漏错误,请多指教,谢谢.) Java的集合类可分为Set.List.Map.Queue,其中Set.List.Queue都有共同 ...
- Map集合的应用及其遍历方式
---> HashMap :底层基于哈希表 存储原理也使用哈希表来存放的: 往HashMap添加了元素 ,首先会调用键的hashCode方法 获得一个哈希值,然后 ...
随机推荐
- spring加载过程,源码带你理解从初始化到bean注入
spring在容器启动时,容器正式初始化入口refresh()如下图 ①包括初始化FactoryBean.解析XML注册所有BeanDefinition信息 ②包括注册scope管理类 ③初始化单 ...
- SQUID常用命令
Squid日常维护过程中,常用的一些命令: 1,初始化你在 squid.conf 里配置的 cache 目录squid -z如果有错误提示,请检查你的 cache目录的权限.可以使用使用更改目录权限: ...
- 浅谈Yii-admin的权限控制
说到CMS,最需要有的东西就是权限控制,特别是一些复杂的场景,多用户,多角色,多部门,子父级查看等等.最近在开发一个线下销售的东东,这个系统分为管理员端,省代端,客户端,门店端,销售端, 部门端,部门 ...
- CSS--实现小三角形
<style> html, body { margin: 0; padding: 0; } /*下面用CSS3分别实现向上.下.左.右的三角形*/ .btn-color{ color: # ...
- https://github.com/chenghuige/tensorflow-exp/blob/master/examples/sparse-tensor-classification/
https://github.com/chenghuige/tensorflow-exp/blob/master/examples/sparse-tensor-classification/ ...
- android系统release签名
转自:http://blog.csdn.net/yangkai6121/article/details/38682321 为什么需要给Android系统签个名才能进行CTS认证呢?原来我们通过make ...
- oracle表分区以及普表转分区表(转)
概述 Oracle的表分区功能通过改善可管理性.性能和可用性,从而为各式应用程序带来了极大的好处.通常,分区可以使某些查询以及维护操作的性能大大提高.此外,分区还可以极大简化常见的管理任务,分区是构建 ...
- shell循环语句
所有的笔记只记录一些例子,根据例子解释一些出现的语法,不介绍具体的语法 2015-07-01 21:58:33 星期三 for循环 用例一用for循环在家目录下创建aaa1-aaa10,然后在aaa1 ...
- CentOS Linux服务器安全设置
转自:http://www.osyunwei.com/archives/754.html 引言: 我们必须明白:最小的权限+最少的服务=最大的安全 所以,无论是配置任何服务器,我们都必须把不用的服务关 ...
- to_char函数
TO_CHAR 是把日期或数字转换为字符串,不能指定字符串长度. 使用TO_CHAR函数处理日期:TO_CHAR(number, '格式') eg:TO_CHAR(salary,'$99,999.99 ...