- 921. Minimum Add to Make Parentheses Valid 使括号有效的最少添加
- 915. Partition Array into Disjoint Intervals 分割数组
- 932. Beautiful Array 漂亮数组
- 940. Distinct Subsequences II 不同的子序列 II
public class LinkedHashMap extends HashMap implements Map
1、 Map接口的哈希表和链接列表实现,具有可预知的迭代顺序;
2、 不是同步的,fail-fast;
3、 允许nullkeyorvalue;
4、 继承HashMap,LinkedHashMap保证Map有序(插入顺序、访问顺序);
成员变量
/**
* 双重链接列表头节点
*/
private transient Entry<K,V> header;
/**
* 该linked hash map的排序方式
* 排序模式 - 对于访问顺序,为 true;对于插入顺序,则为 false
*/
private final boolean accessOrder;
LinkedHashMap重新定义了内部类Entry,实现双向链表。
/**
* LinkedHashMap entry.
*/
private static class Entry<K,V> extends HashMap.Entry<K,V> {
//用于实现双向链表
Entry<K,V> before, after;
}
构造方法
public LinkedHashMap(int initialCapacity,
float loadFactor, boolean accessOrder) {
super(initialCapacity, loadFactor);
this.accessOrder = accessOrder;
}
有源码看出,LinkedHashMap构造方法调用父类HashMap构造方法,再调用LinkedHashMap覆写的init方法,从而实现双重链表初始化。
void init() {
header = new Entry<K,V>(-1, null, null, null);
header.before = header.after = header;
}
put方法
LinkedHashMap并未重写HashMap.put方法。而是重写了父类HashMap.put方法中void addEntry(int hash, K key, V value, int bucketIndex) 和void createEntry(int hash, K key, V value, int bucketIndex),提供了双重链表的实现。
void addEntry(int hash, K key, V value, int bucketIndex) {
createEntry(hash, key, value, bucketIndex);
Entry<K,V> eldest = header.after;
if (removeEldestEntry(eldest)) {
removeEntryForKey(eldest.key);
} else {
if (size >= threshold)
resize(2 * table.length);
}
}
void createEntry(int hash, K key, V value, int bucketIndex) {
HashMap.Entry<K,V> old = table[bucketIndex];
Entry<K,V> e = new Entry<K,V>(hash, key, value, old);
table[bucketIndex] = e;
e.addBefore(header);
size++;
}
get方法
LinkedHashMap覆写了父类的get方法,区别在于,査找到对应元素后,若accessOrder为true时,更新访问顺序,即将最新访问元素移到链表头部,并,即LRU算法思想,可用做LRU缓存。accessOrder为false时,因其迭代顺序即为默认插入顺序,故不用做额外变动。
注意accessOrder为true时:迭代顺序为从近期访问最少到近期访问最多的顺序。
例如key插入顺序:1,2,3。get(2)之后,map迭代顺序顺序为:1,3,2。
public V get(Object key) {
//调用父类HashMap.getEntry方法,获取对应entry
Entry<K,V> e = (Entry<K,V>)getEntry(key);
if (e == null)
return null;
e.recordAccess(this);
return e.value;//返回值
}
void recordAccess(HashMap<K,V> m) {
LinkedHashMap<K,V> lm = (LinkedHashMap<K,V>)m;
if (lm.accessOrder) {//访问模式,更新访问顺序,LRU
lm.modCount++;
remove();
addBefore(lm.header);
}
}
LinkedHashMap继承HashMap,拥有其特性,重新定义Entry从而增加了双重链表特性。提供两种排序方式:访问顺序、插入顺序。
public interface SortedMap extends Map
1、 进一步提供关于键的总体排序的Map;
2、 键的自然排序可由Comparable或Comparator方式实现;
public interface NavigableMap extends SortedMap
1、 扩展的SortedMap,具有了针对给定搜索目标返回最接近匹配项的导航方法;
2、 可以按照键的升序或降序访问和遍历NavigableMap;
public class TreeMap extends AbstractMap implements NavigableMap, Cloneable, java.io.Serializable
1、 基于红黑树(Red-Blacktree)的NavigableMap实现;
2、 该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的Comparator进行排序,具体取决于使用的构造方法;
3、 不是同步的,fail-fast;
成员变量
/**
* 自然排序比较器
*/
private final Comparator<? super K> comparator;
//根节点
private transient Entry<K,V> root = null;
/**
* key-value 映射对数
*/
private transient int size = 0;
/**
* 树的修改次数
*/
private transient int modCount = 0;
构造方法
/**
* 使用键的自然顺序构造一个新的、空的树映射。
*/
public TreeMap() {
comparator = null;
}
/**
* 构造一个与指定有序映射具有相同映射关系和相同排序顺序的新的树映射。
*/
public TreeMap(SortedMap<K, ? extends V> m) {
comparator = m.comparator();
try {
buildFromSorted(m.size(), m.entrySet().iterator(), null, null);
} catch (java.io.IOException cannotHappen) {
} catch (ClassNotFoundException cannotHappen) {
}
}
百度百科解释红黑树:
1、 红黑树(RedBlackTree)是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组;
2、 红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能;
3、 它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的:它可以在O(logn)时间内做查找,插入和删除,这里的n是树中元素的数目;
TreeMap基于红黑树,Map有序,适用于查找搜索场景。
我读过很多关于红黑树的文章,其中操作需要 O(log n) 时间。我不太清楚它是如何工作的,以及与二分搜索相比, TreeMap 实际上如何使用红黑树算法来平衡树树。 引用链接 https://www
我正在尝试实例化 TreeMap使用Comparator应该能够访问所述 TreeMap ,即它将用于的那个(我猜“将”一定正是问题所在......): final Map map = new Tre
这很好用: TreeMap x_probs_org = new TreeMap(); 但是这个: TreeMap > x_probs = new >(); 导致以下错误: error: expec
我正在尝试模拟生产系统。为了简要解释我打算做什么,我将创建一个面板,其中有一些表来保存值(用于几个工作站和作业类型的属性(见下图))。当我运行它时,这些值应该被存储以供进一步处理。 在上一个问题中,有
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 Improve th
大家好,我是 highcharts 的新手。因为在 TreeMap 中只显示系列名称而不显示值。工具提示中显示的名称和值。但我想在 TreeMap 中显示名称和值。请知道的人回复我。 var seri
Java 8 的新手,我无法弄清楚这一点。我有两张类型为 TreeMap 的 map , 一个叫做 patternMap和另一个answerMap . patternMap被硬编码以寻找键值对的特定模
我对 map 还很陌生,而且我很困惑。我有以下 TreeMap : TreeMap> routes = new TreeMap>(); 例如,我的 TreeMap 填充如下: {A={B=10,
这对我来说似乎太棘手,无法正确执行此操作。 我有一个TreeMap ,我正在获取其中的子图: public static reqObj assignObj(reqObj vArg, i
我需要你的帮助,我不明白发生了什么? 我试图在两个 Activity 之间发送一个 TreeMap,代码是这样的: class One extends Activity{ public void s
我们在一个方法中定义了一个新的 TreeMap 并将其传递给另一个方法: TreeMap aTreeMap = new TreeMap(); //call another method to doSo
我认为 C++ std::map.lower_bound 等于 java 的 TreeMap.higherEntry。C++ std::map 中 java 的 TreeMap.lowerEntry
作为最佳实践, float 的集合类型实例不应超过一个。例如,Nil 是 scala 库中的一个 case 对象。 但是, TreeMap 和 TreeSet 在每次 empty() 调用时都会创建一
我有更新点燃缓存记录的代码逻辑, 缓存定义为: IgniteCache> txInfoCache; 键是缓存类型字符串,对于值我使用TreeMap来保持记录有序(我需要对数据进行排序),但是更新所用的
我有一个自己的扩展 TreeMap,名为 MyTreeMap,它用于根据作为参数 MyTreeMap 传递的 DAO 动态创建 TreeMap。还,Hazelcast 提供了自己的 TreeMap,我
我想以树的形式可视化马赛克图。例如 mosaicplot(~ Sex + Age + Survived, data = Titanic, color = TRUE) 现在我想要的是以树的形式表示它,其
我正在尝试使用 R 包树状图创建一个树状图,该树状图类似于包中示例中的树状图。 library(treemap) data(GNI2010) treemap(GNI2010, index=c(
如何捕获最后一个节点的点击事件? 我按照本教程(http://bl.ocks.org/ganeshv/6a8e9ada3ab7f2d88022)制作了树状图。在我的目的中,我想让最后一个节点可点击,然
我有一个 2 级的 highchart TreeMap ,用于显示股票市场的价格,每个部分的值(value)几乎每秒钟都在变化,我想更新每个部分的值,但正如我所见在 highchart 中,我们可以通
我想存储元素的 ID 及其对应的坐标。为此,我使用了一个 TreeMap,其中 Coordinates 是一个包含 int x 和 int y 的类。现在,为了将数据插入 map ,我可以这样写: t
我是一名优秀的程序员,十分优秀!