![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 69
泳装魔王
真不会修电脑
展开
-
基于spring schedule、zookeeper和VUE实现的可视化分布式定时任务工具
自己用Java写了个可视化的定时任务工具,取名sundial(日晷)。定时任务的原理就是spring schedule;分布式锁基于zookeeper实现,客户端采用Netflix开源的Curator。JDK用的17,最新的长期支持版本(LTS),数据库是MySQL,同样是最新的MySQL8。囿于篇幅,下面只介绍主要的类和数据库设计。查看详细代码,请移步GitHub,GitHub - riveryue/sundial,这个分支updateCronActivrImmediately。使用时需要在任务类原创 2022-01-24 23:46:07 · 3605 阅读 · 1 评论 -
用两个栈stack来实现队列queue Java实现
import java.util.Stack;/** * 用栈来实现队列 */public class StackQueue<T> { //stack1用来存放元素 private Stack<T> stack1 = new Stack<>(); private Stack<T> stack2 = new Stack<>(); public void push(T t) { stack.原创 2020-05-31 09:53:47 · 542 阅读 · 1 评论 -
为什么HashMap的容量必须为大于该容量的最小的2的n次幂
调用HashMap的put方法将一个键值对存到map中,会先计算key的散列值。该散列值是int基本类型,int的范围为~,用这个散列值来确定map的数组下标(jdk8之前HashMap的数据结构是数组+链表,jdk8之后又加上了红黑树)。但这散列值太大,map的容量不可能这么大,会内存溢出。所以需要通过一种方式将这个key的散列值与map的容量对应起来。比如说将散列值与map容量取模,这样得到的结果一定小于容量了,就可以拿来做数组下标了,但取模计算的速度较慢。jdk采用了这种方式计算下标:(n -原创 2020-05-18 00:21:43 · 888 阅读 · 0 评论 -
用Java手写链表
public class LinkedList<E> { private int size; private Node dummyHead; private class Node { private E e; private Node next; private Node(E e, Node next) {...原创 2020-03-23 17:16:29 · 258 阅读 · 0 评论 -
Java8中Collectors工具类的常用方法总结
import com.google.common.collect.Lists;import lombok.Data;import lombok.extern.slf4j.Slf4j;import org.junit.Before;import org.junit.Test;import java.math.BigDecimal;import java.util.Arrays;im...原创 2019-09-30 15:00:44 · 1254 阅读 · 0 评论 -
Java集合去重
集合去重,可以使用Set不能添加重复元素的特性来实现,像下面这样public class Test { public static void main(String[] args) { List<Car> cars = Arrays.asList(new Car("benz"), new Car("bmw"), new Car("bmw")); ...原创 2019-09-23 16:04:50 · 1729 阅读 · 0 评论 -
elasticsearch-head插件连接不上elasticsearch的处理方式
在elasticsearch的安装目录下找到config文件夹,找到elasticsearch.yml文件,打开编辑它,加上如下这两行配置http.cors.enabled: truehttp.cors.allow-origin: "*"http.cors.enabled配置项表示是否支持跨域,默认为false;http.cors.allow-origin,当设置允许跨域,默认为*...原创 2019-08-16 10:46:34 · 10458 阅读 · 1 评论 -
Java的时间类库joda教程
使用原生Java操作时间是比较麻烦的,比如说简单的创建一个指定时间String time = "2018-7-3 11:00:00";SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date date = null;try { date = sdf.parse(time);} catch (...原创 2019-06-29 09:38:52 · 3894 阅读 · 0 评论 -
Java返回给前端的数值太大,导致前端显示时精度损失的问题解决方式
Java的Long类型的范围比JavaScript大,那就有可能导致精度损失的情况。先来看看JavaScript的Number的最大值再看看Java的Long类型的最大值 解决方法很简单,如果Java返回给前端的是个对象,就是在对象里可能出现大数值的那个属性上加个注解,比如说这样:import com.fasterxml.jackson.databind.an...原创 2019-01-23 20:12:40 · 5712 阅读 · 0 评论 -
linux下elasticsearch的安装
可以在本地下载好elasticsearch,再用filezilla等工具上传到服务器,但有点麻烦。直接用wget命令就比较方便:wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.0.tar.gz这样就能下载elasticsearch的压缩包,注意这里的版本是6.5.0。之后安装kiban...原创 2018-12-16 20:28:42 · 126 阅读 · 0 评论 -
使用nginx设置代理调试本地接口
调试接口可以用postman、fiddler、RESTClient等工具,也可以不依赖这些软件,直接把本地设置成代理服务器,这样在页面发送的请求就会被本地接收到,本地进行处理后,再将结果返回给服务器。相较使用工具,这样测试接口会方便得多。nginx的下载地址http://nginx.org/en/download.html,下载后先解压,进入conf文件夹,打开nginx的配置文件nginx....原创 2018-12-09 12:07:58 · 6778 阅读 · 1 评论 -
Java反射机制(二)
上篇博客讲了反射概念,这次就来讲讲反射的应用之使用反射创建对象。使用反射机制创建对象需要用到反射API中的Constructor,获取Constructor类常用的有下述四种方法:1.Constructor<T> getConstructor(Class<?>... parameterTypes)该方法返回此Class对象所表示的类的权限修饰符为public的构造方...原创 2018-04-25 16:37:49 · 128 阅读 · 0 评论 -
Fork/Join框架
ForkJoin框架是Java7的新特性,用于并行处理大型任务的。其核心思想是将一个大任务拆分成若干小任务,小任务继续拆分,直到不能再拆。开发人员可自行设置阈值用以控制任务拆到什么程度后不能再拆。拆分完毕后,将创建若干线程,每个线程都有一个任务队列,之前拆分的任务会被放到这些队列中。此处的队列的是双端队列。为提高资源利用率,先处理完任务的线程不会闲着,它随机找一个线程的任务队列偷任务来处理,从队尾偷,而任务被偷的那个线程执行任务时是从对头拿任务。这称为工作密取(work strealing)机制。Fork/原创 2018-05-11 17:48:50 · 198 阅读 · 0 评论 -
线程池的使用
本文说明的线程池是定长线程池,定长线程池创建指定个数的线程。当有任务要执行时,线程调度器会找一个空闲线程来执行任务,若没用空闲线程,就会等线程忙完了后再执行任务。举个例子,找出1到200000里质数的集合,最简单的方法是一个for循环。但用一个线程处理这么多数,效率很低。可以考虑使用多线程的方式,那就到了线程池发挥作用的时候了。把1到200000分成四个区间,启动四个线程处理这四个区间。下面的实例...原创 2018-05-18 21:51:08 · 147 阅读 · 0 评论 -
Java反射机制(三)
这期讲讲反射机制如何获取类的属性,类的属性对应Field类(java.lang.reflect.Field),主要有如下四种方法:1.Field getField(String name)该方法返回某Class对象对应的类的名称为name的且以public修饰的属性2.Fiele getDeclaredField(String name)该方法返回某CLass对象对应的类的名称为name的属性,与...原创 2018-04-28 22:25:53 · 122 阅读 · 0 评论 -
Java反射机制(四)
这篇讲讲如何利用反射机制调用方法,需要用到Method类(java.lang.reflect),获取Method对象一般有如下四种方法。1.Method getMethod(String name, Class<?>... parameterTypes)返回某对象指定的类的指定的共有方法,name参数表示方法名称,parameterTypes表示方法的参数类型的Class对象,且该参数...原创 2018-04-29 10:26:42 · 93 阅读 · 0 评论 -
Java序列化与反序列化
当需要把一个对象保存在文件、数据库中,或是将其在网络上传播的时候,就需要对其进行序列化。序列化和反序列化就是分别把对象转成字节序列和把字节序列恢复成对象的过程。实现Serializable接口是应用序列化与反序列化的一种方式。这个接口没有方法,这种叫标记接口,表示实现这个接口的类可以被序列化。若类中的某个属性不想被序列化时,可以加上transient关键字修饰,这样在序列化时,这个属性就会按其类型...原创 2018-06-08 10:23:57 · 127 阅读 · 0 评论 -
使用Java反射机制动态创建和访问数组
java.lang.reflect包提供了一个Array类,使用Array类可以动态地创建和访问数组。static newInstance(Class<?> componentType, int length)方法可创建数组。componentType用以指定数组的元素类型,length用以指定数组长度。该方法返回一个Object,可考虑使用强制转换。static native...原创 2018-09-08 22:26:51 · 1161 阅读 · 0 评论 -
Java并发包CountDownLatch的用法
Java的CountDownLatch是Java1.5新出现的类,用作在多个线程都执行完成之后再执行特定方法。latch译作门闩,CountDownLatch可以理解为程序里若干门闩,或是计数器,至于到底有几个门闩,可以在CountDownLatch的构造方法中指定,当门闩都被打开后,程序才会继续执行。调用CountDownLatch的countDown方法就表示打开了一个门闩,门闩都被打开后,C...原创 2018-10-14 17:12:56 · 342 阅读 · 0 评论 -
用wait、notifyAll实现生产者消费者模式
学习多线程,生产者消费者模式是一个绕不开的话题。所谓生产者消费者模式就是两组线程共享同一内存区域,生产者不停地从中放置数据,而消费者不停地从中取走数据。上面说到的内存区域应该是一个阻塞队列,如果不是,那就会出现线程安全问题了。阻塞队列可由BlockingQueue实现,也可用wait、notifyAll实现,这两个方法继承自Object类。下面的示例代码中,Product类表示生产者,Cons...原创 2018-11-04 22:29:04 · 291 阅读 · 0 评论 -
Java反射机制(一)
Java的反射机制是构建框架技术的基础,功能强大且复杂。使用其可以编写能够动态操纵Java代码的程序。在Java中,反射机制是指在运行状态,对于任意一个类,都可以知道该类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法。这种动态获取信息以及动态调用对象方法的功能称为反射机制。注意:Java不是动态语言。动态语言是能在程序运行时允许改变程序结构或变量类型的语言。Java反射可以...原创 2018-04-24 22:09:07 · 253 阅读 · 0 评论