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

相关文章推荐

linq to sql 高速缓存的应用

将对象映射到关系数据 利用SQL LINQ图形化设计工具进行映射 SQL LINQ设计器

[集合]浅谈 properties 和hashMap的区别以及用法

总的来说,properties是HashTable的一个子类,properties的方法与HashTable类似, 但是对HashTable又有一定的增强。

[疯狂Java]集合:SortedSet、TreeSet

1. SortedSet:     1) 顾名思义就是有序的Set,但是它的有序和LinkedHashSet不一样,LinkedHashSet维护的是插入时的顺序,而SortedSet维护的是元素之间...

[疯狂Java]集合:List、ListIterator

1. Java的List集合简介:     1) List是一个抽象接口,其代表了一种有序(插入顺序)、可重复的集合,简单地来看完全可以当成一个可变长的数组;     2) 它有不同的实现类:Arra...

[疯狂Java]集合:EnumSet、各Set性能分析(选择)

1. EnumSet——专门存放枚举类型元素的Set:     1) EnumSet只能存放一种枚举类型的元素,具体存放什么枚举类型的元素可以通过两种方法指定,一种是显式,一种是隐式;     2) ...

[疯狂Java]集合:Queue、PriorityQueue

1. Queue:     1) Java专门提供的一种表示队列的数据结构,直接继承自Collection,也是一种抽象接口;     2) 其有很多形式的实现类:PriorityQueue(堆,即优...

[疯狂Java]集合:ArrayList、Vector(摒弃)、Arrays.ArrayList(只读、不可变长)

1. List的实现类:     1) 最常见的两个实现类分别是ArrayList(用数组实现)、LinkedList(链表实现),但由于LinkedList具有双端队列的特性因此这里先不介绍Link...

[疯狂Java]集合:Map

1. Map简介:     1) 首先Map和Collection在一个层级上,都是抽象集合接口,表示字典(存放键值对的集合,其中键不能重复(是键值对的唯一标识));     2) 但是Map的实...

[疯狂Java]集合:Deque(双端队列)以及两个实现(ArrayDeque、LinkedList)、Stack(摒弃)、各线性表性能分析

1. Deque:     1) 是Queue的子接口,表示双端队列,即两端(队尾和队首)都能插入和删除的特殊队列;     2) 当然,Deque可以使用Queue的全部方法,但是自己也扩展了很多方...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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