Java集合之Map接口
Map使用键值对来存储数据,将键映射到值对象,一个映射不能包含重复的键,每一个键最多只能映射到一个值。Map接口的具体实现类:HashMap,Hashtable,TreeMap,LinkedHashMap
1)HashMap
基于哈希表(哈希表学习地址)的Map接口实现。允许使用null值和null键,不保证映射的顺序,特别是不保证顺序恒久不变。它除了非同步和允许使用null外,与Hashtable大致相同。
HashMap实现原理:
1.HashMap默认数组大小为16,加载因子为0.75,当数组使用量达到数组长度*加载因子时,需要进行扩充。
2.HashMap是以数组为头,连接链表形成的(要计算key的hashcode值),根据散列值求出对象在哈希表的存储位置,相同位置上的多个数据以链表方式连接,每次先加入的对象放进链表头。

示例代码:
Java代码
publicstaticvoidmain(String[] args){
Map<Integer, String>maps=newHashMap<Integer, String>();
maps.put(1,"小黑");
maps.put(2,"小白");
maps.put(null,null);
maps.put(10, "老王");
System.out.println("size: "+maps.size());
//根据key获取对象值
System.out.println(maps.get(10));
//是否存在此键
System.out.println(maps.containsKey(2));
//是否存在此值
System.out.println(maps.containsValue(null));
//遍历
Set<Entry<Integer,String>>entry=maps.entrySet();
Iterator<Entry<Integer,String>>iter=entry.iterator();
while(iter.hasNext())
{
System.out.println(iter.next());
}
//清除map
maps.clear();
}
HashMap是线程不安全的,非同步的,当需要重新散列时,数组扩大为原来的两倍,将会把所有数据重新进行插入,此时可能会破换原来的顺序,所有HashMap不能保证映射顺序。HaspMap的重新散列会影响性能。
2)Hashtable
此类实现了哈希表,该哈希表将键映射到相对应的值。任何非null都可以用作键或值,为了成功的在哈希表中存储和获取对象,用作键的对象必须实现hashCode方法和equals方法。
用法基本和HashMap相同,不过多介绍
HashMap和Hashtable的区别
1.HashMap可以使用null作为键或值,Hashtable不可以
2.HashMap是非同步的,线程不安全,而Hashtable是同步的,线程安全
3.Hashtable的默认容量为11,而HashM的默认容量为16。
3)TreeMap
基于红黑树显示的,该映射根据其键的自然排序进行排序,或者根据创建映射时提供的Comparator进行排序。所以,TreeMap使用自定义类作为key时要实现Comparable接口。
如:
自定义Person类,实现Comparable接口。使用age属性进行排序
Java代码
publicclassPerson implementsComparable<Person>{
publicString name;
publicintage;
publicPerson(String name,intage)
{
this.name=name;
this.age=age;
}
publicintcompareTo(Person o) {
if(o==null)
thrownewNullPointerException();
if(this.age>o.age)
return1;
if(this.age<o.age)
return-1;
return0;
}
@Override
publicString toString() {
return"Person [name="+ name + ", age="+ age + "]";
}
}
调用代码:
Java代码
publicstaticvoidmain(String[] args){
Map<Integer, String>maps=newTreeMap<Integer, String>();
maps.put(1,"小黑");
maps.put(2,"小白");
maps.put(10, "老王");
//遍历
Set<Entry<Integer,String>>entry=maps.entrySet();
Iterator<Entry<Integer,String>>iter=entry.iterator();
while(iter.hasNext())
{
System.out.println(iter.next());
}
//清除map
maps.clear();
//-----------------------------使用自定义Person做key
Map<Person, String>map=newTreeMap<Person, String>();
map.put(newPerson("xiaobai", 20), "xiaobai");
map.put(newPerson("xiaohei", 18), "xiaohei");
map.put(newPerson("xiaohong", 30), "xiaohong");
//遍历
Set<Entry<Person,String>>entry1=map.entrySet();
Iterator<Entry<Person,String>>iter1=entry1.iterator();
while(iter1.hasNext())
{
System.out.println(iter1.next());
}
//清除map
map.clear();
}
运行结果:

技术分享:www.kaige123.com
Java集合之Map接口的更多相关文章
- Java集合框架Map接口
集合框架Map接口 Map接口: 键值对存储一组对象 key不能重复(唯一),value可以重复 常用具体实现类:HashMap.LinkedHashMap.TreeMap.Hashtable Has ...
- Java集合中Map接口的使用方法
Map接口 Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value: Map中的键值对以Entry类型的对象实例形式存在: 建(key值 ...
- Java集合框架——Map接口
第三阶段 JAVA常见对象的学习 集合框架--Map集合 在实际需求中,我们常常会遇到这样的问题,在诸多的数据中,通过其编号来寻找某一些信息,从而进行查看或者修改,例如通过学号查询学生信息.今天我们所 ...
- JAVA集合框架 - Map接口
Map 接口大致说明(jdk11): 整体介绍: 一个将键映射到值的(key-value)对象, 键值(key)不能重复, 每个键值只能影射一个对象(一一对应). 这个接口取代了Dictionary类 ...
- Java:集合,Map接口框架图
Java集合大致可分为Set.List和Map三种体系,其中Set代表无序.不可重复的集合:List代表有序.重复的集合:而Map则代表具有映射关系的集合.Java 5之后,增加了Queue体系集合, ...
- Java集合——集合框架Map接口
1.Map接口 public interface Map<K,V>将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值. 2.HashMap.Hashtable.Tr ...
- java集合 之 Map集合
Map用于保存具有映射关系的数据,具有两组值:一组用于保存Map中的key:另一组用于保存Map中的value,形成key-value的存储形式. Map集合中包含的一些方法: void clear( ...
- Java集合之Collection接口
java的集合分为三大接口,分别是Collection,Map,Iterator,集合接口和类在java.util包中,此次主要介绍三大接口之一的Collection接口. 一些Collection允 ...
- java 集合(Map)
-------------------|Map 储存的数据都是以键值对的形式,键不可重复,值可重复. ----------------------------| HashMap ---------- ...
随机推荐
- MyBatis的foreach语句详解
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的属性主要有 item,index,collection,open,separator,close.it ...
- NSOperation基本使用
NSOperation简单介绍 a. 是OC语言中基于GCD的面向对象的封装 b. 使用起来比GCD更加简单(面向对象) c. 提供了一些用GCD不好实现的功能 d. 苹果推荐使用,使用NSOper ...
- linux中断申请之request_threaded_irq
转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=21977330&id=3755609 在linux里,中断处理分 ...
- Redis经验谈
新浪作为全世界最大的Redis用户,在开发和运维方面有非常多的经验.本文作者来自新浪,希望能为业界提供一些亲身经历,让大家少走弯路. 使用初衷 从2010年上半年起,我们就开始尝试使用Redis,主要 ...
- [编辑器] Tab转换成空格
Notepad++: 设置 -> 首选项 -> 制表符设置 怎样设置EditPlus中Tab用空格替换http://jingyan.baidu.com/article/63f236280b ...
- oracle 执行计划详解
简介: 本文全面详细介绍oracle执行计划的相关的概念,访问数据的存取方法,表之间的连接等内容. 并有总结和概述,便于理解与记忆! +++ 目录 --- 一.相关的概念 ...
- js 默认行为取消
js 默认行为取消 可以简单的 return false; 看需求吧 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transit ...
- ./configure会报错:pr command not found
1.2 安装coreutils 请检查${MinGWDir}/msys/1.0/bin(默认为C:/MinGW/msys/1.0/bin)下有没有pr.exe,如果没有,那么在编译libav过程 ...
- BZOJ 1072: [SCOI2007]排列perm 状态压缩DP
1072: [SCOI2007]排列perm Description 给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0).例如123434有90种排列能被2整除,其中末位为 ...
- 学习NGUI前的准备NGUI的相关信息
学习NGUI前的准备NGUI的相关信息 第1章 学习NGUI前的准备 NGUI是Unity最重要的插件,在Unity资源商店(Asset Store)的付费排行榜中始终名列前茅,如图1-1所示.本章 ...