关闭

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

标签: 疯狂Java集合HashMapHashtable摒弃LinkedHashMap
363人阅读 评论(0) 收藏 举报
分类:

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是属性文件开头的注释信息(以#起始);

0
1

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:274743次
    • 积分:5439
    • 等级:
    • 排名:第4902名
    • 原创:149篇
    • 转载:0篇
    • 译文:128篇
    • 评论:26条
    文章分类
    最新评论