
java
Healist
积极向上的小年轻,努力提高的小码农
展开
-
redis不能从连接池获取连接错误
有时候大意总会导致故障的出现,最近一个小小问题,我也记录一下吧在就要公司框架自己写了个redis访问dao,然后过去一段时间后线上出现过一次redis不能获取连接的频繁报错,然后当时重启恢复但是没有细跟,然后到了昨天一个happy的周末又出现这个频繁报错信息了并且有影响到线上接口了。。。。然后定位了下,应该我写的dao里的pipeline因为查询超时异常导致没有走到pipeline的释放操作,这样累积起来就恶性循环了,因为资源实现了autoclose接口,所以可以直接套用try-resource的写法解原创 2020-10-26 20:52:42 · 704 阅读 · 0 评论 -
AspectJ的LoadTimeWeave 织入与静态编译代理
最近在公司在折腾监控的事情,有用到LTW加载时期织入的代理去统一全部的监控框架使用,LTW比spring aop动态代理的好处在于不限制在spring容器内的bean类、而且对方法嵌套也同样支持(动态代理会生成额外的代理类解析this会有问题)整体开启使用,主要有以下三步:开启LTW在工程配置类上加上注解即可@EnableLoadTimeWeaving(aspectjWeaving = EnableLoadTimeWeaving.AspectJWeaving.AUTODETECT)LTW需要asp原创 2020-09-27 11:45:36 · 844 阅读 · 0 评论 -
sentinel的降级原理以及疑问--小记
sentinel是阿里的限流熔断工具,我今天正要在scg网关处使用sentinel来对下游api服务的调用加上限流熔断降级功能,看文档的时候关于限时降级我一直想的是当次请求不满足时长要求就要降级的,但是实际操作起来好像并不是这么回事。sentinel降级的原理比较简要的概括就是:统计时间窗口内的指标,并且定时reset这些窗口属性值,每次请求过来再根据当前窗口的值判断是否满足要求决定是否降级...原创 2020-04-15 23:02:45 · 957 阅读 · 0 评论 -
DFS的灵活应用二:零钱兑换
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1思路:数组整体降序排列,然后dfs深度遍历,每次都挑额度大的先拿,以目前金额能拿多少就拿多少,拿多了就回溯走其他情况,相当于要把全部情况走一遍找到最小次数代码设计中比较好的点:有的回溯是要在递归的后面做额外补偿,此处的回溯是基于...原创 2020-03-25 22:26:41 · 352 阅读 · 0 评论 -
阿里校招编程打牌题--DFS的灵活应用以及设计思路分析
可能在公司业务代码写的恶心了需要看看清新的内容,看了下昨天阿里校招实习的题目,题目内容:(看别人解题逻辑来启发自己,代码是别人的,思路是我总结的)有一叠扑克牌,每张牌介于1和10之间有四种出牌方法:单出1张出2张对子出五张顺子,如12345出三连对子,如112233给10个数,表示1-10每种牌有几张,问最少要多少次能出完分析思路:出牌方式有很多种,所以需要把每种出牌方式的...原创 2020-03-21 16:06:06 · 883 阅读 · 0 评论 -
最小堆JAVA(Top K问题)
Top k问题很多情况下比较常用的解决方法就是最小堆,最小堆的建立一般基于数组来模仿树的结构,左右子树和父节点都可以根据数学关系式来呈现,代码如下:public class MinHeap{ // 堆的存储结构 - 数组 private int[] data; // 将一个数组传入构造方法,并转换成一个小根堆 public MinHeap(int[] data)原创 2017-10-20 11:24:27 · 1315 阅读 · 0 评论 -
Java使用管道实现进程间通讯
常见的进程间通信方式: 管道通信 共享内存 Socket Java进程通讯Java没有共享内存机制,同时Java的管道也只能用于Java线程间的通讯。 下面是一个关于Java的管道简单的介绍:Java提供管道功能,实现管道通信的类有两组:PipedInputStream和PipedOutputStream或者是PipedReader和PipedWriter。管道通信主要用于转载 2017-04-09 19:55:36 · 2946 阅读 · 0 评论 -
java初始化的加载顺序
之前只是知道个大概就没细研究,发现面试或者笔试题还蛮容易考到的,所以我自己亲自试了一下,实践出真知。结论:1、父类的静态代码块先执行2、父类的静态变量加载3、子类的静态代码块执行4、子类的静态变量加载5、父类的动态代码块执行6、父类的构造函数执行7、子类的动态代码块执行8、子类构造函数执行9、最后才是子类实例的调用方法。原创 2017-04-13 15:41:16 · 333 阅读 · 0 评论 -
java 死锁例子
最近笔试面试参加了不少,本来就是优胜劣汰的过程没啥好说的,有各种形式的面试(压力面、交叉面等),但有时难免碰到sb的面试官 (Qunar某位二面面试官我TM就是在说你)书归正题,记录一下java死锁的经典例子:public class DeadLock { public static String obj1 = "obj1"; public static String obj2 = "原创 2017-04-19 09:32:58 · 613 阅读 · 0 评论 -
小谈LRU 和 LinkedHashMap
LRU (Least Recently Used)LRU算法其实就是缓存一定数目的数据,超过这个数目的时候就要删除对应一条最老的数据,如果插入的数据在缓存中已经存在说明缓存命中,那么就将这个节点放到队头表示最新。在java中的整体实现其实就是 链表、HashMap、再弄俩个头尾节点指针变量辅助就搞定了 。其实就是java里面的LinkedHashMap,而且LinkedHashMap中提供了现成的a原创 2017-05-23 20:21:22 · 417 阅读 · 0 评论 -
求二叉树中俩个节点的的距离
二叉树中俩点距离就是俩个点的边的条数。分析假设给定的节点为node1, node2,可以分为下面两种情况:1) node1是node2的祖先节点或孩子节点,可以理解为两个节点在一条线上。 例如:Dist(2,4), Dist(6,1)2) node1 和 node2 没有直接或间接的父子关系。 例如,Dist(4,3), 他们需要一个共同的祖先节点1 连接起来。这里涉及两个节点的最低公共祖先(LCA原创 2017-03-22 16:31:57 · 1214 阅读 · 0 评论 -
二叉树中找到俩个节点的最低公共祖先
方法一下面是一个简单的复杂度为 O(n) 的算法,解决LCA问题 1) 找到从根到n1的路径,并存储在一个向量或数组中。 2)找到从根到n2的路径,并存储在一个向量或数组中。 3) 遍历这两条路径,直到遇到一个不同的节点,则前面的那个即为最低公共祖先.方法二 (不利用额外空间,一次遍历)从root开始遍历,如果n1和n2中的任一个和root匹配,那么root就是LCA。 如果都不匹配,则分别递原创 2017-03-22 16:13:36 · 616 阅读 · 0 评论 -
理解ThreadLocal
ThreadLocal的作用是在多线程的情况下为每个线程都提供了线程内局部变量,每个线程都持有这个变量的副本,其实ThreadLocal设计的目的就是不共享变量,仅仅是提供线程内局域变量的作用。(要与 “同步”区分开,同步是为了共享变量),ThreadLocal可以包装任一类型的变量。引用一个网上很形象的说明:可以总结为一句话:ThreadLocal的作用是提供线程内的局部变量,这种变量在线程的生命原创 2017-03-20 13:07:47 · 321 阅读 · 0 评论 -
快速排序(java)
快排又被称为分割交换排序法,好像总会在面试或者笔试中做为考察点来考察,快排也是目前常见的一些排序算法中很不错的排序方法了(均衡考量平均时间运行较快,所以我想说最佳排序来着,不过怕被打脸)。快速排序关键步骤(从左往右由小到大): 1. 取一个键值K做为参照 2. 从左到右依次查找,找到一个Ki使得Ki>K 3. 从右到左依次查找,找到一个Kj使得Kjpublic class Quic原创 2017-02-06 23:19:43 · 453 阅读 · 0 评论 -
Top k问题的讨论(三种java实现)
在很多的笔试和面试中,喜欢考察Top K.下面从自身的经验给出三种实现方式及实用范围。合并法这种方法适用于几个数组有序的情况,来求Top k。时间复杂度为O(k*m)。(m:为数组的个数).具体实现如下:/*** 已知几个递减有序的m个数组,求这几个数据前k大的数*适合采用Merge的方法,时间复杂度(O(k*m);*/import java.util.List;import java.u转载 2017-02-24 22:28:50 · 1120 阅读 · 0 评论 -
字符串的排列与组合
字符串排列根据输入的字符数组打印出该字符串中字符的所有排列,例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有abc,acb,bac,bca,cab和cba的可能排列。 结果请按字母顺序输出。 public class AllSort { public void permutation(char[] buf, int start, int end) { if (转载 2017-02-23 18:05:47 · 459 阅读 · 0 评论 -
在spring项目中配置跨域访问
跨域是老生常谈的问题了,不同域名或者相同域名不同端口都会产生跨域访问的问题。解决方案1、在前端用jsonp的方式请求 2、后端设置响应头header 3、用Spring MVC 4.2+的版本,已经内置提供跨域支持(@CrossOrigin注解方式 或者 自己配置下 )我用的spring mvc4.0所以这里给出第二种方式根据拦截器来实现设置响应头:import javax.servlet.*;原创 2017-01-31 16:15:33 · 3610 阅读 · 1 评论 -
Java研发方向如何准备BAT技术面试
最近BAT等各大互联网巨头们的校招陆陆续续都准备开始了,可能对于在校的大多数学生来说,不知道如何正确衡量自己掌握的技术,更不知道BAT这样的公司会要求自己必须具备什么样的技术能力。对于Java研发方向的技术面试,这里总结了一些你必须要掌握的技术知识点,考察的内容会比这里总结的多,所以如果想要有一个很不错的offer,下面的知识点需要都具备。社招考察的内容会在此基础上增加项目经验、技术实战经验、热门技转载 2017-02-23 15:05:13 · 765 阅读 · 1 评论 -
String的equals 和 ==
String 的 equals 源码public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString原创 2017-05-23 22:58:16 · 331 阅读 · 0 评论 -
JVM内存区域划分 (粗略认识介绍)
程序计数器是一块较小的内存区域,可以看做为当前线程的字节码的行号指示器,为每个线程私有互不干扰。java虚拟机栈线程私有,生命周期与线程相同,描述java方法执行的内存模型,每当执行方法时就创建一个栈帧用于储存变量、操作数栈、动态链接、方法出口等信息; 每当创建一个新的线程,jvm就会分配一个对应的栈。 当无法申请足够的内存时抛出OutOfMemoryError。本地方法栈功能与虚拟机栈大致相同,原创 2017-05-23 22:46:45 · 395 阅读 · 0 评论 -
Java常见内存溢出(OOM)解决方案
讲解的很好的一篇文章,mark下了。Java常见内存溢出(OOM)解决方案转载 2017-04-24 16:11:15 · 766 阅读 · 0 评论 -
JVM问题排查记录
CPU报警背景:公司应用频繁cpu报警,火速开始排查。原因:在于一个Spark Job扫描任务将待处理数据通过RocketMq发消息的方式发送到datastore应用进行处理,应用接受处理的地方还使用了线程池(Fixed),所以积压严重并且线程池打满(不指定就默认整数大小的队列),所以这里把线程池改成自定义队列长度的写法调用策略为CallerRun。刷数据经过应用存储在couchbase...原创 2019-06-11 22:05:18 · 348 阅读 · 0 评论 -
说说Java8中的几个函数式接口
JAVA8中的函数式接口 Function、Supplier、Predicate、Consumer这几个接口在Java8中已经定义好,因为每个接口基本主要就有一个接口方法所以其实完全可以自己通过@FunctionalInterface自己定义使用,不过人家给你定义好了而且一般java8这些接口里面除了主要接口方法外还有几个default方法,所以很多时候我们直接用会更方便一些。Predic...原创 2018-04-07 10:31:00 · 433 阅读 · 0 评论 -
CountDownLatch与CyclicBarrier
这次介绍的是JAVA并发容器中的俩个常见容器:CountDownLatch与CyclicBarrierCountDownLatch (闭锁)听听这个名字,直白的翻译就是倒计时锁,功能也差不多,下面我白话介绍一下: 裁判在主持比赛通常都倒计时一下,3,2,1跑!然后几个运动员听到0的瞬间猛的跑出去。 CountDownLatch 的countDown方法执行一次就回在数量上减一...原创 2018-02-22 18:05:21 · 288 阅读 · 0 评论 -
浅谈一致性HASH
在实际开发中,我们经常会用到hash算法来分散分布数据到几个节点上(数据库分片或者服务器请求等等),但是在添加节点到时候就很可能导致大规模到数据迁移。接下来开始话糙理不糙的讲解,形式不重要,重在领会精神:传统hash取模示例如下10条数据,3个节点: 节点1:0,3,6,9 节点2:1,4,7 节点3:2,5,8这个时候添加一个节点4: 节点1:0,4,8 节点2:1,5...转载 2018-02-21 22:05:58 · 434 阅读 · 0 评论 -
JVM常见参数设置记录
-xx:newRadio:设置 young 和 old 的比例,-XX:NewRatio=4表示年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5 -xx:survivorRadio:设置 eden 和 survivor 的比例: survivor 大了,会浪费空间,空间利用率低。若 survivor 太小,会使一些大对象在 minor gc 时直接从 eden 区到 old 区,让 ol...原创 2018-02-21 17:57:43 · 629 阅读 · 0 评论 -
Synchronized的底层实现
此篇博客内容学习于此篇博客synchronized的使用场景修饰普通方法 (对象实例锁)修饰代码块 (对象实例锁)修饰静态方法 (类锁)synchronized底层原理(主要基于对象头和monitor来实现)synchronized的锁就是存在于对象头中,Monitor监视器就是相当于同步工具对象头对象头包括俩部分:1、Mark Word(标记字段...转载 2018-02-20 22:50:57 · 666 阅读 · 0 评论 -
生产者消费者的JAVA实现
生产者消费者问题,对于同一任务队列,生产者线程生产任务数据,消费者线程消费任务数据。常见实现方式如下: - 基于同步机制的wait/notify来实现 - 基于并发容器BlockingQueue (BlockingQueue只是接口,有很多不同的具体实现子类) - 管道通信 PipedInputStream / PipedOutputStream代码示例如下:BlockingQu...原创 2018-02-21 17:02:37 · 339 阅读 · 0 评论 -
JAVA中的Int范围
很简单有趣的一个知识点,但之前说实话没怎么注意原理,特此简单记录一下:以32位操作系统为例: JVM需要用32位来存储数据,范围最大值(十进制)就是2^32,但是这样就是0~2^32范围了,因为int有正负之分,所以舍出首位用01区分正负,所以int在JAVA中的范围就是正负2^31...原创 2018-02-20 23:10:21 · 824 阅读 · 0 评论 -
JAVA的wait和notify
多线程经常会接触到线程交互场景,wait和notify、notifyAll就是起到这个作用,三个方法必须要在synchronized锁区域内执行,也就是必须要有当前对象的monitor(锁)。wait: 阻塞当前线程,交出锁的控制权,等待下一次获取锁继续上次的执行notify:通知等待当前对象的monitor的线程进行唤醒(注:只能唤醒一个,后续在当前锁区域内的代码还会继续执行)notif...原创 2018-02-20 17:24:21 · 312 阅读 · 0 评论 -
serialVersionUID的作用
我们在实现Serializable接口进行序列化传输的时候,经常会涉及到定义一个long型的serialVersionUID,我们来说一下其作用。这里假设A端序列化传输,B端进行反序列化。1、A、B俩端序列号不一致结果:报java.io.InvalidClassException异常2、A、B俩端序列号一致,A端新增字段,B端不变结果:序列化和反序列化正常,不过新增字段在B端被...原创 2018-02-19 17:40:47 · 280 阅读 · 0 评论 -
Reponse响应头设置备注
简单记录一下java的reponse头设置类型content-type常见的媒体格式类型如下: - text/html : HTML格式 - text/plain :纯文本格式 - text/xml : XML格式 - image/gif :gif图片格式 - image/jpeg :jpg图片格式 - image/png:png图片格式以application开头的媒体格原创 2017-11-21 10:46:14 · 589 阅读 · 0 评论 -
Java 垃圾回收GC
1、我们都知道JVM中的栈和计算器是线程私有的,及栈的生命周期是和线程的生命周期一样的,而栈中存储的还包括java的基本数据类型(boolean、byte、char、short、int、float等等)。2、类加载器读取完毕类对应的字节码文件时就已经能确定这个类型的大小了。基于1、2俩点来提出正文内容。静态内存分配回收在java编译的时候就已经确定需要的空间大小,系统一次性分配给它,之后并不会变化,原创 2017-05-24 16:04:28 · 483 阅读 · 0 评论 -
最大连续子序列和:动态规划经典题目
【题目】给定k个整数的序列{N1,N2,…,Nk },其任意连续子序列可表示为{ Ni, Ni+1, …, Nj },其中 1 <= i <= j <= k。最大连续子序列是所有连续子序中元素和最大的一个,例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{11,-4,13},最大连续子序列和即为20。【注】:为方便起见,如果所有整数均为负数,则最大子序列和为0。解转载 2017-02-23 14:42:18 · 503 阅读 · 0 评论 -
java原生实现定时任务 与 Spring自带的定时任务
java原生实现定时任务:第一种基于无限循环的的Thread线程方法:public class ThreadExample { public static void main(String[] args) { final long timeInterval = 2000; Runnable runnable = new Runnable() {原创 2017-01-28 20:01:55 · 789 阅读 · 0 评论 -
Spring在多线程下@Resource注入为null
前情叙述记录以下这个坑,我的情况大致是这样的,我在用webmagic写爬虫,在类中通过@Resoource(@Autowired也一样)注入dao接口实例。然后我在process方法中引用这个实例发现这个实例在这里一直为null,然后我在测试类或者当前类的main函数中引用dao实例就没问题,一切正常(当时 黑人问号脸???)几经波折,发现原因是spring和多线程安全的问题,不让注入。因为我也没研原创 2017-01-30 23:34:31 · 3194 阅读 · 0 评论 -
平衡二叉查找树(JAVA)
之前我分享过二叉查找树(也叫二叉排序树)的BST博客二叉排序树 与 平衡二叉排序树俩者官方定义二叉排序树定义就是(1)任何节点的左节点值都比当前根节点值小。(2)所有右节点值都比当前根节点值大。 (3)且所有子树也都是二叉排序树。平衡二叉排序树定义(1)首先整体为二叉查找树。(2)左子树与右子树的深度之差的绝对值小于或等于1。 (3),左右子树也是平衡二叉查找树。我们有了二叉排序树为什么我们还需要原创 2017-02-10 16:51:26 · 1093 阅读 · 0 评论 -
常见的查找算法(顺序、二分、插值、斐波那契查找,哈希查找)
顺序查找、二分查找(非递归)、二分查找(递归)、插值查找:public class Search { int SequenceSearch(int[] arr, int value) { for(int i=0; i<arr.length; i++) { if(arr[i] == value) { return i;转载 2017-02-07 23:05:07 · 1017 阅读 · 0 评论 -
设计模式之设配器模式
适配器模式的作用相当于一种中间件,让俩个对接有冲突的模块很好的捏合在一起从而发挥作用,适配器在其中就是胶水的作用。看一下代码实例,现在有绿头鸭和火鸡俩种动物,但假如现在你缺少了鸭子对象想用火鸡对象来冒充鸭子,看一下如何通过适配器模式来解决。俩种动物的功能接口public interface Duck { public void quack(); public void fly();原创 2017-01-18 20:47:23 · 484 阅读 · 0 评论 -
设计模式之命令模式(java)
命令模式,其实就是进一步封装,把方法调用封装起来,head first中举了一个很生动的例子,饭店中点餐的流畅如下:客户点了订单并交给服务端,然后女招待把订单交给大厨的师傅,大师傅最后呈现出一道可口的菜肴。 在这个过程中,客户只需要知道来饭店点好菜单就可以等吃饭了,服务员也是只需要知道把订单交给大厨,而大厨也只需要如何根据订单来做错了事情。实现一个打开电灯的命令public interface C原创 2017-01-12 04:27:20 · 345 阅读 · 0 评论