[疯狂Java]集合:HashMap、Hashtable(摒弃)、LinkedHashMap、Properties

翻译 2016年05月31日 14:29:34

1. Map最常用的实现类——HashMap:

    1) Map最常见的实现类就和Set最常见的实现类一样都是用哈希表这种数据结构存放数据,它有两个这样的实现类,一个是HashMap,另一个是Hashtable;

    2) Hashtable在Java 1.0就存在了,非常古老,命名也不符合Java规范,并且实现地也非常不好,因此现在已经不用了;

    3) HashMap和HashSet存储原理完全相同,只不过Entry在哈希表中的槽位和桶是由key的hashCode和equals方法共同决定的而已,只要知道这一点就行了;

!!同样存储可变对象时尽量不要在存储之后修改,可能会影响key的唯一性!!

!!HashMap同样也是无序的!

    4) 需要补充的有以下几点:

         i. HashMap允许存放key为null的键值对,但是key不能重复(即不能有两个key为null的Entry,这是必然的),并且value也允许为null(value当然能重复),即key-value都能是null;

         ii. HashMap判断两个value是否相等只用value的equals方法(像containsValue方法中会用到value的equals等);

         iii. 其它只要使用Map中继承的方法即可,HashMap没有对Map扩展什么方法;


2. LinkedHashMap:

    1) 就像LinkedHashSet之于HashSet,LinkedHashMap用一张额外链表维护Entry的插入顺序,并且迭代的时候更加高效;

    2) LinkedHashMap在用forEach默认方法迭代时底层就是对这张额外的链表进行迭代,因此迭代最好优先选用forEach方法;


3. Properties:

    1) 它是Hashtable的子类,专门用来吹属性文件(如Win中的ini文件等);

    2) 由于它继承自Hashtable,因此它底层就是Map,只不过Properties这个Map有点儿特殊:

         i. 专门用来将Map和属性文件关联(可以将属性文件中的key=value对加载到程序中成为Map,也可以将Map写入属性文件,就是以“key=value”的形式写入);

         ii. 由于属性文件中的key-value都是字符串,因此Properties的key-value也只能存放字符串(String);

    3) Properties的专用对象方法(用来和属性文件关联,并以属性文件的形式访问Map中的内容):使用这个类就是专门关联和处理属性文件的,不要把它当成一个Map来使用(要有好的习惯,因为当成纯Map使用,由于它是Hashtable,因此不是特别好,就只用它关联属性文件的功能):

!!从这些方法中可以看到,很多都是synchronized的,即Properties是同步监视的,因此Properties是一个线程安全的类!

         i. String getProperty(String key);   // 根据key获得value

         ii. String getProperty(String key, String defaultValue);  // 如果没有key就返回指定的默认value,即defaultValue

!!Hashtable不允许key-value为null(两个都不能为null),因此不存在key存在但value为null的情况,上面的方法就是指key不存在;

         iii. synchronized Object setProperty(String key, String value);  // 设置一对key-value,如果不存在就是添加,如果已存在就是覆盖(即Map的put),返回覆盖前的value(返回时要转化成String!别忘了);

         iv. synchronized void load(InputStream inStream | Reader reader);  // 从一个输入流(属性文件)中加载key-value对,这个加载是追加不是覆盖!!

         v. void store(OutputStream out | Writer writer, String comments); // 将键值对写入指定的输出流中(属性文件),这个写入是覆盖不是追加!!即覆盖那个文件!

!comments是属性文件开头的注释信息(以#起始);

Java集合学习--HashMap、LinkedHashMap、TreeMap、HashTable

HashMap: 初始化: HashMap中有两个因子影响其性能:初始容量和加载因子。这两个参数都可以在创建时通过构造器传入,如果不指定,默认初始容量=16,加载因子=0.75,加载因子会影响reha...
  • yxinzju
  • yxinzju
  • 2015年08月19日 16:15
  • 808

HashMap、TreeMap、Hashtable、HashSet和ConcurrentHashMap区别

HashMap是基于散列表实现的,时间复杂度平均能达到O(1)。 TreeMap基于红黑树(一种自平衡二叉查找树)实现的,时间复杂度平均能达到O(log n)。TreeMap实现SortedMa...
  • paincupid
  • paincupid
  • 2015年08月18日 09:01
  • 3721

HashMap TreeMap Hashtable LinkedHashMap 区别

map是java中最常用的数据结构之一,在这篇文中,我将说明如何使用不同类型的maps,比如:HashMap,TreeMap,HashTable和LinkedHashMap。 Map概览 在jav...
  • maoyeqiu
  • maoyeqiu
  • 2015年09月27日 14:18
  • 1213

HashTable和HashMap的区别详解

一、HashMap简介       HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。       Has...
  • fujiakai
  • fujiakai
  • 2016年06月04日 19:35
  • 31064

《Java程序性能优化》学习笔记之HashMap和LinkedHashMap

1.HashMap没啥可说的 2.LinkedHashMap是HashMap的子类,在HashMap的基础上加了一个链表,每次put元素都会往链表上加节点。 public LinkedHashMap(...
  • u012104435
  • u012104435
  • 2015年07月30日 12:03
  • 3258

hashmap与Hashtable实现原理浅析

原文地址:http://www.cnblogs.com/lzrabbit/p/3721067.html#h1 HashMap和Hashtable的区别两者最主要的区别在于Hashtable是线程安全,...
  • Double2hao
  • Double2hao
  • 2016年11月30日 18:21
  • 3519

java集合框架12——HashMap和HashTable的区别

前面已经学习了Map的部分内容,主要是HashMap和HashTable,这一节我们来看看它们两有啥异同点。 1. HashMap和HashTable的相同点         HashMap和Hash...
  • eson_15
  • eson_15
  • 2016年04月26日 15:50
  • 3208

深入理解 hash 函数、HashMap、LinkedHashMap、TreeMap 【上】

最主要的实现类有 Hashtable、HashMap、LinkedHashMap和 TreeMap。在 HashTable 的子类中,还有 Properties的实现。Properties 是专门读取...
  • zq602316498
  • zq602316498
  • 2014年09月18日 02:04
  • 3629

Java 1.8 HashMap实现(译注)

How does Java HashMap work?(译注)@(Java基础)[HashMap|集合]译者序作者整个博客只有这一篇文章,而就这一篇文章,却是介绍HashMap与Java中Hash策略...
  • c139352227
  • c139352227
  • 2015年08月22日 18:34
  • 1887

Java集合源码剖析(二)【HashMap、Hashtable】

HashMap源码剖析HashMap简介    HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。    ...
  • gao_chun
  • gao_chun
  • 2015年08月16日 01:39
  • 1472
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[疯狂Java]集合:HashMap、Hashtable(摒弃)、LinkedHashMap、Properties
举报原因:
原因补充:

(最多只允许输入30个字)