HashMap扩容:(30条消息) 代码优化 | 如何设置HashMap的初始值大小_hashmap指定初始值大小_死牛胖子的博客-CSDN博客
1、哈希表+LinkedList
超出时间()
Collection(集合):容器,用于存放对象(引用类型。基本类型需要自动装箱)
List(列表):元素有序,元素可以重复 (有索引)。 通过元素的equals()方法判断是否重复。
Set(集):元素无序,不可重复 (没有索引)。 遍历只能用Iterator迭代器和增强for, 不能使用普通for遍历。
ArrayList(数组列表): 查询快,增删慢。
LinkedList(链表): 查询慢,增删快。
HashSet(哈希表): 查询快,增删慢。 (底层其实就是Map) 。 存放的引用类型需重写hashCode()和equals()方法。
LinkedHashSet(哈希链表): 查询慢,增删快。 有序的,存放顺序和取出顺序一致。(30条消息) javaSE LinkedList集合,元素有序可以重复,查询慢,增删快_houyanhua1的博客-CSDN博客
class LRUCache {
Map<Integer,Integer> map;
LinkedList<Integer> list;
int capacity;
public LRUCache(int capacity) {
map=new HashMap<>();
list=new LinkedList<>();
this.capacity=capacity;
}
public int get(int key) {
if(map.containsKey(key)){
list.addFirst(key);
removeDuplicatedElements(list);
return map.get(key);
}
return -1;
}
public void put(int key, int value) {
if(!map.containsKey(key)){
//bu已存在
if(map.size()>capacity-1){
int k = list.removeLast();
map.remove(k);
}
}
map.put(key,value);
list.addFirst(key);
removeDuplicatedElements(list);
}
private static LinkedList removeDuplicatedElements(LinkedList<Integer> list) {
HashSet set = new HashSet();
Iterator iter = list.listIterator();
while(iter.hasNext()){
int str = (Integer)iter.next();
if(!set.contains(str)) set.add(str);
else iter.remove();
}
return list;
}
}
/**
* Your LRUCache object will be instantiated and called as such:
* LRUCache obj = new LRUCache(capacity);
* int param_1 = obj.get(key);
* obj.put(key,value);
*/
最近最少使用缓存 - 最近最少使用缓存 - 力扣(LeetCode)
public class LRUCache {
class DLinkedNode {
int key;
int value;
DLinkedNode prev;
DLinkedNode next;
public DLinkedNode() {}
public DLinkedNode(int _key, int _value) {key = _key; value = _value;}
}
private Map<Integer, DLinkedNode> cache = new HashMap<Integer, DLinkedNode>();
private int size;
private int capacity;
private DLinkedNode head, tail;
public LRUCache(int capacity) {
this.size = 0;
this.capacity = capacity;
// 使用伪头部和伪尾部节点
head = new DLinkedNode();
tail = new DLinkedNode();
head.next = tail;
tail.prev = head;
}
public int get(int key) {
DLinkedNode node = cache.get(key);
if (node == null) {
return -1;
}
// 如果 key 存在,先通过哈希表定位,再移到头部
moveToHead(node);
return node.value;
}
public void put(int key, int value) {
DLinkedNode node = cache.get(key);
if (node == null) {
// 如果 key 不存在,创建一个新的节点
DLinkedNode newNode = new DLinkedNode(key, value);
// 添加进哈希表
cache.put(key, newNode);
// 添加至双向链表的头部
addToHead(newNode);
++size;
if (size > capacity) {
// 如果超出容量,删除双向链表的尾部节点
DLinkedNode tail = removeTail();
// 删除哈希表中对应的项
cache.remove(tail.key);
--size;
}
}
else {
// 如果 key 存在,先通过哈希表定位,再修改 value,并移到头部
node.value = value;
moveToHead(node);
}
}
private void addToHead(DLinkedNode node) {
node.prev = head;
node.next = head.next;
head.next.prev = node;
head.next = node;
}
private void removeNode(DLinkedNode node) {
node.prev.next = node.next;
node.next.prev = node.prev;
}
private void moveToHead(DLinkedNode node) {
removeNode(node);
addToHead(node);
}
private DLinkedNode removeTail() {
DLinkedNode res = tail.prev;
removeNode(res);
return res;
}
}