
java
zjuwzp
这个作者很懒,什么都没留下…
展开
-
win10配置jdk变量的一些坑
安装配置jdk环境变量时,有如下这么一项但是如果你是win10系统,这么配置就死翘翘了```;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;```需要把这两项拆开来,这么配才是对的。如下:原创 2021-04-12 10:42:42 · 201 阅读 · 0 评论 -
容器中访问项目接口
可通过域名访问(就跟容器外用postman访问一样)/ # curl -X GET 'https://api.vskit.tv/viskit-activity/pray/number'{"code":"0","msg":"success","data":{"innerCode":"0","innerMsg":"Success","prayNumber":4013166}}也可以换成容器的ip地址或localhost来访问/ # curl -X GET 'localhost:8080/viskit-原创 2020-05-26 14:51:20 · 1201 阅读 · 0 评论 -
JAVA的对象list参数的校验
对于普通的对象参数校验,那很容易,直接在需要校验的属性上加上@NotNull、@NotBlank等注解即可。比如:public class Dog{ //一堆校验属性}然后在做参数使用时,用@Validated注解即可public AjaxResult<JsonNode> saveOrUpdate(@RequestBody @Validated Dog dog) throws Exception {}但是如果参数是对象组成的list,那这么做是无效的。这时的解决办法有两种:原创 2020-05-12 18:02:54 · 6835 阅读 · 0 评论 -
泛型和枚举
泛型方法:注意与泛型类的区别。方法的形参符号不能与所属类一样。什么类需要定义为泛型类。比如BaseDAO.泛型方法,返回值前面一定有(或T等其他字母)泛型类和泛型接口没啥区别,就是接口和类的区别枚举类可以用于实现单例模式,这时的枚举只有一个对象。一般情况下,如果一个类不重写tostring方法,则打印的是地址值。enum的父类Enum中已经重写了一个tostring方法,打印的是枚举的...原创 2020-04-27 22:29:25 · 405 阅读 · 0 评论 -
docker,阿里镜像失效的解决办法
创建好docker之后,运行以下命令,报错说网络不能连接。docker run hello-world这是因为默认从国外的仓库下载。配置阿里云镜像加速如下:{ "registry-mirrors": ["https://xxxxx"]}这时运行docker run hello-world,是可以执行成功了。但是报错了,也是网络问题。参照这篇文章的解决办法,https://b...原创 2020-03-04 11:28:14 · 7258 阅读 · 0 评论 -
JDK1.7的HashMap源码
1、构造函数(默认)static final int DEFAULT_INITIAL_CAPACITY = 16;static final float DEFAULT_LOAD_FACTOR = 0.75f;public HashMap() { this(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR);}默认的大小为16,负载因子...原创 2019-12-13 16:27:05 · 174 阅读 · 0 评论 -
json总结
Java中并没有内置JSON的解析,因此需要借助第三方类库。常用的有:1)Gson: 谷歌2)FastJson: 阿里巴巴3)JacksonFastJsonJSON.parseObject() :从字符串解析 JSON 对象JSON.parseArray():从字符串解析 JSON 数组JSON.toJSONString(obj/array):将 JSON 对象或 JSON 数组转化...原创 2019-11-01 15:41:07 · 126 阅读 · 0 评论 -
eclipse启动了tomcat,浏览器可以访问tomcat下的项目但不能访问tomcat主页
1、查看端口是否正确2、在tomcat中有没有webapps/ROOT文件夹tomcat默认"/"指向的是ROOT应用3、没有在eclipse中tomcat的server location设置到tomcat的安装目录,如下图所示:eclipse默认选择第一个,即Use workspace metadata,首先将server下面部署的所有项目都先remove掉,然后原创 2017-05-15 18:11:27 · 521 阅读 · 0 评论 -
欢迎使用优快云-markdown编辑器
java中路径问题的各种坑java中有很多很多路径问题,都比较偏细节,一不小心容易出错,现在将这些路径问题总结如下: 1、几个常用函数之间的区别: 如上图所示,要读去到config.properties,常用的方法有 1)FileInputStream 使用绝对路径,否则无法读取config.properties InputStream inStream=newFileInputStr原创 2017-08-09 14:01:33 · 164 阅读 · 0 评论 -
vim退出插入模式还能输入字符的问题
在vim编辑器中,退出了插入模式,还能插入字符。用:wq非但不能退出vim,还把这几个字符敲入进去,如下图:原因是:用的是中文输入法!原创 2017-10-17 14:53:37 · 302 阅读 · 0 评论 -
实战java高并发程序设计阅读笔记--第一章
1、并行计算在图像处理和服务端编程两个领域应用广泛。2、使用并行的原因有:1)提高性能2)将没有业务关联的代码分离为不同的的线程3、摩尔定律失效,CPU主频的提升遇到瓶劲。往多核发展4、同步、异步5、并发、并行6、阻塞与非阻塞7、死锁、饥饿(低优先级)、活锁(大家都谦让)8、java内存模型:1)原子性32位系统中long类型的读写不是原子性的,因为long有64位,2)可...原创 2019-06-06 14:37:38 · 218 阅读 · 0 评论 -
eclipse快捷操作
1.代码的try-catch的快捷引入方式原创 2019-06-08 12:00:29 · 139 阅读 · 0 评论 -
JAVA集合
1、泛型不能用基本数据类型,应该用包装类型。2、用Iterator对集合遍历ArrayList<Integer> list = new ArrayList<Integer>();//list添加元素代码省略 Iterator<Integer> iterator = list.iterator();while(iterator.hasNext()){...原创 2019-06-10 10:51:08 · 95 阅读 · 0 评论 -
HashMap笔记
1、HashMap每一个键值对也叫做Entry。2、HashMap数组的每一个元素不止是一个Entry对象,也是一个链表的头节点。每一个Entry对象通过Next指针指向它的下一个Entry节点。3、新来的Entry节点插入链表时,使用的是“头插法”,因为HashMap的发明者认为,后插入的Entry被查找的可能性更大。4、HashMap的初始长度默认是16,每次自动扩展或手动初始化时,长度...原创 2019-07-18 13:00:57 · 123 阅读 · 0 评论 -
小创业公司成长中的架构演进
小创业公司成长过程1、注册用户20万,每天活跃用户1万,每天单表数据量就1000,然后高峰期每秒钟并发请求最多就10。2、注册用户数2000万!每天活跃用户数100万!每天单表数据量10万条!高峰期每秒最大请求达到1000!3、感觉压力有点大了。每天多10万条数据,一个月就多300万,马上就破千万了。但勉强还能撑。高峰期请求1000,数据库撑1000 QPS也还凑合。4、此时每天活跃...原创 2019-08-01 07:15:01 · 245 阅读 · 0 评论 -
Minor GC、Full GC、空间担保机制
注意:在java1.6之后-XX:HandlePromotionFailure默认是打开的,不用设置也会判断与平均值的逻辑,但是为了思维的连贯性,还是保留在图里。原创 2019-08-05 10:37:53 · 443 阅读 · 0 评论 -
ArrayList源码分析(一)
本文对ArrayList的源码分析基于jdk1.8进行。1、ArrayList的创建创建一个ArrayList:List<String> list = new ArrayList<>();调用构造方法:public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA...原创 2019-08-05 15:17:06 · 106 阅读 · 0 评论 -
ArrayList源码分析(二)
在上一节讲ArrayList增加元素的源码时,还遗留了一个ensureCapacityInternal方法。第一次调用add方法时1、add方法如下:public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; ...原创 2019-08-05 16:58:10 · 699 阅读 · 0 评论 -
LinkedList源码分析(一)
List代码中有大量的transient修饰,用transient修饰的变量,序列化时会忽略。transient Node<E> first;1、add方法public boolean add(E e) { linkLast(e); return true; }点击linkLast进入如下代码void linkLast(E e) { f...原创 2019-08-05 22:16:27 · 146 阅读 · 0 评论 -
LinkedList源码分析(二)
getFirst(),获取头部元素public E getFirst() { final Node<E> f = first; if (f == null) throw new NoSuchElementException(); return f.item;}直接返回first指针对应的内容即可。peek(),获取头部元素public ...原创 2019-08-05 22:38:45 · 139 阅读 · 0 评论 -
LinkedList源码分析(三)
1、removeLast(),删除尾部元素public E removeLast() { final Node<E> l = last; if (l == null) throw new NoSuchElementException(); return unlinkLast(l);}点击unlinkLast进入如下代码priv...原创 2019-08-05 23:13:09 · 115 阅读 · 0 评论 -
Stack的源码分析
1、push()方法,压入数据到栈底 public E push(E item) { addElement(item); return item;}点击addElement会进入到Vector当中去,Vector是个有序和public synchronized void addElement(E obj) { modCount++; ensure...原创 2019-08-05 23:41:04 · 130 阅读 · 0 评论 -
JVM总结(五)
CMS执行垃圾回收分为4个阶段1)初始标记标记出来所有GC Root直接引用的对象。会造成STW,但影响不大,因为速度快。2)并发标记垃圾回收和工作线程并行,尽可能的对所有的对象进行Root追踪。最耗时的阶段,但因为是并行的,不会对系统造成影响。3)重新标记重新标记第二阶段里新创建的一些对象,还有一些已有对象可能失去引用变为垃圾。STW,但速度快,因为只是标记系统运行第二阶段的对象。...原创 2019-08-06 11:03:26 · 101 阅读 · 0 评论 -
HashMap源码(六)
putVal方法final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { //省略 if (++size > threshold) resize(); //省略}分析:1)每次put了一个key-value对后,就会size++,且...原创 2019-08-08 23:15:54 · 122 阅读 · 0 评论 -
HashMap源码(七)----核心原理总结
1、hash算法为何要高16位和低16位做异或运算? 后续环节的位运算用的是低16位,如果不把hashcode值的高16和低16位进行运算,就会导致后面通过hash值找数组的index时,只有低16位参与了运算。有了该异或运算,在hash值的低16位里面,同时保留了高16位和低16位的特征。定位index时,可以降低hash冲突的概率,减少hash冲突。2、为何定位时将hash值和数组.le...原创 2019-08-08 23:48:39 · 163 阅读 · 0 评论 -
HashMap源码(八)
get方法public V get(Object key) { Node<K,V> e; return (e = getNode(hash(key), key)) == null ? null : e.value;}点击getNode方法进入如下代码:getNode方法final Node<K,V> getNode(int hash, Obj...原创 2019-08-09 08:19:36 · 113 阅读 · 0 评论 -
JVM总结(六)
1、G1可以同时回收新生代和老生代的对象。2、G1特点:1)将堆分成了大小相等的多个Region。2)可以设置垃圾回收的预期停顿时间。比如1小时内的STW时间不能超过1分钟。3、G1会追踪每个Region的回收价值。就是如果对这个Region回收,需要耗费多长时间,可以回收掉多少垃圾。4、G1的核心设计思路:将STW控制在你指定的时间范围内,同时在有限的时间内尽可能回收更多的垃圾对象。...原创 2019-08-06 23:26:09 · 150 阅读 · 0 评论 -
HashMap源码(九)
remove方法public V remove(Object key) { Node<K,V> e; return (e = removeNode(hash(key), key, null, false, true)) == null ? null : e.value;}removeNode方法final Node<K,V> rem...原创 2019-08-09 09:00:00 · 108 阅读 · 0 评论 -
HashMap源码剖析(一)
怎么解决hash冲突问题,之前是链表了,JDK1.8之后就要是红黑树了。size指map中key-value对的数目,如果达到了指定大小 * 负载因子,那么就会扩容。transient int size;数组默认的初始大小,是16。ArrayList的默认初始大小是10。与ArrayList一样,一般会预估一下然后自己指定。static final int DEFAULT_INITIAL...原创 2019-08-07 07:52:49 · 110 阅读 · 0 评论 -
HashMap源码(二)
hash方法这一节主要老看看哈希算法,代码如下:static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);}对key做hashCode运算得到h,然后再对h无符号右移16位再与h做异或运算。h无符号右移16...原创 2019-08-07 09:03:48 · 343 阅读 · 0 评论 -
HashMap源码(三)
put方法public V put(K key, V value) { return putVal(hash(key), key, value, false, true);}点击putVal进入如下代码:final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean e...原创 2019-08-07 10:02:35 · 131 阅读 · 0 评论 -
HashMap源码(四)
这一节着眼于分析哈希冲突的解决。其实,两个不同的key,hash值一样的概率是很低的,除非是你自己乱写的hashCode()方法。冲突一般出现在key不一样,hash值也不一样,但是通过寻址算法,定位到了同一个index,就会出现冲突,默认,会用单向链表来处理。put方法public V put(K key, V value) { return putVal(hash(key), ...原创 2019-08-07 11:34:29 · 108 阅读 · 0 评论 -
HashMap源码(五)
JDK 1.8以后,如果链表长度达到8,那就会转为红黑树,时间复杂度会变成O(logn),性能得到大幅度的提升。putVal方法 节选出遍历链表的一段,如下:for (int binCount = 0; ; ++binCount) { if ((e = p.next) == null) { p.next = newNode(hash, key, value, nu...原创 2019-08-07 12:44:26 · 208 阅读 · 0 评论 -
dubbo服务治理、服务降级以及重试
1、服务治理(1)调用链路自动生成(2)服务访问压力以及时长统计 1)每个服务的每个接口每天被调用多少次,TP50,TP90,TP99,三个档次的请求延时分别是多少; 2)一个完整的请求链路经过几十个服务之后,完成一次请求,每天全链路走多少次。(3)服务分层(避免循环依赖)。(4)调用链路失败监控和报警。(5)服务鉴权,我这个服务,只能部分服务可以访问。(6)每个服务的可用性的...原创 2019-08-18 22:44:52 · 213 阅读 · 0 评论 -
分布式幂等性
1、单机上的幂等性问题只要在内存中搞个set或map即可。2、分布式系统幂等性(1)数据库的唯一id(2)set order_id payed,下一次请求过来,先查对应的key是否payed。3、总结网络问题(比如延迟)导致的请求重新发送是难免的,如果不考虑幂等性,后果是很严重的。...原创 2019-08-18 23:07:40 · 121 阅读 · 0 评论 -
分布式系统中如何保证顺序性?
1、问题2、99%的顺序性方案思路:把要保证顺序的同一个key的数据或请求都哈希分发到同一个机器上去处理。然后这个机器把这些请求发到同一个内存queue中,然后要用同一个线程消费。3、100%的顺序性方案要保证100%,只能基于分布式锁。不建议采纳,性能很差。如果这个系统面向终端用户,则最好再加个MQ...原创 2019-08-18 23:30:26 · 1400 阅读 · 0 评论 -
zk使用场景
1、分布式协调2、分布式锁就是去创建一个znode,看能否创建得了。3、元数据/配置信息管理比如dubbo注册中心。4、HA高可用性hadoop、hdfs、yarn等很多大数据系统,都选择基于zk来开发HA高可用机制。...原创 2019-08-19 07:35:44 · 144 阅读 · 0 评论 -
多线程研究
1、多个服务共有的pojo类最好抽取到一个common工程中。2、从面相对象的角度,Lease应该作为ServiceInstance的内部类。因为Lease不能脱离ServiceInstance而存在。3、将一个线程改为demon线程public ServiceAliveMonitor() { this.daemon = new Daemon(); // 只要设置了这个标志位...原创 2019-08-14 12:41:16 · 102 阅读 · 0 评论 -
Thread初始化过程的源码
1、构造器public Thread() { init(null, null, "Thread-" + nextThreadNum(), 0);}点击nextThreadNum进入步骤2。点击init进入步骤3。2、nextThreadNum方法private static synchronized int nextThreadNum() { return thread...原创 2019-08-14 20:25:07 · 494 阅读 · 0 评论 -
Thread类启动的源码
1、start方法public synchronized void start() { if (threadStatus != 0) throw new IllegalThreadStateException(); group.add(this); boolean started = false; try { start0(...原创 2019-08-14 22:21:49 · 175 阅读 · 0 评论