
Java
文章平均质量分 56
热爱满天星
这个作者很懒,什么都没留下…
展开
-
int和Integer - 每天5分钟搞定Java面试
先看以下两个面试题的输出结果题1public class IntAndInteger { public static void main(String[] args) { Integer a = new Integer(1); int b = 1; Integer c = 1; System.out.println...原创 2018-09-04 16:53:49 · 165 阅读 · 0 评论 -
子类引用父类的静态字段,不会导致子类初始化 - 每天五分钟搞定Java面试
先看代码// 父类public class SuperClass { static { System.out.println("SuperClass Init!"); } public static int value = 123;}//子类public class SubClass extends SuperClass{ static ...原创 2018-09-24 19:08:43 · 2483 阅读 · 0 评论 -
LinkedHashMap和HashMap的差别 - 每天五分钟搞定Java面试
我们先看下HashMap和LinkedHashMap的继承关系。这两个类都实现了Map接口,同时LinkedHashMap继承于HashMap。具体如下图所示。Map的设计思想就是以空间来换时间,主要用来存储键值对。键不可以重复,值可以重复。HashMap这里简要说一下HashMap的性质,具体的源码分析可以参见前面的博客https://blog.youkuaiyun.com/SMonkeyKing/...原创 2018-09-30 22:07:21 · 8010 阅读 · 1 评论 -
LinkedHashMap源码解读(JDK1.8)
在分析LinkedHashMap源码之前, 我们先看下LinkedHashMap在MyBatis缓存中的应用。我们知道LinkedHashMap继承于HashMap,所以底层结构还是数组+链表/红黑树。它的特殊之处在于维护了一个双向链表,使得在遍历Map时,输出是有序的。至于排序规则,是根据accessOrder变量来决定是按照插入顺序,还是按照访问顺序进行排序。MyBatis中的LruCach...原创 2018-10-01 22:02:40 · 305 阅读 · 0 评论 -
HTTP的重定向和转发的区别 - 每天五分钟搞定Java面试
一言以蔽之,转发是服务器行为,重定向是客户端行为。为什么这样说呢,这就要看两个动作的工作流程:转发转发过程:客户浏览器发送http请求----》web服务器接受此请求–》调用内部的一个方法在容器内部完成请求处理和转发动作----》将目标资源发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路...原创 2018-10-01 22:17:03 · 396 阅读 · 0 评论 -
最大栈的实现
问题描述一个栈stack,具有push和pop操作,其时间复杂度皆为O(1)。设计算法max操作,求栈中的最大值,该操作的时间复杂度也要求为O(1)。可以修改栈的存储方式,push,pop的操作,但是要保证O(1)的时间复杂度,空间时间复杂度无要求思路比较容易想到的是除了原始数据栈之外,再声明一个存放最大值的栈。每次加入数据后,都判断求得最新的最大值,然后把当前的最大值存入到maxSta...原创 2018-10-12 16:43:24 · 980 阅读 · 0 评论 -
分布式事务的解决方案
一、两阶段提交(2PC)两阶段提交就是使用XA协议的原理,我们先看下XA协议的原理。XA协议两阶段提交这种解决方案属于牺牲了一部分可用性来换取的一致性。在实现方面,在 .NET 中,可以借助 TransactionScop 提供的 API 来编程实现分布式系统中的两阶段提交,比如WCF中就有实现这部分功能。不过在多服务器之间,需要依赖于DTC来完成事务一致性,Windows下微软搞的有MSD...转载 2018-10-17 23:02:18 · 262 阅读 · 0 评论 -
Queue接口中remove()/poll()、add(e)/offer(e)、element()/peek()的区别 - 每天五分钟搞定Java
JDK源码中Queue接口定义上面的注释如下:A collection designed for holding elements prior to processing. * Besides basic {@link java.util.Collection Collection} operations, * queues provide additional insertion, ext...原创 2018-10-18 14:58:45 · 1187 阅读 · 0 评论 -
Java中的Stack源码解析
栈的两个关键操作,出栈和入栈。我们下面就从pop和push方法来详细解析Stack的源码。原创 2018-10-16 12:44:28 · 296 阅读 · 0 评论 -
求一个正整数的二进制表示包含多少1 - 每天五分钟搞定Java面试
Java中,int类型占四字节,即32位,这里我们假设正整数n是int型,那么正整数32的二进制表示为:0000 0000 0000 0000 0000 0000 0010 0000法一:位移法我们对每一位进行判断,首先判断最低位,如果是1,那1的总个数加1,然后右移一位后,再判断最低位,位移32次,进行循环判断。这种操作思路很简单,但存在一定的问题:不管n的二进制表示中含有多少个1,...原创 2018-10-16 13:36:23 · 1022 阅读 · 0 评论 -
分布式事务
事务数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。思考一个问题?为什么要引入事务,事务帮助我们解决了什么问题?事务的...原创 2018-10-16 23:32:20 · 216 阅读 · 0 评论 -
二叉树的先序、中序和后序遍历
二叉树我们先看下二叉树的定义二叉树是每个节点最多有两个子树的树结构。通常子树被称作为左子树和右子树。二叉树的遍历二叉树的遍历分为先序、中序和后序遍历。顺序是相对于根节点而言的。即先序遍历是先访问根节点,先序访问左子树,先序访问右子树;中序遍历是中序访问左子树,访问根节点,中序访问右子树;后序遍历是后序访问左子树,后序访问右子树,访问根节点。一般树的遍历都使用递归的方式实现,下面看下...原创 2018-10-28 22:23:48 · 373 阅读 · 0 评论 -
quartz cron表达式
CronTriggerCronTriggers往往比SimpleTrigger更有用,如果您需要基于日历的概念,而非SimpleTrigger完全指定的时间间隔,复发的发射工作的时间表。CronTrigger,你可以指定触发的时间表如“每星期五中午”,或“每个工作日9:30时”,甚至“每5分钟一班9:00和10:00逢星期一上午,星期三星期五“。即便如此,SimpleTrigger一样,Cr...原创 2018-11-15 15:23:29 · 233 阅读 · 0 评论 -
i18n是什么意思
在github上下载的源码,发现好几个过程都有i18n这个文件夹,查了一下为何如此命名,发现原因很有趣i18n是 Internationalization 这个英文的简写,国际化的意思,而Internationalization去掉头尾的i和n刚好还剩下18个字符,伟大的程序员!...原创 2018-11-14 11:57:48 · 7460 阅读 · 1 评论 -
重构
本文主要从以下几个方面宏观介绍重构1、什么是重构?2、为什么要重构?3、怎么进行重构?什么是重构?重构的定义:重构(名词):对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。重构(动词):使用一系列重构手法,在不改变软件可观察行为的前提下,调整其结构。从名词形式和动词形式的两个定义可知,重构的前提是不改变软件可观察行为,基于这个前提...原创 2018-12-21 16:02:01 · 545 阅读 · 0 评论 -
Java8 函数式接口
本篇文章主要从三个方面对函数式接口进行描述,分别为定义、声明和用途。定义函数式接口(Functional Interface FI):只含有一个抽象方法的接口为函数式接口。注:接口中的声明的方法,默认的修饰符是public abstract接口中的定义的变量,默认的修饰符是public static final声明Java8提供了@FunctionalInterface注解, 为了...原创 2018-12-25 13:37:57 · 213 阅读 · 0 评论 -
Java7 try-with-resources
阿里巴巴Java开发手册中关于异常日志的处理,有一条规范是:finally块必须对资源对象、流对象进行关闭,有异常也要做try-catch。如果是JDK7及以上,可以使用 try-with-resources。在讲解 try-with-resources之前,我们先看下利用try-catch-finally进行异常检测和资源管理的方式。参考:http://ifeve.com/java-7中的t...原创 2018-12-25 14:48:40 · 277 阅读 · 0 评论 -
Exception和Error的区别——每天五分钟搞定Java面试
完全原创 2018-12-25 20:06:06 · 441 阅读 · 0 评论 -
Fork/Join框架
Fork/Join框架设计步骤一 : 分割任务 首先我们需要有一个fork类把大任务分割成子任务,有可能子任务还是很大,所以还需要不停的分割,直到分割出的子任务足够小步骤二:执行任务并合并结果 分割的子任务分别放在双端队列里,然后几个启动线程分别从双端队列里获取任务执行。子任务执行完的结构都统一放在一个队列里,启动一个线程从队列里拿数据,然后合并这些数据。Fork/Join使用两个类来...原创 2018-09-24 15:25:39 · 247 阅读 · 0 评论 -
进程和线程 - 每天五分钟搞定Java面试
进程特征结构特征 通常的程序是不能并发执行的,为使程序(含数据)能并发执行,应为之分配一进程控制块。 程序段、相关的数据段和PCB构成进程实体动态性 进程的实质是进程实体的一次执行过程 由创建而产生、由调度而执行、由撤销而消亡并发性 多个进程实体同存于内存中,且能在一段时间内同时运行。 程序是不能并发执行的独立性 进程实体是一个能独立运行、独立分配资源和独立接受调...原创 2018-09-13 22:10:56 · 193 阅读 · 0 评论 -
不可变类 - 每天五分钟搞定Java面试
面试题 什么是不可变类? String是不可变类吗? 如何创建一个不可变类?不可变类当类的对象创建后,它的值就不可以再更改了如何创建一个不可变类将类声明为final,所以它不能被继承将所有的成员声明为私有的,这样就不允许直接访问这些成员对变量不要提供setter方法将所有可变的成员声明为final,这样只能对它们赋值一次通过构造器初始化所有成...原创 2018-09-04 20:10:08 · 396 阅读 · 0 评论 -
Java创建线程的三种方式 - 每天五分钟搞定Java面试
继承Thread(1)定义Thread类的子类,重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。 (2)创建Thread子类的实例,即创建了线程对象。 (3)调用线程对象的start()方法来启动该线程。class thread extends Thread { @Override public void run() ...原创 2018-09-11 14:45:54 · 193 阅读 · 0 评论 -
Java线程池 - 每天五分钟搞定Java面试
为什么要使用线程池?上一篇论文讲了创建线程的三种方式,但是我们都知道创建线程、销毁线程都需要消耗资源。如果在并发线程数量比较多,频繁的创建和销毁线程必将对计算机的性能造成影响。所以我们就思考,当创建一个线程后,它执行完某个任务,不立即销毁,而是等待执行其他任务,因此产生了线程池化的概念。 对于线程池的建立,首先降低了资源消耗,同时提高了响应速度。而且线程池对线程进行统一管理,提高了线程的可管...原创 2018-09-11 16:27:43 · 318 阅读 · 0 评论 -
String,StringBuilder和StringBuffer的区别 - 每天5分钟搞定Java面试
Java平台提供了两种类型的字符串:String和StringBuffer/StringBuilder,它们可以储存和操作字符串。其中String是只读字符串,也就意味着String引用的字符串内容是不能被改变的。而StringBuffer/StringBuilder类表示的字符串对象可以直接进行修改。StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,区...原创 2018-09-05 15:40:10 · 212 阅读 · 0 评论 -
JDK1.8 StringBuilder源码分析
StringBuilderJDK1.5开始引入了StringBuilder,虽然它是线程不安全的。但在平时开发过程中使用频率很高。即时StringBuffer是线程安全的,但是在开发中几乎不用。上一篇文章也指出对于字符串的+号操作,即拼接也都是转化为了StringBuilder的append方法。 如果没有循环的情况下,单行用加号拼接字符串是没有性能损失的,java编译器会隐式的替换成str...原创 2018-09-05 16:44:48 · 414 阅读 · 0 评论 -
负载均衡算法
负载均衡一台服务器的处理能力,主要受限于服务器自身的可扩展硬件能力。所以,在需要处理大量用户请求的时候,通常都会引入负载均衡器,将多台普通服务器组成一个系统,来完成高并发的请求处理任务。最早的负载均衡技术是通过DNS来实现的,将多台服务器配置为相同的域名,使不同客户端在进行域名解析时,从这一组服务器中的请求随机分发到不同的服务器地址,从而达到负载均衡的目的。但在使用DNS均衡负载时,由...原创 2018-09-11 22:15:00 · 420 阅读 · 0 评论 -
HashMap - 每天五分钟搞定Java面试
HashMap是Java面试中出现频率很高的一个问题。以下是我在面试中碰到的几种提问方式:面试官1:你使用过Java的集合类吗?这时候如果你提到HashMap,那面试官就会顺势问下去。当然你可以说实现List接口的ArrayList等,或者是实现Set接口的HashSet等,后续的问题会随着你的回答有所不同。面试官2:你知道HashMap吗?说下它的存储结构?初始容量?容量为什...原创 2018-09-03 14:47:51 · 921 阅读 · 0 评论 -
死锁 - 每天五分钟搞定Java面试
死锁死锁是操作系统层面的一个错误,是进程死锁的简称,最早在 1965 年由 Dijkstra 在研究银行家算法时提出的,它是计算机操作系统乃至整个并发程序设计领域最难处理的问题之一。事实上,计算机世界有很多事情需要多线程方式去解决,因为这样才能最大程度上利用资源,才能体现出计算的高效。但是,实际上来说,计算机系统中有很多一次只能由一个进程使用的资源的情况,例如打印机,同时只能有一个进程控制...原创 2018-09-06 19:21:52 · 220 阅读 · 0 评论 -
并发 - 每天五分钟搞定Java面试
面试中经常会被问到一些并发相关的问题,面试官会问 你了解并发编程吗? 你知道什么是线程安全吗? 怎么实现线程安全? synchronized? volatile? CAS? 你知道concurrent包下面的并发集合类吗? 等等多线程是在同一个程序内部并行执行,因此会对相同的内存空间进行并发读写操作。如果一个线程在读一个内存时,另一个线程正向该内存进行写操作,那进行读操作的那个...原创 2018-09-06 20:41:30 · 439 阅读 · 0 评论 -
Collection - 每天五分钟搞定Java面试
Java集合框架 上图从菜鸟教程上截取。从图中可以看出,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、LinkedList、HashSet、Linked...原创 2018-09-16 17:01:38 · 293 阅读 · 0 评论 -
Set - 每天五分钟搞定Java面试
Set是Collection的子接口,Collection是Iterable子接口public interface Set<E> extends Collection<E> { int size(); boolean isEmpty(); boolean contains(Object o); Iterator&a原创 2018-09-16 17:31:09 · 430 阅读 · 0 评论 -
HashSet如何实现元素不重复 - 每天五分钟搞定Java面试
我们知道Set的一个重要性质就是元素不重复。那作为Set接口的实现类HashSet是如何做到元素不重复的呢?我们很容易想到在添加元素的时候,需要进行判断,即加入的新元素是否已经存在于hashSet中,如果存在则不加入,不存在加入集合。public class HashSet<E> extends AbstractSet<E> implements Set...原创 2018-09-16 23:36:41 · 609 阅读 · 0 评论 -
Java8语言新特性 - 每天五分钟搞定Java面试
Java 8 为Java语言、编译器、类库、开发工具与JVM(Java虚拟机)带来了大量新特性。这篇文章主要讲解Java8在语言方面的新特性。Lambda表达式与Functional接口Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中),或者把代码看成数据。 在最简单的形式中,一个lambda可以由用逗号分隔的参数列表、–>符号与函数体三部分表示。Arra...原创 2018-09-17 14:54:32 · 671 阅读 · 0 评论 -
深入分析java8新特性 - 接口默认方法
上一篇文章参考ImportNew,对Java8语言新特性进行了大概分析。这篇文章我们深入分析一下新特性之一:接口的默认方法。 在java8之前,接口中的方法仅仅是一个定义,是没有方法体的。这也是它和抽象类的一个差别。 在java8中,接口中新引入了默认方法。 什么是默认方法? 即方法使用default进行修饰,并且有具体的实现。如下面的Collection接口中的stream()...原创 2018-09-17 20:03:46 · 2099 阅读 · 0 评论 -
Spring Boot应用启动慢问题排查
之前应用能正常运行,几天没关机后,再次启动应用启动很慢,甚至无法启动,但是应用不报错。目前没法重现这个错误,而且最后也没有解决问题。 这篇文章主要记录一下排查过程,以及参考网上的排查方法和可能的原因。 1、查看了CPU、内存和IO使用情况,显示当前应用占用了很高的CPU 2、jps -l 查看进程 jstack pid | less 查看堆栈 jmap pid ...原创 2018-09-13 17:29:47 · 4723 阅读 · 0 评论 -
Java Map的遍历方式 - 每天五分钟搞定Java面试
参考:https://github.com/giantray/stackoverflow-java-top-qa/blob/master/contents/iterate-through-a-hashmap.md原创 2018-09-18 22:42:40 · 501 阅读 · 0 评论 -
CAS实现原子操作的三大问题 - 每天5分钟搞定Java面试
在Java中可以通过锁或循环CAS的方式来实现原子操作。但是CAS存在三大问题:ABA问题、循环时间长开销大,以及只能保证一个共享变量的原子操作。ABA问题CAS在操作值的时候,会先检查旧值是否发生变化,如果没有则更新。但是如果一个值原来是A,被改成B,后来又被改成A,那么使用CAS进行检查时会发现它的值没有发生变化,但实际上是改变了的。解决思路:使用版本号在变量前面加上版本号,每次变量...原创 2018-09-23 21:33:59 · 935 阅读 · 0 评论