
Java
文章平均质量分 63
LiQiyaoo
技术改变生活。
展开
-
Java面试题及回答集锦(基础篇)
1、问题:如果A和B对象循环引用,是否可以被GC?回答:可以,现在的虚拟机基本都是通过可达性分析算法来判断对象是否存活的,而不是通过简单的引用计数法来判断对象是否存活。可达性分析算法使用一系列的“GC Roots”对象(虚拟机栈中引用的对象、静态属性引用对象)作为起始点,这些节点向下搜索的路径称为引用链,当一个对象到GC Roots没有任何引用链连接,则证明对象是不可用的。2、Java中的内存溢出...原创 2018-03-16 13:46:19 · 1213 阅读 · 0 评论 -
Java并发之CAS与原子类实现原理讲解
一、CAS是什么?CAS的全称是Compare and Swap,即比较并交换。比较的是当前内存中存储的值与预期原值,交换的是新值与内存中的值。这个操作是硬件层面的指令,因此能够保证原子性。Java通过JNI(本地方法调用)来使用这个原子操作,也是乐观锁最常用的机制。CAS操作包含三个操作数——内存位置、预期原值和新值。在执行CAS操作时,先进行Compare操作,即比较内存位置的值与预期原值是否...原创 2018-02-10 12:40:29 · 2612 阅读 · 0 评论 -
最通俗易懂的乐观锁与悲观锁原理及实现
一、乐观锁 总是认为不会产生并发问题,每次去取数据的时候总认为不会有其他线程对数据进行修改,因此不会上锁,但是在更新时会判断其他线程在这之前有没有对数据进行修改,一般会使用版本号机制或CAS操作实现。 version方式:一般是在数据表中加上一个数据版本号version字段,表示数据被修改的次数,当数据被修改时,version值会加一。当线程A要更新数据值时,在读取数据的同时也会读取version...原创 2018-02-09 15:28:04 · 105268 阅读 · 17 评论 -
最通俗易懂的ThreadLocal原理详解
一、ThreadLocal的用途 ThreadLocal是线程局部变量,主要用于解决多线程程序的并发问题。产生并发问题的原因是多个线程并发访问共享变量。下面看一段程序。这是一个数据库连接工具类:public class DBConn { private static Connection conn; public static Connection getConn(){原创 2018-02-05 12:41:50 · 2952 阅读 · 3 评论 -
偏向锁、轻量级锁、重量级锁、自旋锁原理讲解
一、简介 在讲解这些锁概念之前,我们要明确的是这些锁不等同于Java API中的ReentratLock这种锁,这些锁是概念上的,是JDK1.6中为了对synchronized同步关键字进行优化而产生的的锁机制。这些锁的启动和关闭策略可以通过设定JVM启动参数来设置,当然在一般情况下,使用JVM默认的策略就可以了。二、Java对象头中的Mark WordHotSpot中,Java的对象内存模型分为...原创 2018-02-09 13:34:46 · 2162 阅读 · 3 评论 -
最通俗易懂的HashMap原理详解(JDK 1.8)
一、HashMap的数据结构 HashMap是存储键值对的集合,当然HashMap也是线程不安全的,每一个键值对存储在一个Node<K,V>(JDK1.7中是Entry<K,V>。HashMap的主干是一个名为table的Node数组。 每个键值对Key的hash值就对应数组的下标,当遇到hash冲突时,HashMap采用的策略是链地址法。在JDK1.7中通过键值对Entr...原创 2018-02-02 16:03:21 · 1537 阅读 · 4 评论 -
both methods have same erasure, yet neither overrides the other 【泛型类型擦除与重载和覆盖问题】
先看一段代码public class Father { void test(Object o){}}class Son extends Father{ void test(T o){}//编译错误!}这段代码会报一个编译错误,both methods have same erasure, yet neither overrides the other。这个错误的意思原创 2017-09-03 15:42:47 · 28680 阅读 · 3 评论 -
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljav
错误信息:”Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;这个异常是下面的代码抛出的: List list = new ArrayList(); Integer[] array =原创 2017-09-10 22:07:37 · 5027 阅读 · 1 评论 -
Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别?
内容转载自:http://dylanxu.iteye.com/blog/13220661、sleep()使当前线程(即调用该方法的线程)暂停执行一段时间,进入阻塞状态,让其他线程有机会继续执行,但它并不释放对象锁。也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据。注意该方法要捕捉异常。例如有两个线程同时执行(没有synchronized)一个线程优转载 2017-09-01 14:53:03 · 1781 阅读 · 0 评论 -
Java并发之AQS(AbstractQueuedSynchronizer)原理讲解
一、什么是AQS? AQS的全称是AbstractQueuedSynchronizer,即抽象队列同步器,其底层是volatile与CAS,而其上层则是基于该抽象类构建的许多并发组件,如ReentrantLock、Semaphore等。AQS自身实现了一些基本方法,还剩余一些面向上层的方法,这些方法需要继承该抽象类的同步组件去实现。 volatile原理链接 CAS原理链接 ...原创 2018-02-10 17:51:31 · 1470 阅读 · 0 评论 -
Java并发之ReentrantLock原理详解
一、ReentrantLock是什么? ReentrantLock是Lock接口的默认实现,是一种独占锁。相对synchronized而言,ReentrantLock提供了更多的操作方式以及更细粒度的加锁方式。 主要特性: (1)可重入。ReentrantLock是可重入锁,因为它会记录之前获得锁线程对象,保存在exclusiveOwenerThread变量中,当一个线程要获取锁...原创 2018-02-12 12:13:03 · 1714 阅读 · 1 评论 -
Java并发之ConcurrentHashMap详解
一、ConcurrentHashMap是什么? ConcurrentHashMap是线程安全的并发容器,是用来替代在多线程环境下的HashMap,因为HashMap是线程不安全的,多线程环境下put操作可能会导致死循环,CPU利用率上升到100%。虽然有同步容器Hashtable和Collections.synchronizedMap方法使得容器同步,但是这些容器效率都非常低,因为它们锁...原创 2018-02-12 18:18:54 · 2788 阅读 · 2 评论 -
Java动态代理讲解——深入浅出
一、代理模式 要讲解动态代理,就要先说代理模式,这是一种最常用的设计模式。该模式中有以下三个角色。 抽象角色:通过接口或抽象类声明真实角色实现的业务方法,即被代理类与代理类都要实现的接口。 代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。 真实角色:实现抽象角色,定义真实所要实现的业务...原创 2018-02-25 12:24:23 · 762 阅读 · 0 评论 -
最通俗易懂的NIO讲解
一、NIO是什么?NIO的全称是New I/O,与之相对应的是Java中传统的I/O,这里都指的是Java的API包。传统的IO包提供的是同步阻塞IO,即当用户线程发出IO请求后,内核会去查看数据是否已经就绪,若未就绪,则用户线程会处于阻塞状态(让出CPU),当数据就绪后,内核会将数据复制到用户线程,并把结果返回给用户线程,同时接触用户线程的阻塞,同步体现在用户线程需要等待数据就绪后才能向后执行(...原创 2018-02-23 12:33:53 · 6267 阅读 · 0 评论 -
Java NIO:浅析I/O模型
也许很多朋友在学习NIO的时候都会感觉有点吃力,对里面的很多概念都感觉不是那么明朗。在进入Java NIO编程之前,我们今天先来讨论一些比较基础的知识:I/O模型。下面本文先从同步和异步的概念 说起,然后接着阐述了阻塞和非阻塞的区别,接着介绍了阻塞IO和非阻塞IO的区别,然后介绍了同步IO和异步IO的区别,接下来介绍了5种IO模型,最后介绍了两种和高性能IO设计相关的设计模式(Reactor和Pr...转载 2018-02-23 10:09:30 · 407 阅读 · 0 评论 -
最通俗易懂的synchronized原理解析
之前有文章写过synchronized的作用,这里不多说了,直接开始讲原理。synchronized是Java的内置锁,是重量级锁,也是可重入锁。性能上不如Lock这种显示锁,而且缺乏许多功能,但是其优点是使用便捷。首先看一段代码及其字节码:public class SynchronizedTest { public synchronized void fun1(){ ...原创 2018-02-08 13:57:12 · 739 阅读 · 0 评论 -
SpringMVC 原理 (面试必备)
一、简介SpringMVC是Spring框架的一个子模块,类似于AOP,IOC等模块。也是通常所说的那层薄薄的Web层,也就是MVC架构中的C(Controller),负责接收分发用户请求。二、原理详细解释这幅图。1、用户发起请求,一般是HTTP请求,带有URL和参数。2、DispatcherServlet的匹配的URL与请求的URL相匹配,DispatcherServlet接收请求。3、把URL...原创 2018-02-14 13:21:15 · 4056 阅读 · 0 评论 -
最通俗易懂的volatile关键词详解
一、volatile能保证可见性 在描述可见性之前,首先要讲解一下Java的内存模型,Java内存模型规定了了所有变量都存储在主存中,每条线程中还有自己的工作内存,线程的工作内存内保存了线程所使用到的变量,这些变量是从主存中拷贝而来,不同线程的工作内存互相隔离,线程间的变量值传递都要通过主存;线程对变量的所有操作(读取、赋值)都必须在工作内存中进行。 在这种内存模型下,很有可能产生脏读现象原创 2018-02-07 15:37:48 · 806 阅读 · 0 评论 -
Spring AOP 原理 (面试必备)
一、AOP是什么? AOP的全称是Aspect Orient Programming,即面向切面编程。是对OOP(Object Orient Programming)的一种补充,战门用于处理一些具有横切性质的服务。常常用于日志输出、安全控制等。 上面说到是对OOP的一种补充,具体补充的是什么呢?考虑一种情况,如果我们需要在所有方法执行前打印一句日志,按照OOP的处理思想,我们需要...原创 2018-02-13 16:02:26 · 59845 阅读 · 5 评论 -
Spring IOC 和 DI原理 (面试必备)
一、IOC是什么?IOC全称为“Inversion of Control”,即控制反转,不是一种技术,而是一种设计思想。在这种设计思想中,你设计好的对象交给容器管理,而不是在应用程序内部对对象进行管理。控制的含义是IOC容器控制了对象(也可以包括文件及其他外部资源);而反转的含义是IOC容器负责创建及注入依赖的对象,但在传统的应用程序中,我们需要在对象内部去创建(new)依赖的对象,这叫“正”,在...原创 2018-02-13 12:00:55 · 8844 阅读 · 2 评论 -
TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?
TreeMap和TreeSet都是有序的集合。TreeSet要求集合中的元素实现Comparable接口,并实现compareTo方法进行比较,如果compareTo方法实现的不好,可能会导致元素插入失败,因为集合内部也通过compareTo方法来比较元素是否相等(而不是通过equals),即判断一个元素是否可插入。TreeMap要求键列的元素实现Comparable接口,与TreeSet原创 2017-09-01 13:13:25 · 2181 阅读 · 0 评论 -
try{}里有一个return语句,那么紧跟在这个try后的finally{}里的代码会不会被执行,什么时候被执行,在return前还是后?【Java面试题】
不管怎样,finally里的代码都会被执行,而且会在return之前执行。而且当try、catch、finally中都有return时,这些return的值都会被finally中的return所覆盖。原创 2017-08-31 16:07:08 · 1503 阅读 · 0 评论 -
无法以返回值区分方法重载(Java基础)
方法重载要满足的条件:1.方法名相同。2.参数类型或参数列表顺序不同。3.返回值可以相同也可以不同。所以,不能使用返回值来区分方法重载。下面看一段报错代码,体现了企图用返回值区分方法重载会产生的矛盾。public class TestOverload { public static void main(String[] args) { TestOverl原创 2017-04-19 08:55:50 · 3188 阅读 · 0 评论 -
Intellij Idea生成JavaDoc
JavaDoc是一种将注释生成HTML文档的技术,生成的HTML文档类似于Java的API,易读且清晰明了。在简略介绍JavaDoc写法之后,再看一下在Intellij Idea 中如何将代码中的注释生成HTML文档。先看一段样例代码://: object/Documentation/** 这是一个Javadoc测试程序 * @author Mike Lee * @version 1原创 2017-04-11 21:15:32 · 10998 阅读 · 3 评论 -
Java中局部变量必须初始化【Java基础】
Java中有两种变量,局部变量和成员变量。成员变量可以不进行初始化,虚拟机也会确保它有一个默认的值。局部变量不能这样做,我们必须对它进行赋值,才能使用它。 int i;//为初始化 System.out.println(i);//编译器报错原创 2017-04-10 19:02:06 · 10050 阅读 · 0 评论 -
Java中变量的作用域【Java基础】
最近在看《Thinking in Java》,想把Java基础再巩固一下,在博客上遇到的以前没注意到的知识点或者较难的知识点记录下来,与大家分享。Java中的基本类型变量的作用域为{}。 { int x = 1;//变量x的作用域只在大括号内 } System.out.println(x);//在大括号外无法调用xJ原创 2017-04-10 18:48:46 · 492 阅读 · 0 评论 -
Java从键盘接收单个字符并转化为Unicode
Unicode是Java采用的编码方式,那么单个的字符如何转化为Unicode呢?首先我们要清楚Unicode的编码原理。Unicode是4位16进制编码,以/u开头,如'a'的编码是/u0061。现在我们从键盘接收到的字符是char类型,2个字节,即16位2进制。要将16位2进制转化为4位16进制,我可以将16位二进制分割为高8位与低8位进行处理,代码如下:import java.uti原创 2017-03-11 22:20:21 · 1051 阅读 · 0 评论 -
装饰者模式(讲解生动形象图文并茂)
在说装饰者模式之前,先来说一个重要的设计原则:类应该对扩展开放,对修改关闭。遵循了这个原则,我们的类将会容易扩展,在不修改现有代码的情况下,我们可以搭配新的行为,这样的设计具有弹性,可以接受新的功能来应对改变的需求。装饰者模式的定义:动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。接下来,我们以一个卖咖啡的例子来讲解。在咖啡店,有各种不同的咖啡,都原创 2017-03-27 18:26:42 · 3568 阅读 · 0 评论 -
Java中将对象加入集合,实质是加入对象的引用的复制
在Java中,我们经常使用封装好的集合框架(如List),下面看一个例子。import java.util.*;public class Test { public static void main(String[] args) { List list = new ArrayList(); Date date = new Date();原创 2017-03-10 18:30:55 · 4058 阅读 · 0 评论 -
78. Subsets 【LeetCode算法之旅之深度优先搜索】
Given a set of distinct integers, nums, return all possible subsets.Note: The solution set must not contain duplicate subsets.For example,If nums = [1,2,3], a solution is:[ [3], [1],原创 2017-03-09 20:14:04 · 559 阅读 · 0 评论 -
finalize()用法及用途【Java基础】
finalize() 是Java中Object的一个protected方法,返回值为空,当该对象被垃圾回收器回收时,会调用该方法。关于finalize()函数,要说明几点1. finalize不等价于c++中的析构函数2. 对象可能不被垃圾机回收器回收3. 垃圾回收不等于析构4. 垃圾回收只与内存有关5. 垃圾回收和finalize()都是靠不住的,只要JVM还没有快到耗尽原创 2017-04-20 09:55:38 · 4772 阅读 · 0 评论 -
Java实现简易Tomcat服务器(清晰易懂)
Tomcat服务器是一个轻量级的Java代码实现的WEB服务器。这篇文章将会讲述如何用Java实现一个简易版的Tomcat服务器。简单的讲,简易原理是这样的:1. Tomcat开始运行之后,会在主机上开一个端口(默认是80端口),在所开辟的端口上运行一个ServerSocket,执行accept()方法等待浏览器访问。2. 浏览器访问目标主机的80端口,ServerSocket的acc原创 2017-04-26 17:06:35 · 6591 阅读 · 2 评论 -
Java包装类对象比较中存在的问题
本文章以Integer包装类为例,讲解一些包装类比较过程中存在的问题。首先看一段代码: Integer i1 = 10; Integer i2 = 10; System.out.println(i1 == i2);//true Integer i3 = 1000; Integer i4 = 1000;原创 2017-07-14 22:21:48 · 2505 阅读 · 0 评论 -
Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口?【Java面试题】
回答:匿名内部类在实现时必须借助一个借口或者一个抽象类或者一个普通类来构造,从这过层次上讲匿名内部类是实现了接口或者继承了类,但是不能通过extends或implement关键词来继承类或实现接口。匿名内部类即没有名字的内部类。当我们只需要用某一个类一次时,且该类从意义上需要实现某个类或某个接口,这个特殊的扩展类就以匿名内部类来展现。一般的用途:1、覆盖某个超类的方法,并且该扩原创 2017-08-29 12:10:28 · 7590 阅读 · 2 评论 -
抽象类(abstract class)和接口(interface)有什么异同?【Java面试题】
1、抽象类可以包含非抽象的方法,而接口中的方法必须是抽象的。2、继承抽象类在Java语言体系中体现一种继承关系,在合理的继承关系中,父类和派生类比如按存在is-a关系。而实现接口则体现一种has-a关系,实现者仅仅是实现了interface定义的契约而已。3、抽象类中可以有成员变量,而接口中不能有成员变量。4、抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的属性可以是任意原创 2017-08-28 12:34:59 · 3919 阅读 · 2 评论 -
为什么匿名内部类和局部内部类只能访问final变量
转:http://feiyeguohai.iteye.com/blog/1500108为什么匿名内部类参数必须为final类型1) 从程序设计语言的理论上:局部内部类(即:定义在方法中的内部类),由于本身就是在方法内部(可出现在形式参数定义处或者方法体处),因而访问方法中的局部变量(形式参数或局部变量)是天经地义的.是很自然的2) 为什么Java中要加上一条限制:只能访问f转载 2017-08-27 11:35:20 · 349 阅读 · 0 评论 -
&和&&的区别?【Java面试题】
首先这两个都是表示逻辑与(and)的运算符。&&有短路功能,而&不具备,比如判断表达式if(a&&b),如果a为false了,则&&后面的运算会被省略,很多时候,短路会避免很多异常的出现,如判断表达式if(str != null && str.equals("xxxx")),这种情况下不会抛出空指针异常,如果换成了不具有短路功能的&,则会抛出空指针异常。&具有位运算功能,当两边的表达式不为原创 2017-08-25 14:57:58 · 868 阅读 · 0 评论 -
short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?【Java面试题】
先说一下Java的基本数据类型转换规则,大的数据类型转换为小的数据类型需要强制转换,反之可以自动转换。赋值表达式等号两侧的转换的规则是右侧的向左侧的看齐,即右侧表达式要转换到和左边的类型一样。第一题:short s1 = 1; s1 = s1 + 1;错! s1 + 1,s1是short类型,1是int型,s1会自动转换为int型的1,与1相加后,得到int型的2,要向左侧的short类型的s1看...原创 2017-08-25 14:19:09 · 11865 阅读 · 5 评论 -
构造器中可要调用本类的方法,但要调用的非static方法必须声明为private或final
在Java程序中,我们是可以在构造方法中调用本类的方法和成员变量的,但是要注意一点,当我们需要调用一个非static的方法时,该方法不应该可以被子类覆盖,应该用final修饰或将其变成private,这虽然语法上没有具体要求,但是若不遵守这个约定,会导致异常情况发生。具体原因我们看以下测试代码:Father.javapublic class Father { public v原创 2017-07-28 22:16:44 · 2312 阅读 · 0 评论 -
Java中嵌套的IO流关闭的问题
先看一段代码: FileOutputStream out1 = new FileOutputStream("D:\\SingleTon.txt"); ObjectOutputStream out2 = new ObjectOutputStream(out1); out1.close();//是否需要关闭内层的IO流?原创 2017-07-25 20:58:37 · 4891 阅读 · 0 评论