Java面试
Memorys.Liu
it's bad but not too bad.
展开
-
java-并发-CAS
基本概念:比较 然后 交换 compare and swap参数:内存值 V,旧的预期值 A,要修改的新值 B过程:如果 V和 A 相等,则将 V替换 为 B,否则 自旋。缺点: ABA问题,A 变化为B ,再次变化为A 则检测不出来,需要用加版本号的方式来解决如果自旋时间太长的话,开销就会很大。CAS和锁的选择:1. 在资源竞争不激烈的时候,可以使用CAS,可以在较短时间内获取到锁。2. 在资源竞争激烈的时候,使用阻塞锁,避免CAS无限制自旋造成的性能开销...原创 2020-08-14 09:45:33 · 76 阅读 · 0 评论 -
java-并发-Volitile
作用:1. 共享变量在线程之间的可见性2. 禁止指令重排序具体实现方式:1. 共享变量在线程之间的可见性多线程的情况下,多个线程操作同一个共享变量的时候,是把共享变量复制一份,复制到自己的线程内存中,然后在私有线程里去操作自己单独的变量。等线程执行完毕的时候,会把私有线程中的变量复制到共享变量中,更新共享变量。线程可见性指的是,当线程A复制了数据num,线程B也复制了数据num,这时候线程A对num赋值2,线程B看到的是num=2具体实现为,volatile在进行写操作的时.原创 2020-08-14 09:43:54 · 126 阅读 · 0 评论 -
java-并发-锁-死锁
什么是死锁:死锁是一种特定的程序状态,一般为多线程彼此持有对方需要的锁,彼此还在等待获取对方持有的锁、死锁的定位方式:jstack线程打印死锁产生的原因:1. 长期持有锁,使用完不释放2. 循环依赖如何避免死锁:1. 尽量避免使用多个所,并且只有需要的时候才使用2. 如果必须要使用多个锁,尽量设计好锁的获取顺序,可以将对象和锁的关系图形化展示出来3. 使用超时机制4. 通过不同的工具进行代码分析,查找出可能出现死锁的场景。...原创 2020-08-02 22:28:48 · 99 阅读 · 0 评论 -
java-并发-锁-AQS
主要包含:volatile int state 标记节点锁的状态tryacquire tryRelease 独占获取锁和释放锁 (state 0 /1 代表锁是否被占用)tryAcquireShare 和 tryReleaseShare 共享获取锁和释放锁(state=0 代表所有的锁都被使用完,state>0 有未使用的锁)Node的FIFO队列:volatile Node pre 当前节点的前一个节点volatile Node next 当前节点的下一个节...原创 2020-08-02 22:28:13 · 86 阅读 · 0 评论 -
java-并发-锁-Lock
底层原理:Lock底层是通过AQS实现的。AQS底层是通过CAS实现的。加锁过程:独占锁:通过tryAcquire方法,将state值从0设置为1,设置成功代表加锁成功通过tryRelease方法,将state值从1设置为0,设置成功则代表释放成功共享锁:通过tryAcquireShared(arg),获取到的结果如果>=0则获取锁成功,如果<0则获取锁失败。并且在队列尾部增加一个Node节点自旋获取锁。锁的重入:独占锁:通过tryA...原创 2020-08-02 22:26:20 · 105 阅读 · 0 评论 -
JAVA-面试题-02
58的一道面试题public class Main { public static void main(String[] args) { List<Integer> list = new ArrayList<>(Arrays.asList(1,2)); add(list); for (int i = 0...原创 2019-06-10 17:43:59 · 92 阅读 · 0 评论 -
归并排序
归并排序:时间复杂度:时间复杂度主要取决于合并的时间。是n*log(n)空间复杂度:在合并的时候,使用了额外的数组存储排序结果,所以空间复杂度不是O(1)原地排序算法:不是原地排序算法。稳定排序算法:在排序的时候,前后大小相等的元素,先排前边数组的元素,就可以保证排序的稳定性。时间复杂度推导方法:T(n) = 2*T(n/2) + n = 4*T(n/4) + ...原创 2019-06-08 17:27:28 · 99 阅读 · 0 评论 -
堆排序
原文:https://time.geekbang.org/column/article/69913 原文是极客时间,的数据结构与算法课程。整片文章感觉有抄袭的嫌疑,哈哈哈,不过感觉这个图的确是比文字或者别的更形象和有说服力。1.堆的定义:堆满足的两个必要条件:堆是一个完全二叉树。 堆中的每个节点的值都必须大于等于(或者小于等于)其子树的每个节点的值。对于每个节点的值都...原创 2019-06-14 20:43:32 · 240 阅读 · 0 评论 -
快速排序
快速排序:时间复杂度:时间复杂度主要取决于每次拆分的时间。是n*log(n)空间复杂度:在合并的时候,没有使用额外的存储空间,所以时间复杂度是O(1)原地排序算法:是原地排序算法。稳定排序算法:在排序的时候,前后大小相等的元素,不能保证排序后的顺序一致。如果从前往后排,则比中间值大的元素不能确保顺序一致,如果从后往前排,则比中间值小的元素不能确保顺序。时间复杂度计...原创 2019-06-10 20:21:11 · 123 阅读 · 0 评论 -
前序遍历二叉树
package cm.com.algorithm.tree;/** * 前序遍历2叉树 * 前序遍历是指,对于树中的任意节点来说,先打印这个节点,然后再打印它的左子树,最后打印它的右子树 * * @author [email protected] * @date 2019-06-11 22:14 */public class DLRTree { private ...原创 2019-06-17 12:12:35 · 214 阅读 · 0 评论 -
中序遍历二叉树
package cm.com.algorithm.tree;/** * 中序遍历2叉树 * 中序遍历是指,对于树中的任意节点来说,先打印它的左子树,然后再打印它本身,最后打印它的右子树 * * @author [email protected] * @date 2019-06-11 22:14 */public class LDRTree { private s...原创 2019-06-17 12:14:21 · 4527 阅读 · 0 评论 -
后序遍历二叉树
package cm.com.algorithm.tree;/** * 后序遍历2叉树 * 后序遍历是指,对于树中的任意节点来说,先打印它的左子树,然后再打印它的右子树,最后打印它本身 * * @author [email protected] * @date 2019-06-11 22:14 */public class LRDTree { private s...原创 2019-06-17 12:15:57 · 571 阅读 · 0 评论 -
单链表 反转
package cm.com.datastructure.linkedlist;/** * 实现单链表 翻转 * * @author MemorysLiu * @version 1.0.0 * @date 2019-07-31 15:14 */public class SinglyLinkedList { public static void main(String[...原创 2019-07-31 15:32:06 · 148 阅读 · 0 评论 -
希尔排序
希尔排序:时间复杂度:O(n^(1.3—2))空间复杂度:O(1),原地排序算法稳定性:不是稳定的排序算法。相关介绍感觉百度百科介绍挺好的。见:https://baike.baidu.com/item/%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F/3229428?fr=aladdinpackage cm.com.algorithm;/*...原创 2019-06-06 14:03:52 · 147 阅读 · 0 评论 -
选择排序
选择排序:时间复杂度:因为需要两次循环,每一次循环的复杂度都为n,所以总的时间负责度为O(n^2)空间复杂度:没有使用额外的空间,所以空间复杂度为O(1)原地排序算法:因为空间复杂度为O(1),没有占用额外的空间来排序,所以是原地排序算法。稳定排序算法:5,8,5,2,5,9 这样的就会乱序。所以是非稳定排序算法。因为不能保证相等元素的排序顺序和原来保持一致。pac...原创 2019-06-05 21:39:14 · 118 阅读 · 0 评论 -
插入排序
插入排序:时间复杂度:因为需要两次循环,每一次循环的复杂度都为n,所以总的时间负责度为O(n^2)空间复杂度:没有使用额外的空间,所以空间复杂度为O(1)原地排序算法:因为空间复杂度为O(1),没有占用额外的空间来排序,所以是原地排序算法。稳定排序算法:在排序的时候,如果遇到前后相等的元素就不互换位置,就可以做到顺序不改变,所以是稳定排序算法。package cm.co...原创 2019-06-05 21:23:44 · 109 阅读 · 0 评论 -
单例模式
单例模式的目的:全局唯一性。实现的方式:构造函数私有化,静态方法返回单例对象常见的实现模式及代码:懒汉式:延迟加载,不会在启动的时候加载,降低了启动时间,缺陷:在多线程环境下,有线程安全的问题。例如:线程AB同时进入if 中的代码,但是A线程执行较快,B线程出现停顿,A在初始化完毕,并且赋值了之后,B才开始初始化,这时候 instance 的值就会出现问题。public class SingleT...原创 2018-07-03 14:49:47 · 105 阅读 · 0 评论 -
Lock和synchronized的对比
1.1.synchronized 只能实现单线程的读写,一旦多个线程要同时访问一个资源,就只有一个线程可以开启访问,其余线程只能等待,非常影响性能。所以如果使用的话,一定要尽量减小锁的粒度,到代码快级。1.2.synchronized 不需要手动释放锁,发生异常的时候会自动释放;但是Lock必须要自己手动释放,如果没有手动释放的话,会导致死锁,所以使用的时候必须有try finally...原创 2018-10-30 11:52:40 · 260 阅读 · 0 评论 -
java基础面试题1
1.谈谈你对java是解释执行这句话的理解这句话不准确。java代码首先是通过javac命令编译成字节码,在运行时被解释器转为机器码。但是常见的jvm,例如hotspot,都提供了JIT动态编译,能够在运行时将热点代码编译成机器码,这种情况下的代码就属于是编译执行,而不是解释执行。还有一种新的编译方式,即AOT,直接将字节码编译为机器码2.Exception 和...原创 2018-11-14 12:31:07 · 146 阅读 · 0 评论 -
java实现斗地主发牌
/** * @author shuai1.liu * @create 2018-09-21 13:36 * @desc **/package cn.com.callback;import java.util.ArrayList;import java.util.Comparator;import java.util.List;import java.util.Random;...原创 2018-12-10 17:22:04 · 1039 阅读 · 0 评论 -
JAVA面试题:Spring中bean的生命周期
Spring 中bean 的生命周期短暂吗?在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一个实例,而不是每次都产生一个新的对象使用Singleton模式产生单一实例,对单线程的程序说并不会有什么问题,但对于多线程的程序,就必须注意安全(Thread-safe)的议题,防止多个线程同时存取...转载 2019-03-08 18:09:04 · 1153 阅读 · 0 评论 -
java基础面试题3
21.类加载的过程加载:java将字节码数据从不同的数据源读取都jvm中,并映射为jvm认可的数据结构,数据源可以是class,jar,网络资源等链接:验证:jvm检验字节信息是否符合jvm规范准备:创建类或者接口中的静态变量,并初始化静态变量的值。(主要是分配内存空间)解析:将常量池中的符号引用替换为直接引用。初始化:执行类的初始化逻辑,包括静态字段的赋...原创 2019-05-09 14:03:37 · 66 阅读 · 0 评论 -
java基础面试题2
11. java的io方式java.io 包中的同步阻塞方式的iojava.nio 包中的NIO框架,例如Channel、selector、Buffer等,可以提供同步非阻塞的调用方式NIO2 也叫AIO 异步非阻塞的方式,是基于事件和回调机制。可以理解为,操作直接返回,当后台处理操作完成之后,操作系统会通知相应的线程进行后续工作。12.java文件的几种拷贝方...原创 2019-05-07 18:31:17 · 105 阅读 · 0 评论 -
java虚拟机问题1
1.java为什么要在虚拟机里执行java虚拟机将java程序编译为java字节码,java字节码可以在有java虚拟机的机器上执行。具备可移植性2.java虚拟机是怎么执行字节码的?java代码被编译成class文件,加载到java虚拟机中。java类会被放在方法区中,运行时会执行方法区中的代码。java虚拟机会将栈细分为java方法栈,本地方法栈,PC寄存...原创 2019-05-13 11:49:38 · 199 阅读 · 0 评论 -
模版模式&钩子方法
在以下代码例子中是模版模式的设计案例。模版模式:主要是通过生成一个抽象类,并且实现抽象类子类的一些相同实现的方法 下述例子中的run 方法。这样子类就可以不用实现此方法,就可以调用的一种方式。钩子方法,是在此基础上做了一些改动,主要是通过实现的另一个方法来对父类方法的执行程序实现修改的方法。在下述例子中,是通过isAlarm方法来修改run方法的执行逻辑。public abstrac...转载 2019-05-27 12:08:16 · 402 阅读 · 0 评论 -
java虚拟机问题2
11.java中的synchronezed实现重量级锁:java线程的阻塞和唤醒都是依靠操作系统来完成的,需要操作系统从用户态切换至内核态,开销相当大。为避免这种情况,Java 虚拟机会在线程进入阻塞状态之前,以及被唤醒后竞争不到锁的情况下,进入自旋状态。通过动态设置自旋等待时间,来减少锁的开销。如果上次自旋获取到了锁,那么这次就延长自旋时间,如果上次自旋没有获取到锁,这次就缩短自旋时间。...原创 2019-05-28 10:06:27 · 149 阅读 · 0 评论 -
java集合对比
详情参考:https://www.cnblogs.com/skywang12345/p/3323085.html#4269559集合底层数据结构是否线程安全其它ArrayListObject数组不安全每次扩容1.5倍LinkedList双向链表不安全随机访问的方式为,根据index和链表长度的一半来判断,是从前开始访问,还是从后开始访问。但是随机访问的时...原创 2019-06-05 13:21:44 · 706 阅读 · 0 评论 -
冒泡排序
冒泡排序:时间复杂度:因为需要两次循环,每一次循环的复杂度都为n,所以总的时间负责度为O(n^2)空间复杂度:没有使用额外的空间,所以空间复杂度为O(1)原地排序算法:因为空间复杂度为O(1),没有占用额外的空间来排序,所以是原地排序算法。稳定排序算法:在排序的时候,如果遇到前后相等的元素就不互换位置,就可以做到顺序不改变,所以是稳定排序算法。package cm.co...原创 2019-06-05 17:58:51 · 108 阅读 · 0 评论 -
Java经典面试题001
/** * 要求:写出swap方法体的内容 * 并且输出结果只有 * a = 2 * b = 1 * * * 考点是: * 1.反射: * 在swap方法中,如果要修改a的值,那么应该修改的是 integer对应的属性,而不是引用, * 然而属性是私有的,并且没有对外提供set方法,所以只能用反射 * 2.参数的传递 * 传递参数a...原创 2018-06-29 14:56:56 · 139 阅读 · 0 评论