文档章节

Hutool之有界优先队列-BoundedPriorityQueue

路小磊
 路小磊
发布于 2015/03/22 12:47
字数 459
阅读 402
收藏 7
点赞 0
评论 0

项目地址

http://git.oschina.net/loolly/hutool

https://github.com/looly/hutool


简介

举个例子。我有一个用户表,这个表根据用户名被Hash到不同的数据库实例上,我要找出这些用户中最热门的5个,怎么做?我是这么做的:

  1. 在每个数据库实例上找出最热门的5个
  2. 将每个数据库实例上的这5条数据按照热门程度排序,最后取出前5条

这个过程看似简单,但是你应用服务器上的代码要写不少。首先需要Query N个列表,加入到一个新列表中,排序,再取前5。这个过程不但代码繁琐,而且牵涉到多个列表,非常浪费空间。

于是,BoundedPriorityQueue应运而生。

先看Demo:

<!--lang: java-->
/**
 * 有界优先队列Demo
 * @author Looly
 *
 */
public class BoundedPriorityQueueDemo {
	
	public static void main(String[] args) {
		//初始化队列,设置队列的容量为5(只能容纳5个元素),元素类型为integer使用默认比较器,在队列内部将按照从小到大排序
		BoundedPriorityQueue<Integer> queue = new BoundedPriorityQueue<Integer>(5);
                
                //初始化队列,使用自定义的比较器
		queue = new BoundedPriorityQueue<>(5, new Comparator<Integer>(){

			@Override
			public int compare(Integer o1, Integer o2) {
				return o1.compareTo(o2);
			}
		});
		
		//定义了6个元素,当元素加入到队列中,会按照从小到大排序,当加入第6个元素的时候,队列末尾(最大的元素)将会被抛弃
		int[] array = new int[]{5,7,9,2,3,8};
		for (int i : array) {
			queue.offer(i);
		}
		
                //队列可以转换为List哦~~
		ArrayList<Integer> list = queue.toList();

		System.out.println(queue);
	}
}

原理非常简单。设定好队列的容量,然后把所有的数据add或者offer进去(两个方法相同),就会得到前5条数据了。

© 著作权归作者所有

共有 人打赏支持
路小磊

路小磊

粉丝 279
博文 53
码字总数 39918
作品 5
乌海
程序员
并发编程(五):Executor框架

简介 Executor是JDK提供的一套线程框架,用于有效的控制线程。 Executor框架主要包含三个部分: 任务:包括Runnable和Callable,其中Runnable表示一个可以异步执行的任务,而Callable表示一个...

mengdonghui123456
2017/08/15
0
0
java多线程系列:ThreadPoolExecutor

ThreadPoolExecutor自定义线程池 开篇一张图(图片来自阿里巴巴Java开发手册(详尽版)),后面全靠编 好了要开始编了,从图片中就可以看到这篇博文的主题了,ThreadPoolExecutor自定义线程池...

勿妄
06/17
0
0
关于Java多线程的一些常考知识点

前言 多线程也是面试中经常会提起到的一个点。面试官会问:实现多线程的两种方式以及区别,死锁发生的个条件以及如何避免发生死锁,死锁和活锁的区别,常见的线程池以及区别,怎么理解有界队...

cmazxiaoma
2017/12/11
0
0
配置ThreadPoolExecutor二

配置ThreadPoolExecutor二 线程的创建和销毁 线程池的基本大小(Core Pool Size)、最大大小(Maximum Pool Size)以及存活时间(keepAliveTime)等因素共同负责线程的创建和销毁。基本大小也...

秋风醉了
2016/09/19
29
0
wait & notify & notifyAll_实现有界缓存

wait & notify & notifyAll_实现有界缓存 接上篇:http://my.oschina.net/xinxingegeya/blog/308773 条件队列就好像面包机中通知”面包以烤好“的铃声。如果你注意听着铃声,那么当前面包烤好...

秋风醉了
2014/09/01
0
0
Lock && Condition_实现有界缓存

Lock && Condition_实现有界缓存 Lock是一种广义的内置锁,Condition也是一种广义的内置条件队列。 内置条件队列存在一些缺陷。每个内置锁都只能有一个相关的条件队列,因而多个线程可能在同...

秋风醉了
2014/09/02
0
0
JDK容器学习之Queue: ArrayBlockingQueue

基于数组阻塞队列 ArrayBlockingQueue 前面学习了基于数组的非阻塞双端队列,其内部维护一个数组和指向队列头和队列尾索引的两个成员变量;本篇则探究下基于数组的阻塞队列是什么样的数据结构...

小灰灰Blog
2017/11/02
0
0
线程池构造参数分析

ThreadPoolExecutor 首先看看ThreadPoolExecutor的构造函数,ThreadPoolExecutor提供了几个构造函数,我们先来参数最全构造函数的含义。 corePoolSize: 线程池维护线程的最少数量 maximumP...

459161859
2016/12/19
45
0
并行化资源池队列 1 —— 部分有界队列

1前言 在并发系统中很多地方都要用到作为资源池的并行化队列,如在大多数应用中,一个或多个生产者线程生产数据,一个或多个消费者消费数据。这些数据元素可以是需要执行的的任务、要解释的键...

武祖林动
2017/06/12
64
0
线程阻塞队列ArrayBlockingQueue

阻塞队列是Java5线程新特征中的内容,Java定义了阻塞队列的接口java.util.concurrent.BlockingQueue,阻塞队列的概念是,一个指定长度的队列,如果队列满了,添加新元素的操作会被阻塞等待,...

古月楼
2013/08/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

崛起于Springboot2.X之集成MongoDb使用mongoTemplate CRUD(27)

1、pom依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.7</version></dependency><dependency> <groupId>log4j</......

木九天
12分钟前
0
0
切分log日志

新建logback.xml放到resource里面 <?xml version="1.0" encoding="utf-8"?><configuration> <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender"> <......

talen
17分钟前
0
0
spring @Resource 和 @Autowired 的使用区别

这两个 注解 @Resource 和 @Autowired , 常识都知道 @Resource 是 JAVAEE 自带的,@Autowired 是 spring 的自定义注解。 一般情况下, 使用 bean的时候, 这两个注解 随便使用一个即可。 但...

之渊
22分钟前
0
0
springboot集成elasticsearch客户端问题记录

1背景说明 服务端ES版本为5.5.2,springboot版本为1.5.6。 工程中添加如下依赖 2问题记录 2.1 NetworkPlugin类找不到 报错java.lang.ClassNotFoundException: org.elasticsearch.plugins.Net...

zjg23
24分钟前
1
0
快速构建ceph可视化监控系统

前言 ceph的可视化方案很多,本篇介绍的是比较简单的一种方式,并且对包都进行了二次封装,所以能够在极短的时间内构建出一个可视化的监控系统 本系统组件如下: ceph-jewel版本 ceph_expor...

万建宁
24分钟前
0
0
Java构造器使用注意

public class 父类A {int age = 10;protected void say() {System.out.println("父类A");}public 父类A() {override();}public void override() {Syst...

咸鱼AI
24分钟前
0
0
TensorFlow 线性分类

构造直线 z = 2 * x - 3 * y + 4 x0*w0+x1*w1+b=0 x1=-x0* w0/w1-b/w1 斜率 k= -w0/w1 截距 -b/w1 随机生成数据,加入一定的偏差,用直线将二维平面分为两部分 使用线性模型拟合参数 损失函数...

阿豪boy
27分钟前
0
0
翻译冒泡排序测试

翻译一个冒泡排序: var a = [1,3,2,4,6,5];var f = 0;var n = a.length ;for( var i =1; i<= n; i++) { for( var j = n-1 ; j >= i; j --) { if(a[j] < a[j+1]) { ......

钟元OSS
29分钟前
0
0
maven父、子级版本号同时修改

命令: mvn versions:set -DnewVersion=0.0.2-SNAPSHOT

沉默的懒猫
30分钟前
0
0
Spring boot中的异常处理之注解响应

Controller层 return patientRepository.findById(id) .orElseThrow(() -> new NotFoundException(String.format("Patient %d not found", id))); Exception类 @ResponseS......

亚林瓜子
31分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部