![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
面试
qq_43641886
这个作者很懒,什么都没留下…
展开
-
vol.8 concurrent包下的Lock以及AQS
同步队列节点的数据结构,即AQS的静态内部类Node,节点的等待状态等信息;同步队列是一个双向队列,AQS通过持有头尾指针管理同步队列;acquire根据当前获得同步状态成功与否做了两件事情:1. 成功,则方法结束返回,2. 失败,则先调用addWaiter()然后在调用acquireQueued()方法addWaiter1.当前同步队列的尾节点为null,调用方法enq()插入;2. 当前队列的尾节点不为null,则采用尾插入(compareAndSetTail()方法)的方式入.原创 2020-08-11 16:57:00 · 123 阅读 · 0 评论 -
数组中相同的数
给定一个升序数组1,元素有重复,对每个元素算一下平方后得到新的数组2,问数组2中不相同的元素共有多少个?给出算法和空间复杂度,要求尽量优化时间复杂度为O(n)空间复杂度为O(1)public int repeat(int[] num) { int left=0; int right=num.length-1; int count=0; //先判断本身的重复项,然后再判断对称重...原创 2020-02-25 17:07:58 · 642 阅读 · 3 评论 -
static方法不能被重写的原因
从语义就可以看出static、final、private方法本身都是编译期绑定的(也叫前期绑定)这些方法不存在多态,他们是在还没有运行的时候,程序在编译器里面就知道该调用哪个类的哪个方法了,而其他可观察的普通方法的绑定是在运行的时候根据具体的对象决定的,因为从语义上看这些方法是可被继承的,有了多态而造成了不确定性。...原创 2020-06-13 12:00:03 · 1420 阅读 · 0 评论 -
守护线程daemon
在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。Daemon的作用是为其他线程的运行提供便利服务,守护线程最典型的应用就是 GC (垃圾回收器),它就是一个很称职的守护者。...原创 2020-06-06 23:04:41 · 96 阅读 · 0 评论 -
设计模式之间的差别
模板方法与策略模式的区别模板方法是在父类中,定义出方法的骨架,需要在子类中重写某个步骤策略模式,是在父类中定义一个方法,然后重写这个方法代理模式和装饰器模式的区别代理模式是与原对象实现同一个接口,必须要实现原接口和持有真实的对象,才能称之为代理类。代理模式一定是自身持有这个对象,不需要从外部传入。用代理模式,代理类可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例。装饰模式的一定是从外部传入,并且可以没有顺序,按照代码的实际需求随意挑换顺序.原创 2020-06-06 22:59:40 · 157 阅读 · 0 评论 -
final内存屏障在处理器的使用
final 语义在处理器中的实现现在我们以 x86 处理器为例,说明 final 语义在处理器中的具体实现。上面我们提到,写 final 域的重排序规则会要求译编器在 final 域的写之后,构造函数 return 之前,插入一个 StoreStore 障屏。读 final 域的重排序规则要求编译器在读 final 域的操作前面插入一个 LoadLoad 屏障。由于 x86 处理器不会对写 - 写操作做重排序,所以在 x86 处理器中,写 final 域需要的 StoreStore 障屏会被省略掉。同原创 2020-06-02 17:57:03 · 487 阅读 · 0 评论 -
vol.5 jvm中的为什么问题?
为什么程序计数器不会发生溢出?程序计算器仅仅只是一个运行指示器,它所需要存储的内容仅仅就是下一个需要待执行的命令的地址,无论代码有多少,最坏情况下死循环也不会让这块内存区域超限,因为程序计算器所维护的就是下一条待执行的命令的地址,所以不存在OutOfMemoryError为什么移除永久代?1、字符串存在永久代中,容易出现性能问题和内存溢出。2、永久代大小不容易确定,PermSize指定太小容易造成永久代OOM3、永久代会为 GC 带来不必要的复杂度,并且回收效率偏低。4、Oracle 可能会将.原创 2020-06-01 20:32:10 · 99 阅读 · 0 评论 -
度量性能的指标
度量性能的指标有很多,但是有两个指标是最核心的,它们就是延迟和吞吐量。延迟指的是发出请求到收到响应这个过程的时间;延迟越短,意味着程序执行得越快,性能也就越好。吞吐量指的是在单位时间内能处理请求的数量;吞吐量越大,意味着程序能处理的请求越多,性能也就越好。这两个指标内部有一定的联系(同等条件下,延迟越短,吞吐量越大),但是由于它们隶属不同的维度(一个是时间维度,一个是空间维度),并不能互相转换。...原创 2020-05-31 15:58:09 · 319 阅读 · 0 评论 -
HashSet原理
hashset继承里abstractset类,实现了cloneable,serializable,set接口内部是通过hashmap实现的内部只有两个成员变量 private transient HashMap<E,Object> map; // Dummy value to associate with an Object in the backing Map //是所有写入 map 的 value 值。 private static final Obj原创 2020-05-31 10:46:18 · 110 阅读 · 0 评论 -
计算机网络 第五章运输层
运输层为相互通信的应用进程提供逻辑通信从应用层看,只要把应用层的报文交给下面的运输层,运输层就可以把这报文传送到对方的运输层复用和分用复用:发送方的不同应用进程之间都可以使用同一运输层协议传送数据分用:运输层剥去报文的首部后能够把这些数据准确交付到目的应用进程端口和套接字的意义协议端口号,特指软件端口号 应用层各种协议进程与运输实体进行层间交互的一种地址TCP连接的端点叫套接字或者插口套接字socket={IP地址:端口号}端口号分为两大类1)、服务器端使用的端口号熟知..原创 2020-05-28 21:05:33 · 300 阅读 · 0 评论 -
vol.2 int和Integer有什么区别
java 5中新特性:自动装箱\自动拆箱在 Java 5 中新增了静态工厂方法 valueOf,在调用它的时候会利用一个缓存机制,带来了明显的性能改进。按照 Javadoc,这个值默认缓存是 -128 到 127 之间Mark Word:标记位 4字节,类似轻量级锁标记位,偏向锁标记位等。Class对象指针:4字节,指向对象对应class对象的内存地址。对象实际数据:对象所有成员变量。...原创 2020-05-28 16:29:20 · 199 阅读 · 0 评论 -
vol.1 java基础
谈谈你对Java平台的理解?Java本身是一种面向对象的语言,最显著的特性有两个方面,一是所谓的“书写一次,到处运行”(Write once, run anywhere),能够非常容易地获得跨平台能力;另外就是垃圾收集(GC, Garbage Collection),Java通过垃圾收集器(Garbage Collector)回收分配内存,大部分情况下,程序员不需要自己操心内存的分配和回收。jre和jdk的区别我们日常会接触到JRE(Java Runtime Environment)或者JDK(Ja.原创 2020-05-28 15:25:30 · 111 阅读 · 0 评论 -
BIO、NIO、AIO区别及实现
Java提供了哪些IO方式? NIO如何实现多路复用?Java IO方式有很多种,基于不同的IO抽象模型和交互方式,可以进行简单区分。首先,传统的java.io包,它基于流模型实现,提供了我们最熟知的一些IO功能,比如File抽象、输入输出流等。交互方式是同步、阻塞的方式,也就是说,在读取输入流或者写入输出流时,在读、写动作完成之前,线程会一直阻塞在那里,它们之间的调用是可靠的线性顺序。java.io包的好处是代码比较简单、直观,缺点则是IO效率和扩展性存在局限性,容易成为应用性能的瓶颈。很多时..原创 2020-05-27 22:47:13 · 211 阅读 · 0 评论 -
vol.9 两种密码体制
对称密钥体制加密密钥和解密密钥是相同的密码体制公钥密码体制由于对称密钥的密钥分配问题;对于数字签名的需要在公钥体制中,加密密钥PK是向大众公开的,解密密钥是需要保密。加密算法E和解密算法D也是公开的步骤:通过密钥对生成器产生出接受者B的一对密钥,加密密钥和解密密钥,发送者所使用的的加密密钥就是接受者的公钥,他向大众公开。解密密钥是接收者的私钥,保密;发送者用接受者的私钥通过加密算法对明文加密,得出密文发送给接受者接受者用密钥通过解密算法恢复出明文数字签名...原创 2020-05-27 21:03:40 · 247 阅读 · 0 评论 -
jvm面试必看
jvm性能调优web服务器集群:给session创造粘性,意思是让用户每次都访问的同一个应用服务器原创 2020-05-27 20:48:20 · 139 阅读 · 0 评论 -
堆排序原理
堆是一个完全二叉树;堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值。通过数组实现一个堆往堆中插入一个元素public class Heap { private int[] a; // 数组,从下标1开始存储数据 private int n; // 堆可以存储的最大数据个数 private int count; // 堆中已经存储的数据个数 public Heap(int capacity) { a = new int[capacity + 1];原创 2020-05-27 17:17:06 · 110 阅读 · 0 评论 -
vol.5 TCP,UDP格式
序号 :本报文段所发送的数据的第一个字节的序号(用于对字节流进行编号,例如序号为 301,表示第一个字节的编号为 301,如果携带的数据长度为 100 字节,那么下一个报文段的序号应为 401。)确认号 :期望收到的下一个报文段的序号。(例如 B 正确收到 A 发送来的一个报文段,序号为 501,携带的数据长度为 200 字节,因此 B 期望下一个报文段的序号为 701,B 发送给 A 的确认报文段中确认号就为 701。)数据偏移 :指的是数据部分距离报文段起始处的偏移量,实际上指的是首部的长度。 .原创 2020-05-27 15:51:06 · 99 阅读 · 0 评论 -
vol.1 java基础面试题
java中为什么要单继承,多实现若为多继承,那么当多个父类中有重复的属性或者方法时,子类的调用结果会含糊不清,因此用了单继承。为什么是多实现呢?通过实现接口拓展了类的功能,若实现的多个接口中有重复的方法也没关系,因为实现类中必须重写接口中的方法,所以调用时还是调用的实现类中重写的方法。那么各个接口中重复的变量又是怎么回事呢?接口中,所有属性都是 static final修饰的,即常量,这个什么意思呢,由于JVM的底层机制,所有static final修饰的变量都在编译时期确定了其值,若在使用时,两.原创 2020-05-26 22:48:33 · 88 阅读 · 0 评论 -
java并发面试题vol.1
说一个最熟悉的垃圾回收算法吞吐量优先和响应时间优先的回收器有哪些怎么判断内存泄漏为什么压缩指针超过32G失效为什么压缩指针超过32G失效什么是内存泄漏?GC调优有经验吗?一般出现GC问题你怎么解决?讲一下CMS的流程Threadlocal有没有内存泄漏问题G1两个Region不是连续的,而且之间还有可达的引用,我现在要回收一个,另一个怎么处理?讲一下JVM堆内存管理(对象分配过程)听说过CMS的并发预处理和并发可中断预处理吗到底多大的对象会被直接扔到老年大通过设置-XX:Pretr.原创 2020-05-26 22:38:08 · 237 阅读 · 0 评论 -
vol.4 redis分片
分片是将数据划分为多个部分的方法,可以将数据存储到多台机器里面,这种方法在解决某些问题时可以获得线性级别的性能提升。假设有 4 个 Redis 实例 R0,R1,R2,R3,还有很多表示用户的键 user:1,user:2,… ,有不同的方式来选择一个指定的键存储在哪个实例中。最简单的方式是范围分片:例如用户 id 从 0~1000 的存储到实例 R0 中,用户 id 从 1001~2000 的存储到实例 R1 中,等等。但是这样需要维护一张映射范围表,维护操作代价很高。还有一种方式是哈希分片:使用转载 2020-05-26 22:32:05 · 110 阅读 · 0 评论 -
vol.3 redis高可用性之 哨兵
Redis主从同步是怎么实现的?主从节点建立连接后,从节点会进行判断1.如果这是从节点之前没有同步过数据,属于初次复制,会进行全量重同步 那么从节点会向主节点发送PSYNC?-1 命令,请求主节点进行全量重同步。2.如果这是从节点不说初次复制(例如出现掉线后重连), 这个时候从节点会将之前进行同步的Replication ID(一个随机字符串,标识主节点上的特定数据集)和offset(从服务器当前的复制偏移量)通过PSYNC 命令发送给主节点,主节点会进行判断,如果Replication ID跟..转载 2020-05-26 22:24:31 · 97 阅读 · 0 评论 -
vol.2 redis持久化
持久化技术分析redis中如何实现高可用性:持久化、复制、哨兵和集群持久化:持久化是最简单的高可用方法,有时甚至不被归为高可用的手段,主要作用是数据备份,即将数据存储在硬盘,保证数据不会因进程退出而丢失。复制:复制是高可用Redis的基础,哨兵和集群都是在复制基础上实现高可用的。复制主要实现了数据的多机备份以及对于读操作的负载均衡和简单的故障恢复。缺陷是故障恢复无法自动化、写操作无法负载均衡、存储能力受到单机的限制。哨兵:在复制的基础上,哨兵实现了自动化的故障恢复。缺陷是写操作无法负载均衡转载 2020-05-26 22:03:43 · 101 阅读 · 0 评论 -
vol.1 redis基础
Redis是什么?redis是一个键值对数据库,基于内存进行操作,也可以进行持久化Redis过期key是怎么样清理的?(1)惰性清除在访问key时,如果发现key已经过期,那么会将key删除 。(2)定时清理Redis配置项hz定义了serverCron任务的执行周期, 默认每次清理时间为25ms,每次清理会依次遍历所有DB,从db随机取出20个key,如果过期就删除,如果其中有5个key过期,那么就继续对这个db进行清理,否则开始清理下一个db。(3)内存不够时清理当执行写入命令时,如果.转载 2020-05-26 21:10:24 · 116 阅读 · 0 评论 -
LFU 算法实现 优先队列+hashmap
首先创建一个内部结点包含四个参数 频率 索引 键 值这个内部结点node实现了comparable类里面的compareto 方法,当 他们出现的频率相同的时候,比较他们的索引大小get方法通过hashmap获得node,如果node==null,返回-1否则就更新node的频率和索引通过queue.remove queue.offer操作进行排序put方法通过hashmap获得node,如果node!=null,更新node的频率和索引,和get方法类似,并且从map中移除键值原创 2020-05-26 20:39:53 · 358 阅读 · 0 评论 -
http各版本之间的区别
http版本Value缺点0.9仅支持请求方式GET,并且仅能请求访问HTML格式的资源。1.0请求方式POST和HEAD;每次TCP连接只能发送一个请求,当服务器响应后就会关闭这次连接,下一个请求需要再次建立TCP连接,就是不支持keepalive1.11.TCP连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive;2. 加入了管道机制,在同一个TCP连接里,允许多个请求同时发送,增加了并发性,进一步改善了HTTP协议的效率;...原创 2020-05-25 17:50:25 · 509 阅读 · 0 评论 -
微信二维码扫描原理
每次打开微信网页版的时候,都会生成一个含有唯一uid的二维码,而且每次刷新后都会改变。这样可以保证一个uid只可以绑定一个账号和密码,确定登录用户的唯一性。除了返回唯一的uid,实际上打开这个页面的时候,浏览器跟服务器还创建了一个长连接,请求uid的扫描记录。当用户使用登录后的微信扫描二维码的时候,会将uid和手机微信产生的token进行绑定,并上传到服务器。这个时候,浏览器通过长轮询查询到uid扫描记录,立即得到201响应码,然后通知服务器,客户端由此也进入一个新的页面(就是那个要你点确认的按钮)。.原创 2020-05-25 17:18:48 · 1940 阅读 · 0 评论 -
vol.4运输层
TCP之 流量控制(滑动窗口)和 拥塞控制(拥塞控制的工作过程)利用滑动窗口实现流量控制发送窗口的选择 滑动窗口和拥塞窗口的最小值拥塞控制方法:慢开始 拥塞避免 快重传 快恢复浅析SYN FLOOD攻击原理是在三次握手的第三次握手的时候,服务端需要客户端发送ack包进行回应时,他会耗费一定数量的系统内存来等待这个连接首先是客户端发送一个SYN报文给服务端,然后这个服务端发送一个SYN-ACK包以回应客户端,接着,客户端就返回一个ACK包来实现一次完 整的TCP连接。在服务端返回一个确认的..原创 2020-05-25 15:58:46 · 86 阅读 · 0 评论 -
vol.2 数据链路层
以太网的硬件地址:MAC地址 48位长,和适配器的数量有关MAC 地址是链路层地址,长度为 6 字节(48 位),用于唯一标识网络适配器(网卡)。一台主机拥有多少个网络适配器就有多少个 MAC 地址。例如笔记本电脑普遍存在无线网络适配器和有线网络适配器,因此就有两个 MAC 地址。基本问题2.1. 封装成帧将网络层传下来的分组添加首部和尾部,用于标记帧的开始和结束2.2. 透明传输帧使用首部和尾部进行定界,如果帧的数据部分含有和首部尾部相同的内容,那么帧的开始和结束位置就会被错误的判定。需要.原创 2020-05-25 11:48:20 · 228 阅读 · 0 评论 -
vol.1计算机网络概述
添加链接描述OSI 将网络分为七层:应用层、表示层、会话层、运输层、网络层、数据链路层、物理层。OSI 七层协议体系结构概念清除,理论完善,但是既复杂也不实用。TCP/IP 是一个四层体系结构,包含应用层、运输层、网际层和网络接口层(网际层是为了强调该层是为了解决不同网络的互联问题),这种体系结构得到了广泛应用。但是 TCP/IP 从实质上讲只有最上面三层,最下面的网络接口层并没有什么具体内容,因此一般学习时结合 OSI 和 TCP/IP 的优点,采用一种五层协议的体系结构:应用层应用层的任务是通原创 2020-05-25 11:27:32 · 151 阅读 · 0 评论 -
LRU算法实现 双向链表+哈希表
创建一个双向链表,有key ,value, 前驱节点 和后继节点class Node{ int key; int value; Node next; Node pre; Node(int key,int value){ this.key=key; this.value=value; } }在主类里面创建四个实例字段 private in.原创 2020-05-25 10:21:36 · 606 阅读 · 0 评论 -
vol18plus ThreadLocalMap
里面有一个entry数组实现了弱引用类,他的键就为弱引用 static class ThreadLocalMap { //里面有一个entry数组实现了弱引用类,他的键就为弱引用 static class Entry extends WeakReference<ThreadLocal<?>> { /** The value associated with this ThreadLocal. */ ..原创 2020-05-24 22:03:27 · 144 阅读 · 0 评论 -
vol18. ThreadLocal解析
set方法//set 方法设置在当前线程中 threadLocal 变量的值,该方法的源码为:public void set(T value) { //1. 获取当前线程实例对象 Thread t = Thread.currentThread(); //2. 通过当前线程实例获取到ThreadLocalMap对象 ThreadLocalMap map = getMap(t); if (map != null) //3. 如果Map不为null,则以当前threadLo.原创 2020-05-24 16:50:21 · 312 阅读 · 0 评论 -
vol.2 线程状态转换以及基本操作
如何新建一个线程?(1)通过继承Thread类,重写run方法;(2)通过实现runable接口,重写run方法,然后作为target对象加入Thread;(3)通过实现callable接口,重写call()方法,使用Future对象进行封装,然后将Future对象加入到Thread中继承Thread和runnable接口有什么区别继承 Thread 类:我们创建了三次 MyThread 对象,也就是创建了三个任务(工作四个小时这个任务)和三个线程(张三,李四和赵五三个人),每个线程去完成自己的.原创 2020-05-24 15:51:52 · 123 阅读 · 0 评论 -
vol.1 并发的一些常见概念
上下文切换时间片是CPU分配给各个线程的时间,因为时间非常短,所以CPU不断通过切换线程,让我们觉得多个线程是同时执行的,时间片一般是几十毫秒。而每次切换时,需要保存当前的状态起来,以便能够进行恢复先前状态。如何避免上下文切换方法:无锁并发编程,CAS算法,使用最少的线程和使用协程具体:项目Value无锁并发编程synchronize偏向锁CAS算法利用Atomic下使用CAS算法来更新数据,使用了乐观锁,可以有效的减少一部分不必要的锁竞争带来的上下文切换; sy.原创 2020-05-24 15:18:25 · 130 阅读 · 0 评论 -
百度面经vol.1
List 中存有50个商品,给一个targetId 从中找出Id相同的删除用过concurrentHashmap吗,为什么是线程安全的?jdk1.7特点jdk1.8特点hashmap中的key和value会被GC回收吗?不会jdk1.8了解lambda吗?如果我对一个类做编译,他其中的lambda表达式会变成什么?说一下联合索引添加链接描述一个字符串要求:1. 去掉收尾的空格;2. 若单词之间相隔一个空格跳过,若是相隔多个空格,合并成一个空格,不能用额外的存储..原创 2020-05-23 17:00:25 · 155 阅读 · 0 评论 -
对象相等判断
==和equals区别==是判断两个变量或实例是不是指向同一个内存空间,equals是判断两个变量或实例所指向的内存空间的值是不是相同==是指对内存地址进行比较 , equals()是对字符串的内容进行比较==指引用是否相同, equals()指的是值是否相同hashcode和equals方法hashCode()的作用是为了提高在散列结构存储中查找的效率,在线性表中没有作用;只有每个对...原创 2020-04-06 16:17:28 · 96 阅读 · 0 评论 -
Error和exception
常见的运行期异常有哪些 unchecked exceptionArrayIndexOutOfBoundsException 数组下标越界异常,ArithmaticException 算数异常 如除数为零NullPointerException 空指针异常IllegalArgumentException 不合法参数异常常见的编译期异常有哪些NotfoundClassException...原创 2020-03-24 17:49:21 · 112 阅读 · 0 评论 -
int和Integer的区别
int是基本数据类型,Integer是包装类从jdk1.5 开始引入了自动装箱、自动拆箱,使得二者可以相互转换Integer是int的包装类;int是基本数据类型;Integer变量必须实例化后才能使用;int变量不需要;Integer实际是对象的引用,指向此new的Integer对象;int是直接存储数据值 ;Integer的默认值是null;int的默认值是0。java对于Int...原创 2020-03-19 17:13:59 · 97 阅读 · 0 评论