java集合——映射表+专用集合映射表类

【0】README

0.1) 本文描述转自 core java volume 1, 源代码为原创,旨在理解 java集合——映射表+专用集合映射表类 的相关知识;
0.2) for full source code , please visit https://github.com/pacosonTang/core-java-volume/blob/master/chapter13/MapTest.java + https://github.com/pacosonTang/core-java-volume/blob/master/chapter13/MapTestOne.java + https://github.com/pacosonTang/core-java-volume/blob/master/chapter13/EnumSetAndEnumMapTest.java


【1】 映射表(键值对——HashMap + TreeMap)

1.1)映射表: 通常,我们知道某些键的信息, 想要查找与之对应的元素, 映射表就是为此目的而设计的;(键值对)

  • 1.1.1)java类为映射表提供了两个通用的实现: HashMap 和 TreeMap, 它们都实现了 Map 接口;
  • 1.1.2)散列映射表对键进行散列, 树映射表用键的整体顺序对元素进行排序,并将其组织成搜索树;
  • 1.1.3)散列或 比较函数只能作用于键。 与键关联的值不能进行散列或比较;(只与key有关, 与value 无关);

1.2)应该选择 散列映射还是树映射表呢? 如果不需要按照排列顺序访问键, 就最好选择散列;(TreeMap 有序, 而HashMap无序)

  • 1.2.1)看个荔枝:
Map<String, Employee> staff = new HashMap<>(); // HashMap implements Map
Employee harry = new Employee();
staff.puf("hehe", harry);

对以上代码的分析(Analysis):

  • A1)要检索一个对象,提供一个键:
String s = "hehe";
e = staff.get(s) ; //gets harry
  • 如果在 映射表中没有与给定键对应的信息, get 将返回 null;
  • A2) remove方法用于从映射表中删除给定键的对应元素, 而 size 用户返回映射表的元素数目;

1.3)获得映射表的视图 (干货)

  • 1.3.1)映射表有3个视图:键集、值集 和 键值对集。键集和键值集对形成了一个集合,因为在映射表中一个键只能有一个副本。
  • 1.3.2)下面方法将返回 3个 视图:
Set<K> keySet();
Collection<K> values();
Set<Map.Entry<K,V>> entrySet

Attention)

  • A1) keySet 既不是 HashSet 也不是 TreeSet, 而是实现了 Set 接口的某个其他类的对象;
  • A2) Set接口扩展了 Collection接口, 因此,可以与使用任何集合一样使用 keySet;

  • 1.3.3)看个荔枝:

Set<String> keys =  map.keySet();
for(String key : keys)
{do sth with key
}

Hint)

  • H1)如果想要查看键和值, 就可以通过枚举 各个条目查看,以避免对值进行查找。可以使用下面的代码框架:
for(Map.Entry<String , Employee> entry: staff.entrySet())
{String key = entry.getKey();Employee e = entry.getValue();do sth with key
}
  • H2)如果调用迭代器的 remvoe方法, 实际上就从映射表中删除了 键以及对应的值。 但是, 不能将元素添加到 键集的视图中KeySet;如果试图调用add 方法, 将会抛出一个 UnsupportedOperationException异常;

1.4)看个荔枝:
这里写图片描述

API java.util.Map<K, V> 1.2
V get(OBject key)
V put(K key, V value)
void putAll(Map<? extends K, ? extends V> entries)
boolean containsKey(Object key)
boolean containsValue(Object value)
Set<Map.Entry<K,v> entrySet>
Set<K> keySet()
Collection><V> values();API java.util.Map.Entry<K, V> 1.2
K getKey()
V getValue()
V setValue(V newValue)API java.util.HashMap<K, V> 1.2
HashMap()
HashMap(int initialCapacity)
HashMap(int initialCapacity, flaot loadFactor)API java.util.TreeMap<K, V> 1.2
TreeMap(Comparator<? super K> c)
TreeMap(Map<? super K, ? extends V> entries)
TreeMap(SortedMap<? extends K, ? extends V> entries)API java.util.SortedMap<K, V> 1.2
Comparator<? super K> comparator()
K firstKey()
K lastKey()

【2】专用集合映射表类

2.1)弱散列映射表(WeakHashMap)

  • 2.1.1)出现的问题: 设计 WeakHashMap 类是为了解决一个有趣的问题。 如果有一个值, 对应的键已经不再使用了,将会出现什么情况呢?假定对某个键的最后一次引用已经消亡, 不再有任何途径引用这个值的对象了。 但是,由于在程序中的任何部分没有再出现这个键, 所以,这个键值对无法从映射表中删除。 为什么垃圾回收器不能删除它呢? 难道删除无用的对象不是垃圾回收器的工作吗?
  • 2.1.2)垃圾回收器: 它跟踪活动的对象, 只要映射表对象是活动的, 其中的所有桶都是活动的, 它们不能被回收。
  • 2.1.3)因此,需要由程序负责从长期存活的映射表中删除那些无用的值。或者使用 WeakHashMap 完成这件事情。
  • 2.1.4)当对键的唯一引用来自散列条目时, 这一数据结构与垃圾回收器协同工作一起删除键值对;

2.2)了解 WeakHashMap的内部运行情况: WeakHashMap 使用 弱引用(weak reference)保存键。

  • WeakReference对象将引用保存到另外一个对象中, 在这里,就是散列表键。对于这种类型的对象,垃圾回收器用一种特有的方式进行处理。 通常,如果垃圾回收器发现这个特定的对象已经没有他人引用了,就将其回收。然而, 如果某个对象只能由 WeakReference 引用, 垃圾回收器仍然会回收它, 但要将引用这个对象的弱引用放入队列中。 WeakHashMap 将周期性地检查队列, 以便找出新添加的弱引用。 一个弱引用进入队列意味着这个键不再被他人使用, 并且已经被收集起来。于是 , WeakHashMap 将删除对应的条目;

2.3)链接散列集和链接映射表(LinkedHashSet 和 LinkedHashMap)

  • 2.3.1)Java SE 1.4 增加了两个类: LinkedHashSet 和 LinkedHashMap, 用来记住插入元素项的顺序(干货——引入链接散列集和链接散列表的原因, LinkedHashSet 和 LinkedHashMap, 用来记住插入元素项的顺序), 这样就可以避免在散列表中的项从表面上看是随机排列的。当条目插入到表中时,就会并入到双向链表中;
  • 2.3.2)看个荔枝:
    这里写图片描述
Map<String, Employee> staff = new HashMap<>();staff.put("14", new Employee("Amy"));staff.put("56", new Employee("Harry"));staff.put("15", new Employee("Gary"));staff.put("45", new Employee("Francesca"));
  • 然后 staff.keySet().iterator() 以下面次序枚举键:
    (https://github.com/pacosonTang/core-java-volume/blob/master/chapter13/MapTestOne.java)
    并且 staff.values().iterator() 以下列顺序枚举这些值;

  • 2.3.3)链接散列映射表将用访问顺序,而不是插入顺序, 对映射表条目进行迭代。每次调用 get 或 put, 受到影响的条目将从当前位置删除, 并放到条目链表的尾部;

  • 2.3.4)访问顺序对于实现高速缓存的 “最近最少使用”原则十分重要。
  • 2.3.5)可以构造一个 LinkedHashMap的子类, 然后覆盖下面这个方法:
protected boolean removeEldestEntry(Map.Entry<K, V> eldest)
  • 2.3.6)看个荔枝:(每当方法返回true时, 就添加一个新条目, 从而导致删除 eldest 条目), 下面的高速缓存可以存放100个元素:
Map<K, V> cache = new LinkedhashMap<>(128, 0.75F, true)
{protecte boolean removeEldestEntry(Map.Entry<K, V> eldest){return size() > 100;}
}

2.4)枚举集与映射表

  • 2.4.1) EnumSet 是一个枚举类型元素集的高效实现。 如果对应的值在集合中, 相应的位被置为1;
  • 2.4.2) EnumSet 类没有公共的构造器。 可以使用静态工厂方法构造这个集;
enum Weekday {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, , SATURDAY, SUNDAY}
EnumSet<Weekday> always = EnumSet.allOf(Weekday.class);
EnumSet<Weekday> never = EnumSet.noneof(Weekday.class);
EnumSet<Weekday> workday= EnumSet.range(Weekday.MONDAY, Weekday.FRIDAY);
EnumSet<Weekday> mwf = EnumSet.of(Weekday.MONDAY, Weekday.WEDNESDAY, Weekday.FRIDAY);

这里写图片描述

  • 2.4.3)可以修改 Set接口的常用方法来修改 EnumSet;
  • 2.4.4)EnumMap 是一个键类型为 枚举类型的映射表。 它可以直接且高效地用一个值数组实现, 在使用时, 需要再构造器中指定键类型:
EnumMap<Weekday, Employee> map = new EnumMap<>(Weekday.class);

Annotation) 在 EnumSet的 API文档中, 将会看到 E extends Enum , 简单的说, 它的意思是 E 是一个枚举类型。 所有的枚举类型都扩展于 泛型 Enum 类;如 Weekday 扩展于 Enum;
这里写图片描述

API java.util.EnumSet<E extends Enum<E>> 5.0static <E extends Enum<E>> EnumSet<E> allOf(Class<E> enumType)
返回一个包含给定枚举类型的所有值的集合;static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> enumType)
返回一个空集, 并有足够的空间保存给定的枚举类型所有的值;static <E extends Enum<E>> EnumSet<E> range(E from , E to)
返回一个包含 from~to 之间的所有值(包括边界fromto)的集;static <E extends Enum<E>> EnumSet<E> of(E value)
static <E extends Enum<E>> EnumSet<E> of(E value, E ...values)
返回包括给定值的集合;API java.util.EnumMap<K extends Enum<K, V>> 5.0
EnumMap<Class<K> keyType>
构造一个键为给定类型的 空映射集;java.util.IdentityHashMap<K, V> 1.4
IdentityHashMap()
IdentityHashMap(int expectedMaxSize)
构造一个空的标识散列映射集,其容量大于1.5 * expectedMaxSize的2 的最小次幂( expectedMaxSize 的默认值为21)API java.lang.System 1.0static int idnetityHashCode(Object obj) 1.1
返回 Object.hashCode 计算出来的相同散列码, 即使 obj 所属的类已经重新定义了了 hashCode 方法也是如此;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331719.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jstat分析_jstat –分析

jstat分析jstat是一个简单的实用工具&#xff0c;在JDK中存在&#xff0c;用于提供与JVM性能相关的统计信息&#xff0c;例如垃圾收集&#xff0c;编译活动。 jstat的主要优势在于&#xff0c;它可以在运行JVM且无需任何先决条件的情况下动态捕获这些指标。 这是什么意思&#…

oracle中execute函数,oracle Execute Immediate(sql语句)

慕尼黑的夜晚无繁华Example 1:Output:ABCDECLARE TYPE var_typ IS TABLE OF VARCHAR2(4000);cVars var_typ;cVar VARCHAR2(4000);BEGINEXECUTE IMMEDIATE SELECT A cc FROM dualUNIONSELECT B cc FROM dualUNIONSELECT C cc FROM dual BULK COLLECT INTO cVars; FOR i IN 1 .…

java之数组

一、声明数组 数组是引用类型&#xff0c;声明数组并没有分配空间&#xff0c;则该数组变量的值为null。 类型[] 数组名; 如&#xff1a;double[] data; 二、创建数组 类型[] 数组名new 类型[长度]; 数组创建&#xff0c;数组里面的元素会被赋值&#xff0c;数值型基本数据…

java集合——集合框架

【0】README 0.1&#xff09; 本文描述转自 core java volume 1&#xff0c; 源代码为原创&#xff0c;旨在理解 java集合——集合框架 的相关知识&#xff1b; 【1】集合框架 1.1&#xff09; java集合类库构成了集合类的矿建&#xff0c; 它为集合的实现者定义了大量的接口…

oracle密码不能重复用_重复码

oracle密码不能重复用介绍 在我们的Java应用程序中复制/粘贴代码通常不好&#xff0c;但是有时这是不可避免的。 例如&#xff0c;项目License3j在Feature类中为其支持的每种XXX类型提供了一个isXXX方法。 在这种情况下&#xff0c;我们做不到写 public boolean isBinary() { r…

oracle rman 用户,对Oracle数据库进行RMAN备份的Oracle数据库用户权限

在Oracle 12版本或者更高版本&#xff0c;Oracle备份用户需要具有SYSDBA或者SYSBACKUP权限在Oracle 11(包括11版本)以前&#xff0c;Oracle备份用户需要具有SYSDBA权限创建及授权用户权限命令示例如下&#xff1a;SQL>create user backupuser identified by oracle;SQL>g…

java之类

一、构造方法1)构造方法具有与类的相同名字2)构造方法没有返回值&#xff0c;甚至连void都没有3)创建新对象使用new&#xff0c;构造方法的作用就是初始化对象。格式为&#xff1a; [可见修饰符] 类名(参数表){}例如&#xff1a;public Myclass(){}普通方法&#xff1a; p…

pmml_再访PMML

pmml嗨伙计&#xff01; 从今年年初开始&#xff0c;就有了重新设计Drools PMML模块的计划。 在这篇文章中&#xff0c;我将描述我们将如何处理它&#xff0c;目前的状态&#xff0c;未来发展的想法等&#xff0c;等等……敬请期待&#xff01; 背景 PMML是一个标准&#xff…

java集合——视图与包装器

【0】README 0.1&#xff09; 本文描述转自 core java volume 1&#xff0c; 源代码为原创&#xff0c;旨在理解 java集合——视图与包装器 的相关知识&#xff1b; 0.2&#xff09; for full source code , please visit https://github.com/pacosonTang/core-java-volume/b…

php把表单转为json保存,javascript – 使用jquery将表单数据保存到本地json文件中

我有一个带有一些输入字段的基本表单.我想在提交表单时将表单数据保存到json文件中.json文件中保存数据的格式应如下所示.[{"title":"some text","description":"some text","info":"some text","username&q…

java之包装类与BigInteger、BigDecimal

一、包装类 &#xff08;1&#xff09;包装类与原类型 Integer int 的包装类 Boolean boolean 的包装类 Character char的包装类 Double double的包装类 Float float 的包装类 Byte …

哈希值 哈希表_哈希杰森

哈希值 哈希表我最近写了一个简单的库&#xff0c;可预测地对json进行哈希处理 。 该实用程序基于出色的Jackson Json解析库构建 问题 我需要从相当大的基于json的内容生成的哈希值&#xff0c;以便稍后确定该内容是否发生了更改。 将json视为字符串不是格式化的选项&#xf…

新浪微博搜索php待遇,新浪微博面试

PHP技术基础1、合并数据的函数。我当时回答的是array_merge()&#xff0c;array_combine()(注意与前者的区分);当时面试官告诉我还可以使用 加号()2&#xff0c;判断一个IP地址是否合法。只让说一下思路&#xff1a;(1)用点分割.&#xff0c;$arrIp explore()&#xff1b;(2)判…

java集合——集合与数组间的转换+算法

【0】README 0.1&#xff09; 本文描述转自 core java volume 1&#xff0c; 源代码为原创&#xff0c;旨在理解 java集合——集合与数组间的转换算法 的相关知识&#xff1b; 0.2&#xff09; for full source code , please visit https://github.com/pacosonTang/core-jav…

java之String

一、String类的特性 String对象是不可变的&#xff0c;字符串一旦创建&#xff0c;就不可以改变。二、构造字符串字符串直接量String anew String("字符串直接量"); 字符数组String bnew String(chars);字符串直接量赋值&#xff0c;java把字符串直接量看作String对象…

java记录目录树_Java记录

java记录目录树https://openjdk.java.net/jeps/359概述了Java的新功能&#xff0c;该功能可能会/将在某些将来的Java版本中实现。 JEP建议使用一种新的“类别”&#xff1a;记录。 JEP中的示例内容如下&#xff1a; record Range( int lo, int hi) { public Range { if (lo >…

java集合——遗留的集合

【0】README 0.1&#xff09; 本文描述转自 core java volume 1&#xff0c; 源代码为原创&#xff0c;旨在理解 java集合——遗留的集合 的相关知识&#xff1b; 0.2&#xff09; for full source code , please visit https://github.com/pacosonTang/core-java-volume/blo…

oracle 扩展分区,Oracle 在线扩展分区

在对Oracle分区表操作是&#xff0c;当一个分区已经有了最大的分区&#xff0c;如何再次扩展分区呢&#xff1f;简单的方式是先删除最大分区&#xff0c;然后添加需要的分区在对Oracle分区表操作是&#xff0c;当一个分区已经有了最大的分区&#xff0c;如何再次扩展分区呢&…

java之StringBuider与StringBuffer

一、StringBuider与StringBuffer StringBuider与StringBuffer类比String更加灵活&#xff0c;只要使用字符串的地方&#xff0c;都可以使用StringBuider与StringBuffer类。三者的共同之处都是 final 类&#xff0c;不允许被继承&#xff0c;这主要是从性能和安全性上考虑的&…

织机原理_项目织机

织机原理为什么为什么&#xff1f; Java 8流背后的驱动程序之一是并发编程。 在流管道中&#xff0c;指定要完成的工作&#xff0c;然后任务将自动分配到可用处理器上&#xff1a; var result myData.parallelStream().map(someBusyOperation).reduce(someAssociativeBinOp)…