Java中的Map双边队列

1.1 什么是Map

键(Key)值(Value)对
邓超 = 娘娘
贝克汉姆 = 维多利亚
黄磊 = 孙莉
吴京 = 谢楠

表格:
姓名:张三
年龄:23
性别:男

程序开发大部分数据都是键值对形式的
MySQL JSON XML 类对象成员变量和存储的数据
从前端发送的数据也可以转成Map格式 ==> 一键生成 ==> 类对象 ==> 一键存储 ==> 数据库

interface Map<K, V>
–| class HashMap<K, V> 哈希表结构
–| class TreeMap<K, V> 底层是树形结构,存储要求K有对应的排序方式
Map双边队列中键(Key)是唯一的,但是值(Value)可以重复

1.2 Map<K, V>双边队列方法

增:
put(K k, V v);
存入一个键值对类型,K和V都要符合泛型约束
putAll(Map<? extends K, ? extends V> map);
存入另一个Map双边队列,并且要求添加的Map双边对接中的K和V都要和当前Map中存储
的K和V一致
删:
remove(Object k);
删除对应K的键(Key)值(Value)对
改:
put(K k, V v);
对应当前K存在,修改对应内容
查:
int size();
当前Map双边队列中,有效键值对个数
boolean isEmpty();
是否为空
boolean containsKey(Object key);
判断指定的Key是否存在
boolean containsValue(Object value);
判断指定Value是否存在
Set keySet();
返回整个Map双边队列中所有Key对应的Set集合

【注意】
一个方法使用set结尾,表示该方法返回的是一个集合类型,大多是情况下都
是Set类型
Collection values();
返回整个Map双边队列中所有Value对应的Collection集合
【注意】
方法名如果是一个复数,返回值类型集合或者是数组情况居多

1.3 EntrySet

Entry 可以认为是键值对对象
定义在Map类内
class Entry<K, V> {
K k;
V v;
}
K,V是完全依赖于Map约束的,这里可以Entry里面保存的是每一个键值对类对象

Map中提供了一个方法
Set<Entry<K, V>> entrySet
返回值是键值对类对象Set集合
Set集合中存储的是Entry类型
Entry类型是带有泛型的

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Demo2 {
	public static void main(String[] args) {
		HashMap<String, String> map = new HashMap<String, String>();
		
		map.put("吴京", "谢楠");
		map.put("邓超", "娘娘");
		map.put("黄磊", "孙莉");
		map.put("王宝强", "XX");
		
		Set<Map.Entry<String, String>> entrySet = map.entrySet();
		
		System.out.println(entrySet);
	}
}

1.4 TreeMap<K, V> 以及Comparable和Comparator

K是需要有对应的比较方式,如果没有比较方式,无法存入。

推荐使用Comparator接口

import java.util.Comparator;
import java.util.TreeMap;

public class Demo3 {
	public static void main(String[] args) {
		TreeMap<String,String> map = new TreeMap<String, String>();
		
		map.put("李四", "1");
		map.put("王五", "1");
		map.put("赵六", "1");
		map.put("张三", "1");
		
		System.out.println(map);
		
		TreeMap<Dog,String> map2 = new TreeMap<Dog, String>(new Comparator<Dog>() {

			@Override
			public int compare(Dog o1, Dog o2) {
				return o1.getAge() - o2.getAge();
			}
		});
		
		map2.put(new Dog("王可可", 1), "111"); 
		map2.put(new Dog("八公", 2), "111"); 
		map2.put(new Dog("豆豆", 3), "111"); 
		map2.put(new Dog("老黄", 4), "111"); 
		map2.put(new Dog("旺财", 5), "111"); 
		
		System.out.println(map2);
		
	}
}
JavaMap是一种键值对的数据结构,它提供了快速的访问和查找功能。但是,Map并不是一个阻塞队列,它不能直接用来实现阻塞队列功能。但是,我们可以使用Map来实现一个阻塞队列,具体实现方法如下: 1. 创建一个Map对象,用来存储队列元素。 2. 创建一个互斥锁对象,用来保证队列操作的线程安全。 3. 创建两个条件变量,一个用来表示队列已满,另一个用来表示队列为空。 4. 实现队列的put方法,当队列已满时,阻塞当前线程,等待队列有空闲位置。 5. 实现队列的take方法,当队列为空时,阻塞当前线程,等待队列有元素可取。 6. 实现队列的size方法,返回队列元素的数量。 下面是一个使用Map实现阻塞队列的示例代码: ``` import java.util.Map; import java.util.HashMap; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class BlockingQueue<T> { private final Map<Integer, T> map; private final Lock lock; private final Condition notFull; private final Condition notEmpty; private int capacity; private int head; private int tail; public BlockingQueue(int capacity) { this.capacity = capacity; map = new HashMap<>(capacity); lock = new ReentrantLock(); notFull = lock.newCondition(); notEmpty = lock.newCondition(); head = 0; tail = 0; } public void put(T element) throws InterruptedException { lock.lock(); try { while (tail - head == capacity) { notFull.await(); } map.put(tail % capacity, element); tail++; notEmpty.signal(); } finally { lock.unlock(); } } public T take() throws InterruptedException { lock.lock(); try { while (tail == head) { notEmpty.await(); } T element = map.remove(head % capacity); head++; notFull.signal(); return element; } finally { lock.unlock(); } } public int size() { lock.lock(); try { return tail - head; } finally { lock.unlock(); } } } ``` 在这个示例代码,我们使用了一个Map来存储队列元素,并使用了一个互斥锁和两个条件变量来实现阻塞队列的功能。put方法和take方法分别实现了向队列添加元素和从队列取出元素的功能。size方法返回队列元素的数量。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值