接上篇“java集合类(四)About Set”

这次学完Map之后,就剩队列的知识,之后有关java集合类的学习就将告一段落,之后可能会有java连接数据库,I/O,多线程,网络编程或Android方面的东西,不过现在还不能确定!

  • Talk About Map:

interface Map<key,value>:键值对对象,使用key查找value,就像映射表(关联数组/字典)一样,可以使用一个对象来查找另一个对象

key:应该是唯一的,不直接接受基本类型,但对应的包装类对象可以

value:不唯一,即相同的value可对应不同的key,也不直接接受基本类型,包装类则可以,map值也可以是其他容器,包括map本身

All Known Subinterfaces:
Bindings, ConcurrentMap<K,V>, ConcurrentNavigableMap<K,V>, LogicalMessageContext, MessageContext, NavigableMap<K,V>, SOAPMessageContext, SortedMap<K,V>
All Known Implementing Classes:
AbstractMap, Attributes, AuthProvider, ConcurrentHashMap, ConcurrentSkipListMap, EnumMap, HashMap, Hashtable, IdentityHashMap, LinkedHashMap, PrinterStateReasons, Properties, Provider, RenderingHints, SimpleBindings, TabularDataSupport, TreeMap, UIDefaults, WeakHashMap

Map接口本身拥有的方法也不是很多,也很容易掌握,常用到的Map子类主要有:HashMap,LinkedHashMap,TreeMap,WeakHashMap,ConcurrentHashMap,IdentityHashMap(这几种Map的可比较见下文),关于前三种Map,他们的特性跟之前在java集合类(四)About Set的那三种Set很类似,可以联想记忆,而后三种一般初学者(比如我)较少遇到,我只能尽可能找资料,但也不能面面俱到,毕竟只是涉及初级应用,读者若有什么建议,或资料也可告知我,才能丰富其中的内容。下面开始学习:

  • 常见Map的比较:

1)HashMap:最常用的Map,基于hash(散列表)的实现,可放任意对象;修改equals()的同时也要修改hashCode();插入和查询“键值对”的开销是固定的,可以通过构造器设置容量和负载因子,以调整容器的性能

2)LinkedHashMap:类似与HashMap,遍历它的顺序是其键值对插入的顺序,或是最近最少使用的次序,只比HashMap慢一点;而在迭代访问时反而更快,因为它使用链表维护内部次序

3)TreeMap:与TreeSet类似,底层基于红黑树。它是有序的(按键排序),放入其中键对象都要实现Comparable接口/Comparator;它是唯一有返回子树subMap()方法的Map

4)WeakHashMap:弱键映射,允许释放映射所指向的对象;若映射之外没有引用指向某个键,那么此键可能被垃圾回收器回收

5)ConcurrentHashMap:一种线程安全的Map,不涉及同步锁

6)IdentityHashMap:使用==代替equals()对键进行比较的散列映射

说明:Map中的任何一个键都必须具有一个equals()方法,如若键被用于散列Map,如HashMap,LinkedHashMap,那它还必须具有恰当的hashCode()方法;而键被用于TreeMap,那它则必须实现Comparable

  • About HashMap:
All Implemented Interfaces:Serializable, Cloneable, Map<K,V>
Direct Known Subclasses:LinkedHashMap, PrinterStateReasons
基本方法实例:
import java.util.*;

public class Mapdemo{
public static void main(String[] agrs){
Random r = new Random(47);
Map<Integer,Integer> m = new HashMap<Integer,Integer>();
for(int i = 0; i<1000;i++){
int n = r.nextInt(20);
Integer g = m.get(n);
m.put(n, g==null?1:g+1);
}
System.out.println(m);
//constructors
HashMap<String,String> hm = new HashMap<String,String>(6);
HashMap<String,String> hm1 = new HashMap<String,String>(hm);
//the second para is loadfactor
HashMap<String,Integer> hm2 = new HashMap<String,Integer>(5,1f);
HashMap<String,List<Integer>> hm3 = new
HashMap<String,List<Integer>>(); hm.put("allen", "dog");
hm.put("jason", "cat");
hm.put("John", "snake");
System.out.println(hm);
System.out.println(hm.containsKey("ketty"));
System.out.println(hm.containsValue("cat"));
System.out.println(hm.get("allen")); hm3.put("integer", new ArrayList(Arrays.asList(1,2,3)));
System.out.println(hm3);
}
}

 输出:

{0=42, 1=44, 2=53, 3=43, 4=44, 5=53, 6=42, 7=53, 8=46, 9=56, 10=58, 11=55, 12=48, 13=55, 14=52, 15=50, 17=50, 16=53, 19=52, 18=51}
{jason=cat, allen=dog, John=snake}
false
true
dog
{integer=[1, 2, 3]}

# 为什么HashMap能够提高查找速度?

A:HashMap使用了特殊的值(散列码)来取代对键对象的缓慢搜索,散列码是相对唯一的,用以代表对象的int值,它是通过将该对象的某些信息进行转换而生成的;而hashCode()是Object对象中的方法,所以所有的对象都能产生散列码

大家若对HashMap的实现原理感兴趣,我可以推荐一篇博文:HashMap的实现原理 (转自csdn  @AlphaWang)

  • About SortedMap:
All Superinterfaces:Map<K,V>
All Known Subinterfaces:ConcurrentNavigableMap<K,V>, NavigableMap<K,V>
All Known Implementing Classes:ConcurrentSkipListMap, TreeMap
最常用实现类的为TreeMap,实例如下:
public void sortedmapdemo(){
TreeMap<Integer,String> t = new TreeMap<Integer,String>();
t.put(1,"apple");
t.put(2, "peal");
t.put(3, "banana");
t.put(4, "orange");
System.out.println(t);
System.out.println(t.firstKey());
System.out.println(t.lastKey());
System.out.println(t.subMap(2, 4));
System.out.println(t.headMap(3));
System.out.println(t.tailMap(2));
Iterator<Integer> it = t.keySet().iterator();
for(int i = 0; i<4;i++){
System.out.println(it.next());
}
}

  输出:

{1=apple, 2=peal, 3=banana, 4=orange}
1
4
{2=peal, 3=banana}
{1=apple, 2=peal}
{2=peal, 3=banana, 4=orange}
1
2
3
4

说明:TreeMap的其他方法,如构造方法,comparator()等,可参考JDK文档说明使用!

  • About LinkedHashMap:
public void linkedhashmapdemo(){
LinkedHashMap<Integer,String> lm =
new LinkedHashMap<Integer,String>();
lm.put(1, "bed");
lm.put(2, "light");
lm.put(3, "desk");
lm.put(4, "book");
System.out.println(lm);
//LRU(least-recently-used) order:按使用频率排序
lm = new LinkedHashMap<Integer,String>(10,0.75f,true);
lm.put(1, "bed");
lm.put(2, "light");
lm.put(3, "desk");
lm.put(4, "book");
System.out.println(lm);
for(int i = 1;i<3;i++)
lm.get(i); //使用频率高的会放在队列后
System.out.println(lm);
lm.get(1); //频率最高排最后
System.out.println(lm);
}

输出:

{1=bed, 2=light, 3=desk, 4=book}
{1=bed, 2=light, 3=desk, 4=book}
{3=desk, 4=book, 1=bed, 2=light}
{3=desk, 4=book, 2=light, 1=bed}

说明:上面HashMap和LinkedHashMap代码中的构造方法中涉及到loadfactor(装填因子)(构造方法中为float型),在数据结构中,hash表的装填因子定义为:

α = 表中记录数/hash表长     即α表示hash表的装满程度,α值越小,发生冲突的可能性就越小,即rehash的几率就越低,反之,...

下一节是关于“java集合类(六)About Queue”,敬请期待!

###    学习从来都是一个过程,对对错错对对...若文中有错误,还望读者批评指出      ###

java集合类(五)About Map的更多相关文章

  1. 面试3——java集合类总结(Map)

    1.概述: Java 中的map集合使用键值对(key-value)来保持数据,其中值(value)可以重复,键(key)必须唯一,但最多只能有一个key为空,它的主要实现类有HashMap.Hash ...

  2. 【转载】Java集合类Array、List、Map区别和联系

    Java集合类主要分为以下三类: 第一类:Array.Arrays第二类:Collection :List.Set第三类:Map :HashMap.HashTable 一.Array , Arrays ...

  3. Java集合类: Set、List、Map、Queue使用场景梳理

    本文主要关注Java编程中涉及到的各种集合类,以及它们的使用场景 相关学习资料 http://files.cnblogs.com/LittleHann/java%E9%9B%86%E5%90%88%E ...

  4. Java集合类: Set、List、Map、Queue使用

    目录 1. Java集合类基本概念 2. Java集合类架构层次关系 3. Java集合类的应用场景代码 1. Java集合类基本概念 在编程中,常常需要集中存放多个数据.从传统意义上讲,数组是我们的 ...

  5. 基础知识《六》---Java集合类: Set、List、Map、Queue使用场景梳理

    本文转载自LittleHann 相关学习资料 http://files.cnblogs.com/LittleHann/java%E9%9B%86%E5%90%88%E6%8E%92%E5%BA%8F% ...

  6. java 集合类Array、List、Map区别和优缺点

    Java集合类主要分为以下三类: 第一类:Array.Arrays 第二类:Collection :List.Set第三类:Map :HashMap.HashTable 一.Array , Array ...

  7. Java集合排序及java集合类详解--(Collection, List, Set, Map)

    1         集合框架 1.1         集合框架概述 1.1.1         容器简介 到目前为止,我们已经学习了如何创建多个不同的对象,定义了这些对象以后,我们就可以利用它们来做一 ...

  8. Java集合类: Set、List、Map、Queue使用场景

    目录 1. Java集合类基本概念 2. Java集合类架构层次关系 3. Java集合类的应用场景代码 1. Java集合类基本概念 在编程中,常常需要集中存放多个数据.从传统意义上讲,数组是我们的 ...

  9. Java集合类——Set、List、Map、Queue接口

    目录 Java 集合类的基本概念 Java 集合类的层次关系 Java 集合类的应用场景 一. Java集合类的基本概念 在编程中,常需要集中存放多个数据,数组是一个很好的选择,但数组的长度需提前指定 ...

随机推荐

  1. JavaScript--正则表达式(笔记)

    一 什么是正则表达式 // 正则表达式(regular expression)是一个描述字符模式的对象; // JS定义RegExp类表示正则表达式; // String和RegExp都定义了使用正则 ...

  2. C++ 单链表的基本算法

    线性表是最简单,最常用的一种数据结构.线性表的逻辑结构是n个数据元素的有限序列(a1,a2,…,an).而线性表的物理结构,我们已经学习过顺序表,也就是数组 :另一种线性表的物理结构——链表 . 什么 ...

  3. C# 匿名方法及Lambda表达式

    1.匿名方法 定义:匿名方法不能直接在类中定义,而是在给委托变量赋值的时候,需要赋值一个方法,此时可以“现做现卖”,定义一个匿名方法传递给该委托. 举实例说明: 实例一:无参数,无返回值的一个匿名方法 ...

  4. mac(osx) apache无法启动 localhost无法访问服务器[]

    问题描述:由于删除了/private/var/log下面的日志,导致重启电脑后apache无法正常工作. 删除log的初衷是:当系统用久了,日志文件占据了几十个G的硬盘容量. 造成的后果:重启电脑后a ...

  5. 【学习笔记】【C语言】赋值运算

    将某一数值赋给某个变量的过程,称为赋值. 1. 简单赋值 C语言规定,变量要先定义才能使用,也可以将定义和赋值在同一个语句中进行 int a = 10 + 5;的运算过程 a = b = 10;的运算 ...

  6. javascript笔记——前端实现分页和查询

    //Modal function Modal(obj){ var that = this; that.ref = ""; that.obj = obj; that.init(); ...

  7. 10款让人惊叹的HTML5/jQuery图片动画特效

    1.HTML5相册照片浏览器 可连接Flickr照片服务 以前我们经常会分享一些jQuery相册浏览插件,效果不错,实用性也很强.不过如果能利用HTML5来实现相册浏览器,那么相册浏览效果肯定会更加炫 ...

  8. ECC校验原理以及在Nand Flash中的应用

         本篇文章主要介绍ECC基本原理以及在Nand Flash中的应用,本文记录自己对ECC校验原理的理解和学习. ECC介绍      ECC,全称为Error Correcting Code, ...

  9. Window 8.1 计时器功能及图片切换

    <Canvas Margin="450,0" Width="795" Grid.Column="1"> <Image Ma ...

  10. Mysql 正则获取字段的交集【转】

    问题描述 比如table1中有两条记录 name no a    2,9 b    8,10 然后有一串字符串,是0,1,2,3,4 然后通过一条sql,找出no为2,9的记录来``` 因为字符串中有 ...