
Java
文章平均质量分 80
抽离的心
其实我们大家的努力程度还远远没有到拼智商的程度(⊙o⊙)
展开
-
Comparable和Comparator
Java比较器Comparable和Comparator详解排序原理简介数组Arrays.sort()排序原理通过Java API文档知道,Arrays.sort()调用的是DualPivotQuicksort.sort()方法,如下代码片段所示: public static void sort(int[] a) { DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0); }DualPivotQuicksort.s原创 2022-03-20 14:33:27 · 972 阅读 · 0 评论 -
千万级规模高性能、高并发的网络架构经验分享
1.架构以及我理解中架构的本质 在开始谈我对架构本质的理解之前,先谈谈对今天技术沙龙主题的个人见解,千万级规模的网站感觉数量级是非常大的,对这个数量级我们战略上要重视它,战术上又要藐视它。先举个例子感受一下千万级到底是什么数量级?现在很流行的优步Uber,从媒体公布的信息看,它每天接单量平均在百万左右, 假如每天有10个小时的服务时间,平均QPS只有30左右。对于一个后台服务器,单机的平...转载 2018-07-08 23:50:17 · 432 阅读 · 0 评论 -
web.xml 中的listener、 filter、servlet 加载顺序及其详解
一、概述1、启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点。 2、紧急着,容创建一个ServletContext(servlet上下文),这个web项目的所有部分都将共享这个上下文。 3、容器将<context-param>转换为键值对,并交给servletContext。...转载 2018-07-09 16:04:39 · 246 阅读 · 0 评论 -
同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO
一、BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要对每个请求建立一个线程等待请求,而客户端发送请求后,先咨询服务端是否有线程可响应,如果没有则会一直等待或者遭到拒绝请求;如果有的话,客户端会调用当前线程且等待线程处理结束后才继续执行后续逻辑。二、NI...转载 2018-07-11 20:22:07 · 270 阅读 · 0 评论 -
Java排序算法进阶(希尔、堆、归并、奇偶)
package com.luna.test;import java.util.ArrayList;import java.util.List;public class JavaSort { public static void main(String[] args) { int a[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98...原创 2018-07-23 23:20:07 · 474 阅读 · 0 评论 -
Java方法区、永久代、元空间、常量池详解
1.JVM内存模型简介堆——堆是所有线程共享的,主要用来存储对象。其中,堆可分为:年轻代和老年代两块区域。使用NewRatio参数来设定比例。对于年轻代,一个Eden区和两个Suvivor区,使用参数SuvivorRatio来设定大小; Java虚拟机栈/本地方法栈——线程私有的,主要存放局部变量表,操作数栈,动态链接和方法出口等; 程序计数器——同样是线程私有的,记录当前线程的行号...原创 2018-07-14 18:55:20 · 37834 阅读 · 36 评论 -
数据结构经典算法
1.数组中除了两个数只出现过一次,其他的均出现过两次,请找出这两个只出现过一次的数。 例如:{10,9,8,7,6,6,7,8,9,10,5,5,4,3};4和3只出现过一次,请找出出现过一次的数。首先想到的代码应该是上一个提到的遍历两次取出没有找到的相同的数字,代码如下:public static List findOnlyNum(int[] array) { List&...原创 2018-07-25 22:13:03 · 1671 阅读 · 0 评论 -
为什么重写Java对象的equals()方法需要同时重写hashcode()方法?
1.equals()的所属以及内部原理(即Object中equals方法的实现原理) 说起equals方法,我们都知道是超类Object中的一个基本方法,用于检测一个对象是否与另外一个对象相等。而在Object类中这个方法实际上是判断两个对象是否具有相同的引用,如果有,它们就一定相等。实际上我们知道所有的对象都拥有标识(内存地址)和状态(数据),同时“==”比较两个对象的的内存地址...转载 2018-07-25 22:50:15 · 1479 阅读 · 0 评论 -
浅谈String.intern()方法
1.String类型“==”比较样例代码如下:package com.luna.test;public class StringTest { public static void main(String[] args) { String str1 = "abc"; String str2 = "abc"; String str3 = "a"; ...原创 2018-07-14 22:43:33 · 54024 阅读 · 20 评论 -
Java经典递归算法
1.斐波那契数列package com.luna.base;public class BirthRabbit { public static void main(String[] args) { int i = 1; for (i = 1; i <= 20; i++) { System.out.println("兔子第" + i + "个月的总数为:" + f(i)); ...原创 2018-06-16 23:17:57 · 61936 阅读 · 1 评论 -
递归实现Long、Integer、String逆序输出
1.递归逆序输出Integer类型的正整数字符串:/** * 递归输出反转后Integer类型字符串 * @param a * @return */ public static String reverseIntToStringForLoop(Integer a) { if (a < 0) return ""; if (a < 10) return...原创 2018-06-16 22:21:57 · 563 阅读 · 0 评论 -
彻底理解ThreadLocal
1.ThreadLocal相关类介绍ThreadLocalMap(内部类)Thread 首先,在Thread类中有一行: /* ThreadLocal values pertaining to this thread. This map is maintained by the ThreadLocal class. */ ThreadLocal.ThreadLocalMap thr...转载 2018-05-24 20:25:17 · 231 阅读 · 0 评论 -
Spring Bean的生命周期
1.SpringBean的生命周期原创 2018-06-12 22:34:21 · 172 阅读 · 0 评论 -
RocketMQ RabbitMQ KafKa对比
ActiveMQ RabbitMQ KafKa对比转载 2018-06-13 23:17:28 · 993 阅读 · 0 评论 -
集群/分布式环境下常用session处理策略
转载自:http://blog.youkuaiyun.com/u010028869/article/details/50773174?ref=myread前言 在搭建完集群环境后,不得不考虑的一个问题就是用户访问产生的session如何处理。如果不做任何处理的话,用户将出现频繁登录的现象,比如集群中存在A、B两台服务器,用户在第一次访问网站时,Nginx通过其负载均衡机制将用户请求...转载 2018-06-01 09:06:02 · 267 阅读 · 0 评论 -
分布式开发redis的重要性
文章内容提要:本文围绕以下几点进行阐述1、为什么使用redis2、使用redis有什么缺点3、单线程的redis为什么这么快4、redis的数据类型,以及每种数据类型的使用场景5、redis的过期策略以及内存淘汰机制6、redis和数据库双写一致性问题7、如何应对缓存穿透和缓存雪崩问题8、如何解决redis的并发竞争问题正文1、为什么使用redis分析:博主觉得在项目中使用redis,主要是从两个...转载 2018-06-23 13:09:38 · 5389 阅读 · 1 评论 -
如何判断两个链表是否相交?如果相交求交点
问题描述:一个比较经典的问题,判断两个链表是否相交,如果相交找出他们的交点。(注意两个单链表相交不会出现X型交叉——单链表,每个节点只有一个指针域)。第一种情况:两个链表均不含有环解题思路:1、直接法:采用暴力的方法,遍历两个链表,判断第一个链表的每个结点是否在第二个链表中,时间复杂度为O(len1*len2),耗时很大;顺序查询到第一个在第二个链表种的节点即是两个链表的交点。2、先遍历第一个链表...原创 2018-06-23 22:34:05 · 10539 阅读 · 2 评论 -
深入理解BeanFactory
1.BeanFactory概述 Spring的本质是一个bean工厂(beanFactory)或者说bean容器,它按照我们的要求,生产我们需要的各种各样的bean,提供给我们使用。只是在生产bean的过程中,需要解决bean之间的依赖问题,才引入了依赖注入(DI)这种技术。也就是说依赖注入是beanFactory生产bean时为了解决bean之间的依赖的一种技术而已。那么我们为什么需要...转载 2018-06-16 11:25:20 · 1254 阅读 · 0 评论 -
Mybatis缓存简介
1.Mybatis数据库缓存概述 Mybatis提供查询缓存,用于减轻数据压力,提高数据库性能。Mybatis提供一级缓存和二级缓存。Mybatis提供一级缓存和二级缓存。Mybatis一级缓存的作用域是同一个SqlSession,在同一个sqlSession中两次执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而...原创 2018-06-16 13:11:36 · 582 阅读 · 0 评论 -
判断一个数字是否为素数
素数的定义 如果一个正整数p只有两个因子1和p,则称p为素数。素数算法实现一public boolean isPrime1(int n) { //判断一个数字是否为质素:时间复杂度为O(n) if (n < 2) return false; for (int i = 2; i < n; ++i) if (n % i == 0) return false; ...原创 2018-07-15 10:49:38 · 960 阅读 · 0 评论 -
一个 Linux上分析死锁的简单方法
1.简介 死锁 (deallocks): 是指两个或两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程(线程)称为死锁进程(线程)。 由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程(线程)在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产...转载 2018-07-15 11:20:16 · 1459 阅读 · 0 评论 -
堆栈的深入理解
一、引言 编程语言书籍中经常解释值类型被创建在栈上,引用类型被创建在堆上,但是并没有本质上解释这堆和栈是什么。我仅有高级语言编程经验,没有看过对此更清晰的解释。我的意思是我理解什么是栈,但是它们到底是什么,在哪儿呢(站在实际的计算机物理内存的角度上看):1.在通常情况下由操作系统(OS)和语言的运行时(runtime)控制吗?2.它们的作用范围是什么?3.它们的大小由什么决定?4....转载 2018-12-15 11:44:06 · 486 阅读 · 1 评论 -
过滤器、拦截器、监听器的区别详解
一.定义过滤器:Java过滤器能够对目标资源的请求和响应进行截取。依赖于servlet容器,在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等过滤器是一个程序,...原创 2018-12-16 11:58:09 · 1581 阅读 · 2 评论 -
减少代码中臃肿的if-else
一、概述 不知大家有没遇到过像“横放着的金字塔”一样的if else嵌套:if (true) { if (true) { if (true) { if (true) { if (true) { if (true) { ...转载 2018-12-17 09:31:41 · 498 阅读 · 0 评论 -
Received fatal alert: protocol_version” ——Maven Project Error
Received fatal alert: protocol_version” or “peer not authenticated” from Maven Central?解决方案 这个错误主要发生在jdk7的maven项目中,因为jdk7默认不支持TSL 1.2协议,故可以手动安装TSL 1.2协议的支持,maven命令如下所示:mvn -Dhttps.protoco...原创 2019-01-24 18:19:56 · 4806 阅读 · 0 评论 -
浅谈JVM调优
1.数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:它代表的值就是数值本身,而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。基本类型包括:byte、short、int、long、char、float、double、boolean;引用类型包括:类类型、接口类型...转载 2019-03-23 11:57:26 · 345 阅读 · 0 评论 -
Java自定义对象实现双向链表
package com.luna.util;/** * 定义双向链表结构对象:考虑到双向链表可以存储基本数据类型、字符串、对象故节点封装用泛型参数; * 考虑到双向链表数据结构的隐私和安全性,链表的所有属性和节点内部定义类均用private修饰;双向 * 链表:双向链表(双链表)是链表的一种。和单链表一样,双链表也是由节点组成,它的每个数据结点中 * 都有两个指针,分别指向直接后继和...原创 2019-04-05 17:45:10 · 666 阅读 · 0 评论 -
自己动手写一个服务网关
一、引言1.1什么是网关?为什么需要使用网关? 如图所示,在不使用网关的情况下,我们的服务是直接暴露给服务调用方。当调用方增多,势必需要添加定制化访问权限、校验等逻辑。当添加API网关后,再第三方调用端和服务提供方之间就创建了一面墙,这面墙直接与调用方通信进行权限控制。本文所实现的网关源码抄袭了---Oh,不对,是借鉴。借鉴了Zuul网关的源码,提炼出其核心思路,实现了一...转载 2019-04-15 17:38:02 · 1616 阅读 · 1 评论 -
Java8性能监控与调优
前言生产环境发生了内存溢出该如何处理?生产环境应该给服务器分配多少内存合适?如何对垃圾收集器的性能进行调优?生产环境CPU负载飙高如何处理?生产环境应该给应用分配多少线程合适?不添加log的情况下,如何确定请求是否执行了某一行代码?不添加log的情况下,如何实时的查看某个方法的入参与返回值?JVM的字节码是什么东西?循环体中做字符串+拼接为什么效率低?字符串+拼接一定就是St...原创 2019-07-07 11:00:21 · 1290 阅读 · 0 评论 -
SpringMVC监听器详解
一、ContextLoaderListener ContextLoaderListener监听器的作用就是启动Web容器时,自动装配ApplicationContext的配置信息。因为它实现了ServletContextListener这个接口,web.xml配置这个监听器启动容器时,就会默认执行它实现的方法。在ContextLoader-Listener中关联了Contex...转载 2018-11-20 15:22:14 · 14070 阅读 · 2 评论 -
堆排序算法详解
一、堆排序算法原理和动态图解 将待排序的序列构造成一个大顶堆。此时,整个序列的最大值就是堆顶的根节点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中的次最大值。如此反复执行,就能得到一个有序序列了。这个过程其实就是先构建一个最大/最小二叉堆,然后不停的取出最大/最小元素(头结点),插入到新的队...原创 2018-10-14 16:45:41 · 30854 阅读 · 24 评论 -
Tomcat与JVM的优化
Tomcat 的缺省配置是不能稳定长期运行的,也就是不适合生产环境,它会死机,让你不断重新启动,甚至在午夜时分唤醒你。对于操作系统优化来说,是尽可能的增大可使用的内存容量、提高CPU 的频率,保证文件系统的读写速率等。经过压力测试验证,在并发连接很多的情况下,CPU 的处理能力越强,系统运行速度越快。Tomcat 的优化不像其它软件那样,简简单单的修改几个参数就可以了,它的优化主要有三方面,分为系...转载 2018-07-15 21:50:49 · 700 阅读 · 0 评论 -
SpringMVC的实现原理
1.SpringMVC框架介绍 Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。Spring的MVC框架主要由DispatcherServlet、处理器映射、处理器(控制器)、视图解析器、视图组成。2.SpringMV...转载 2018-07-15 22:42:05 · 476 阅读 · 0 评论 -
高并发下接口幂等性解决方案
一、背景 我们实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返回一样的结果。 例如1. 前端重复提交选中的数据,应该后台只产生对应这个数据的一个反应结果;2. 我们发起一笔付款请求,应该只扣用户账户一次钱,当遇到网络重发或系统bug重发,也应该只扣一次钱;3. 发送消息,也应该只发一次,同样的短信发给用户,用户会哭的;4. 创建业务订单,一次业务请求只能创建一个,创建多个...原创 2018-07-15 23:01:54 · 96620 阅读 · 22 评论 -
如何判断一个字符串是否是数字?
1.用JAVA自带的函数package com.luna.test;public class IsNUmber { public static void main(String[] args) { String s1 = "10"; String s2 = "-10"; String s3 = "a10"; String s4 = "10b"; String s5 =...原创 2018-07-26 23:08:41 · 2208 阅读 · 1 评论 -
并发包有了AtomicLong为什么还需要LongAdder?
1.AutomaticLong和LongAdder区别 AutomaticLong的底层是通过CAS(compareAndSwap)来实现线程的同步,是在一个死循环内不断的尝试修改目标的值,直到修改成功。如果在竞争不激烈的情况下,它修改成功的概率很高,否则的话修改失败的概率就会很高, 在大量修改失败的时候这些原子操作就会多次循环尝试, 因此性能就会受到影响。对于普通类型的long和...原创 2018-08-11 09:47:26 · 1825 阅读 · 0 评论 -
Http和Https的浅析
1.Http与Https的区别HTTP 的URL 以http:// 开头,而HTTPS 的URL 以https:// 开头; HTTP 是不安全的,而 HTTPS 是安全的; HTTP 标准端口是80 ,而 HTTPS 的标准端口是443; 在OSI 网络模型中,HTTP工作于应用层,而HTTPS 的安全传输机制工作在传输层; HTTP 无法加密,而HTTPS 对传输的数据进行加密;...转载 2018-09-25 23:14:01 · 369 阅读 · 0 评论 -
Java对象的Clone
1.对象Clone的意义Java中对象的克隆是通过实现Cloneable接口,重写Object的clone()来实现的。Object类clone()源代码如下所示:Object中的clone方法是protected的,所以要使用clone就必须继承Object类(默认)。并且为了可以使其它类调用该方法,覆写克隆方法时必须将其作用域设置为public; Object中的clone方法是na...原创 2018-09-22 11:38:19 · 413 阅读 · 0 评论 -
JAVA线程通信详解
目录一、概述二、wait/notify 机制三、Condition四、生产者/消费者模式五、线程间的通信——管道六、方法Join的使用一、概述 线程与线程之间不是相互独立的个体,它们彼此之间需要相互通信和协作,最典型的例子就是生产者-消费者问题:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列...转载 2018-10-14 09:11:36 · 23362 阅读 · 5 评论 -
Spring之旅第一章
Spring的核心功能是简化Java的开发。原创 2018-06-11 23:50:12 · 214 阅读 · 0 评论