关于面试:2021年BATJ一线名企面经总结阿里腾讯百度18个技术栈全面解析

前言工夫过得好快,2021年都过来几个月了,马上就到了金三银四的跳槽淡季,很多公司其实当初就开始招聘了,其中就不不足BATJ这样的一线互联网公司!置信大家对这些企业并不生疏,然而总是对面试难度望而却之!明天小编就从粉丝那里拿到了2021年最新的一线名企面试真蕴含阿里,百度,网易云这些公司,因为工夫关系答案小编也都为大家筹备好了,大家能够一边做题一边对照本人的技术,满满的干货都给大家放在上面了! 阿里巴巴 一面:自我介绍一下介绍一下参加的我的项目spring的IOC底层实现原理HashMap的底层原理GC策略JVM内存模型MySQL索引构造事务的四大个性事务隔离级别JVM调配策略(eden、survival区)类加载的双亲委托机制理解么线程池的一些参数问题以及底层原理AQS两个线程轮流打印数字1-100(算法coding)链表如何疾速找到两头节点(算法coding)二面:自我介绍;介绍我的项目;KVM和XEN虚拟化的区别如何用JAVA生成永远的ID:UUID(Universally Unique Identifier)树的遍历,并非二叉树的遍历堆排序的问题多线程轮流执行用什么锁??AOP的底层原理(动静代理)Object类的办法循环依赖如何解决疾速排序原理iptable实现反向代理OVS流表创立Docker的四种网络类型Docker的命名空间有哪些为何要用Vxlan?什么时候会产生OOMJVM的内存构造GC回收策略乐观锁和乐观锁三面1.自我介绍2.我的项目3.我的项目中遇到的难点4.本人平时如何学习的5.AOP的底层实现??源码级6.职业规划,将来的倒退7.还有什么问题? 四面(穿插面)如何判断两个汇合的对象是否相等;Java中的深拷贝和浅拷贝;反射的原理以及利用场景;Java序列化的相干问题,被什么样的变量润饰不会被序列化。(transient,被该变量润饰不会长久化也不会被序列化)Java中的全局变量如何设置;如何了解JAVA中的一次编译处处运行?threadlocal内存泄露问题如何解决如何优化Hashtable?hr面问题就很常见了,唠嗑腾讯 一面自我介绍我的项目所用开源技术以及框架数据库介绍Mysql索引引擎Mysql索引底层实现构造,为什么不必hashmap( 不适宜范畴搜寻)有哪一些索引主键索引和一般索引的区别数据库隔离级别ArrayList的底层实现,为什么查问快,增删慢算法:字符串反转算法:输入链表的倒数第k个数(两种办法:汇合|双指针)思考题,如何设计求一个数的n次开方(二分法)二面MVCC机制LRU算法两个线程轮流打印1A 2B 3C(三种办法)其余切实是记不清楚了...三面自我介绍我的项目介绍本人负责的工作虚拟机跨主机通信一个算法题,手撕一下,就是一个小车给定坐标地位,和当后面朝方向(NSWE),再输出后退转向状况和前提高数,输入小车的坐标地位和面朝方向。职业规划hr面很轻松的聊天,交换工作地点等信息百度 一面自我介绍Java根底:类如何被加载(整个类加载到new一个对象的过程说了一遍)数据库索引构造ThreadLocal创立线程的形式有哪些具体说一下线程池的参数有哪些说一下JAVA 8 的新个性(lambda、Stream等)说一下java设计模式中的开闭准则零碎什么时候须要重构,如何重构从url到返回一个页面 走了哪些过程(从DNS域名解析、TCP、Http、再到后端的mvc架构都说了一遍)多线程如何解决并发问题(锁 以及原子操作类(底层是CAS,谈到了aba问题以及解决办法))为什么要用多线程(进步拜访效率和速度)微服务理解么AQS队列同步器以及AQS外部类中的Condaition中的期待队列反诘二面自我介绍说一下你的实习我的项目你的实习我的项目中次要用到的中间件有哪些为什么会用到音讯队列,是用来干什么的说一下TCPTCP的拥塞管制操作系统中的中断、以及虚拟内存currentHashMap的底层原理晓得么,具体的内存构造是怎么的?JUC上面的locks和synchronized区别是哪些?locks上面的AQS重入锁理解么?说一下作用和原理SpringBoot的启动过程职业规划三面三面绝对轻松,次要是交换了一些对业务的认识等,面试官人十分nice!hr面无hr面,间接发的offer网抑云 一面自我介绍我的项目介绍线程池相干参数线程池回绝策略线程池阻塞队列HSF原理AOP底层原理,几种形式coding 快排+改良+堆排QPS高了如何解决,开放性的问题反诘二面自我介绍我的项目介绍难点介绍内存文件映射Java IO读取文件的底层过程HSF的重要组件有哪些AQS理解么?(从AQS底层到重入锁讲了一堆)如何学习的集体倒退布局反诘三面(加面)这里次要是问了一些对业务的了解,和对本人职业倒退的意识hr面还是老样子...猿辅导 一面自我介绍我的项目介绍Docker虚拟化和全虚拟化的区别什么时候用全虚拟化什么时候用半虚拟化.DNS的运行过程(本地缓存-本地服务器-根服务器-顶级域名服务器)IP地址有哪些分类:A、B、C三类,为什么分类罕用的非凡IP有哪些(127.0.0.1 192.168.0.1)coding1: 链表排序,不能只替换值,要换节点coding2:判断一棵树是不是均衡二叉树coding3: 判断一棵树是不是二叉搜寻树BST二面自我介绍我的项目介绍学校我的项目介绍实习我的项目介绍说一下AOP的底层原理说一下timer定时器的工夫原理说一下TCP和UDP的区别,抓细节UDP牢靠传输的实现说一下coding 两个有环链表,判断是否相交三面记不太分明了,只记得算法题是手写一个split( )算法进去,再尝试着优化一下。 总结面试总结就先写到这里,大家感觉对本人有帮忙的话无妨给小编点个赞,你的反对就是我创作的能源!另外因为文章篇幅起因,,答案和解析我曾经帮大家整顿成PDF文档了,具体内容如下:上面是我本人总结的一些笔记和一些面试模仿视频以及技术栈教学的视频,具体内容如下: 以上材料以及教学视频和我本人总结的技术笔记和面试模仿视频都是无偿分享给大家的,只须要你动动手多多反对小编即可,须要以上材料的敌人们三连点赞后关注公众号:前程有光回复材料即可,心愿大家拿到材料后多多学习,对照本人的技术栈,在金三银四里能拿到本人称心的offer!

February 20, 2021 · 1 min · jiezi

关于面试:最近的一些Java面试小结

本文首发于微信公众号【WriteOnRead】,欢送关注。前言前段时间陆续面试了一些大中小公司,踩了不少坑,挂了很多,同时也有不少感悟和播种。这里想把那段经验记录一下,如果能对亲们有所帮忙就再好不过了。 面试的过程其实也是一个自我认识和学习的过程,即使临时没打算跳槽,隔段时间进来面一面对本人还是有些益处的:不仅能够评估一下本人在市场的价值和竞争力,同时也能理解一些新技术、更新一下本人的技术栈。 而且在一个中央待久了,可能不盲目的就会陷入到一种「舒服区」,长此以往,就像温水里的青蛙,万一哪天被“优化”了可能会手足无措。 本文次要从「我的项目」和「技术」两个方面进行总结,除此之外还有一些比拟开放式的问题。 除夕过了,“金三银四”还会远吗?春节后有想法的亲们,能够嗨起来了! 我的项目有人说:三年一道坎。 对于工作三年左右的搭档们来说,「我的项目经验」堪称重中之重,能够说比具体的技术点更重要。 技术点其实大同小异,有些长期刷刷题就能理解个大略。但我的项目经验往往难以长期假造,如果不是本人实在做过的我的项目、或者没有充沛的筹备,一旦面试官问得略微深刻很可能 hold 不住,面试扣分不少、甚至可能间接挂掉。 因而不少面试官喜爱从我的项目动手,抽丝剥茧、步步深刻,通过我的项目把技术点串起来考查。 不同人的我的项目千差万别,但还是有一些独特亮点的:比方高并发场景,简单的架构设计,JVM 调优及问题排查等。 这些亮点有的话诚然更好,但如果平时 CRUD 居多、没太多的亮点,其实也不用太慌,技术亮点不多的话,能够多思考一些业务上的亮点,比方: 业务模型比较复杂对业务整体的架构设计很相熟业务模块拆分比拟正当本人在业务中做过哪些扩大和优化?业务数据的上下游流转是怎么的?遇到过什么问题,如何解决的?等等这些其实也是亮点,能够让面试官看到你平时对业务有本人的思考和了解,而不是只关注本人的那一块,不只是写代码的机器。 其实面试官对你的我的项目是无所不知的,他的印象仅仅停留在你简历上形容的那些文字(而且有些面试官可能是被长期拉过来的,别问我为什么晓得????)。面试官通常的开场白就是让你自我介绍,其实这也是一个考查语言组织能力和口头表达能力的中央。 技术咱们面的毕竟是技术岗,技术自身的重要性显而易见。 技术面试中,最重要的能够说是「技术体系」。也就是你不仅要有技术的深度和广度,更要能把它们串起来,其实有不少技术点是相通或类似的,如果面试中可能举一反三、触类旁通,是一个很好的加分项。比方: Redis 的 AOF 和 MySQL 的 bin logSpring 中的 BeanDefinition 和 JVM 中类的元信息布隆过滤器和 HashMap等等技术的积攒尽管次要在平时,但刷刷面试题还是很有必要的,有不少其实就是所谓的“八股文”。这里次要列出自己面试过程中实在遇到的一些面试题,仅供参考。 Java线程池 外围参数有哪些?工作执行流程工作回绝策略锁 synchronized 锁降级过程ReentrantLock 实现原理(AQS)偏心锁如何实现?volatile 个性HashMap HashMap & ConcurrentHashMap 实现原理ConcurrentHashMap 如何实现线程平安MySQL索引 分类?应用场景?InnoDB 索引的构造(B+树),为什么不必 B 树?如何查看索引的应用状况?Explain 关注哪些字段?事务 隔离级别RC/RR 的实现原理Redis罕用数据结构 zset 实现原理hash 扩容过程常见缓存问题 缓存穿透、缓存击穿、缓存雪崩、热点 key如何解决上述问题?长久化:RDB、AOF,二者区别Redis 为什么快?线程模型是怎么的?内存满了怎么办?淘汰策略有哪些?应用什么集群框架?SpringIoC、AOP 实现事务流传个性、生效场景JDK & CGLib 区别Spring Boot 启动原理DubboDubbo 架构负载平衡算法、容错策略、灰度测试SPI 机制RPC 调用过程RPC & HTTP ...

February 20, 2021 · 1 min · jiezi

关于面试:腾讯一面问我SQL语句中where条件为什么写上11

在我的项目编写中,常常会在代码中应用到“where 1=1”,这是为什么呢?目录where前面加"1=1"还是不加不必where 1=1 在多条件查问的困惑应用where 1=1 的益处应用where 1=1 的害处where前面加"1=1"还是不加比方当初有一个场景,DB数据库中有一张博客表(blog),想把blog表中的所有记录查问进去,那么能够有两种形式操作。一种写法是where关键词什么也不加,另一种写法是where关键词前面加"1=1",写法如下: where关键词什么也不加select * from blog;where关键词前面加 "1=1"select * from blog where 1 = 1;这两种SQL语句查问所失去的后果齐全没有区别。那为什么要在where关键字前面增加"1=1"呢? 咱们晓得1=1示意true,即永真。如果应用不失当会造T0级谬误。例如在编写SQL语句时进行where条件查问时配合or运算符会失去动向不到的后果,后果会让你颤抖。不信,往下看: 例如,当咱们要删除博客ID称为“202102111501”的记录,咱们能够这样写: delete from blog where blogId = "202102111501"如果这个时候如果在where语句前面加上 or 1=1会是什么结果? delete from blog where blogId = "202102111501" or 1 = 1原本只有博客ID称为“202102111501”的记录,后果因为增加了or 1=1的永真条件,会导致整张表里的记录都被删除了。那你可就闯祸了。 不必where 1=1 在多条件查问的困扰举个例子,如果你想查看以后博客中某条评论记录时,那么依照平时的查问语句的 动静结构,代码大体如下: String sql="select * from blog where";if ( condition 1) { sql = sql + " blogID = 202102111501";}if (condition 2) { sql = sql + " and commentID = 150101";}如果上述的两个if判断语句均为true时,那么最终的动静SQL语句为: ...

February 20, 2021 · 1 min · jiezi

关于面试:阿里面试这样问redis-为什么把简单的字符串设计成-SDS

2021动工第一天,就有小伙伴私信我,还给我分享了一道他面阿里的redis题(这家伙绝比曾经拿到年终奖了),我看了当前感觉挺有意思,题目很简略,是那种典型的似懂非懂,经常容易被大家疏忽的问题。这里整理出来分享一下,顺便本人坚固一下根底,心愿对正在面试和想要面试的兄弟有点帮忙。 题目大抵是这样的 面试官:理解redis的String数据结构底层实现嘛? 铁子:当然晓得,是基于SDS实现的 面试官:redis是用C语言开发的,那为啥不间接用C的字符串,还独自设计SDS这样的构造呢? 铁子:····· 其实看得出面试官是想看看,铁子是只停留在redis的应用层面,还是对底层数据结构有过更深刻的钻研,面试嘛都爱这样问大家都懂得。咱们晓得redis是用C写的,但它却没有齐全间接应用C的字符串,而是本人又从新构建了一个叫简略动静字符串SDS(simple dynamic string)的形象类型。 redis也反对应用C语言的传统字符串,只不过会用在一些不须要对字符串批改的中央,比方动态的字符输入。 而咱们开发中应用redis,往往会经常性的批改字符串的值,这个时候就会用SDS来示意字符串的值了。有一点值得留神:在redis数据库中,key-value键值对含有字符串值的,都是由SDS来实现的。 比方:在redis执行一个最简略的set命令,这时redis会新建一个键值对。 127.0.0.1:6379> set xiaofu "程序员内点事"此时键值对的key和value都是一个字符串对象,而对象的底层实现别离是两个保留着字符串xiaofu和程序员内点事的SDS构造。 再比方:我向一个列表中压入数据,redis 又会新建一个键值对。 127.0.0.1:6379> lpush xiaofu "程序员内点事" "程序员小富"这时候键值对的键和上边一样,还是一个由SDS实现的字符串对象,键值对的值是一个蕴含两个字符串对象的列表对象了,而这两个对象的底层也是由SDS实现。 SDS构造一个SDS值的数据结构,次要由len、free、buf[]这三个属性组成。 struct sdshdr{ int free; // buf[]数组未应用字节的数量 int len; // buf[]数组所保留的字符串的长度 char buf[]; // 保留字符串的数组}其中buf[]为理论保留字符串的char类型数组;free示意buf[]数组未应用字节的数量;len示意buf[]数组所保留的字符串的长度。 例如上图示意的是buf[]保留长度为6个字节的字符串,未应用的字节数free为0,然而眼尖的同学会发现这明明是7个字符,还有一个"\0"啊? 上边提到过SDS没有齐全间接应用C的字符串,还是沿用了一些C个性的,比方遵循C的字符串以空格符结尾的规定,这样还能够应用一部分C字符串的函数。而对于SDS来说,空字符串占用的一字节是不计算在len属性里的,会为他调配额定的空间。 简略理解SDS构造后,下边咱们来看看SDS相比于C字符串有哪些长处。 效率高举个例子:工作中应用redis,常常会通过STRLEN命令失去一个字符串的长度,在SDS构造中len属性记录了字符串的长度,所以咱们获取一个字符串长度间接取len的值,复杂度是O(1)。 而如果用C字符串,在获取一个字符串长度时,需对整个字符串进行遍历,直至遍历到空格符完结(C中遇到空格符代表一个残缺字符串),此时的复杂度是O(N)。 在高并发场景下频繁遍历字符串,获取字符串的长度很有可能成为redis的性能瓶颈,所以SDS性能更好一些。 数据溢出上边提到C字符串是不记录本身长度的,相邻的两个字符串存储的形式可能如下图,为字符串调配了适合的内存空间。 如果此时我想把“程序员内点事”改成“程序员内点事123”,可之前调配的内存只有6个字节,批改后的字符串须要9个字节能力放下啊,怎么搞? 没方法只能强占相邻字符串的空间,本身数据溢出导致其余字符串的内容被批改。 而SDS很好的躲避了这点,当咱们须要批改数据时,首先会查看以后SDS空间len是否满足,不满足则主动扩容空间至批改所需的大小,而后再执行批改,如下图所示。 不过有个非凡的中央,在把“程序员内点事”的6个字节扩容到“程序员内点事123”9个字节后,发现free属性的值变成了扩容后字符串的总长度,这就波及到下边要说的内存重调配策略了。 内存重调配策略C字符串长度是肯定的,所以每次在增长或者缩短字符串时,都要做内存的重调配,而内存重调配算法通常又是一个比拟耗时的操作,如果程序不常常批改字符串还是能够承受的。 但很可怜,redis作为一个数据库,数据必定会被频繁批改,如果每次批改都要执行一次内存重调配,那么就会重大影响性能。 SDS通过两种内存重调配策略,很好的解决了字符串在增长和缩短时的内存调配问题。 1.空间预调配空间预调配策略用于优化SDS字符串增长操作,当批改字符串并需对SDS的空间进行扩大时,不仅会为SDS调配批改所必要的空间,还会为SDS调配额定的未应用空间free,下次再批改就先查看未应用空间free是否满足,满足则不必在扩大空间。 通过空间预调配策略,redis能够无效的缩小字符串间断增长操作,所产生的内存重调配次数。 额定调配未应用空间free的规定: 如果对 SDS 字符串批改后,len 值小于 1M,那么此时额定调配未应用空间 free 的大小与len相等。如果对 SDS 字符串批改后,len 值大于等于 1M,那么此时额定调配未应用空间 free 的大小为1M。2.惰性空间开释惰性空间开释策略则用于优化SDS字符串缩短操作,当缩短SDS字符串后,并不会立刻执行内存重调配来回收多余的空间,而是用free属性将这些空间记录下来,如果后续有增长操作,则可间接应用。 ...

February 20, 2021 · 1 min · jiezi

关于面试:新年成功拿下第一个java后端开发岗offer分享经历希望对大家有帮助接好运

前言工夫过的很快,2020这个时候我还在家过春节。考完研我从武汉的学校回家了,很庆幸赶在武汉封城的时候回去了。 考完研就感觉不是很好,感觉本人考不上了。但心田仍然抱着一丝期望,本人也存着一种捡漏的心态。 过年期间就着手筹备毕业设计,心里想着如果初试过了的话既能当作复试娓娓而谈的我的项目,没过的话就能够作为进来面试的我的项目并且顺便实现本人的毕业设计。 起初问题进去了。 很拉胯,过后很平淡,起初感觉本人家庭条件不太容许本人二战,而且我又放心二战跪了无奈承受失败的本人,同时能从父母的谈话种感触到它们也不想让我考研。(其实工作一年发现,其实学历在工作还是很重要的!很重要的!很重要的!尤其是在本人没有成为一个畛域有影响力的人的时候)。 随后我就把本人的简历改了改,开始投一些简历,起初在牛客上投了投,大多数没有回应,可能因为本人太垃圾了吧。起初就在某boss上投了几波。 工夫太长了很多都记不起来了,只能记得几家。 第一家:万徳面万徳时候,面试官像是正儿八经招java的,把我的项目问的很认真,问我一开始我的项目就思考用kafka做音讯的中间件吗?有没有思考其余的?我随了一句Blockingqueue。这两个有啥区别?过后就答复不上了,我的项目就相当于从上上抄来了 第二家:安恒信息安恒信息如同就没问几句,过后问我对于出差怎么样balabala的,linux命令咋么样,看样子预计想招个施行。起初hr分割我说过了。之后丢来了一个性情测试,因为看面试流程很随便,我过后也不是很称心就轻易瞎几把填了下。起初莫名微妙挂了。(损失了一个备胎) 第三家:达西感觉达西也是一家不错公司。和我面试的一位技术总监还是啥,是在一个本人的办公室一位老哥。过后让我做了几道leetcode题目,没做进去。起初又问了下线程问题。因为是近程面试,起初就罗唆掏出材料边看边答复了。可能他听到我敲键盘的声音。就开始问了一些温度跨度比拟大的问题,让我应接不暇。不断漏出不屑与鄙夷的神气。过后问到了组合索引的问题让我映像粗浅,当初看看过后是真的菜。 之后就是在杭州的一家实习了,做一些简略的培训学习。那算我的第一次接触的工作吧,外面会有一个老外给讲一下麻利开发的常识。而后实习转正会依照开端淘汰的机制。因为过后疫情重大,美国的很多我的项目都停掉,所以预计转正名额会缩小甚至没有,hr也暗示咱们拿到毕业证就能够完结实习。本人感觉也没啥留下来的可能就筹备来到了。 接下来就把简历改了改,减少一段两个月左右的实习的经验。那时候如同是5.30号左右吧,拿到了一家上市公司的offer,说是上市公司其实一个it部门也就50左右开发和测试的人吧,没有思考啥就去了,因为工资开的还行吧,毕竟过后在当初看来也是啥也不会来着,但和同龄人相比还是查了很多,哭唧唧。 起初去了第二家实习,并且转正了。工夫久了,很多问题就暴露出了。我发现我并不喜爱这里,当然这外面也有我本人的起因,然而我感觉我只占10%。之间在没转正之间我都是996的,其实大多数都不须要996的,按时上班就好了。转正之后我就开始利用上班的工夫进行充电。期间也投了蛮多公司,很荣幸的呢也接到了阿里1688那边的面试。 面经汇总其中收到面试的有,九章算法(相似课程助理~~),蜂搜搜,来将来科技,阿里1688(校招遗珠打算),若干小公司,外包等。 九章算法就是一个课程助理或者答疑的职位,一个下午间接从一面 到 主管面 到boos面。就是很容易,然而在老板面的时候差点和老板刚了起来。他问我为啥想在上家到职,我就说学不到货色。而后就回怼了我,要去学货色回学校学,职场是迎接挑战。起初就差不多走了。 蜂搜搜可能他们想招个有两年教训的人吧。我记得口试题写的挺好的。看我工作不到半年间接挂了。 来将来科技一家不错公司,据说的淘宝中台架构师去守业的公司。可能是因为我的简历写的太花哨了。一面电话面的时候两个面试官面我,轮流试探我。其中一个应该是p5,那另一个就是p6吧。面完后,p6戏谑:能够要深度有深度,要广度广度。p5说上面会有主管面。。。。。 主管面就很正经,问了我的我的项目而后balabala的。因为我的项目就不是很有深度,看起来他对我不是很感兴趣,开始问一些比拟偏的问题,比方网络wait,而后跪了。 阿里1688一面首先非常感谢阿里能给我面试的机会,一面是一位声音醇厚的老哥,一开始认为也就28这样子起初去内网看了下,预计有35了。面的问题很粗浅, 1.问了我平时有没有写单元测试,又啥覆盖率的多少的?(我平时都是把单元测试当作写demo的中央。) 2.junit4和junit5的区别?(不晓得) 3.又问了acid 的了解 (balala) 4.又问了b树,b+树什么的(我老善于了) 5.又问了mysql语句的原子性怎么实现的(没想过) 如果让你设计怎么设计? 6.啥是分布式 (巴拉巴拉) 其它问题就记不起来了,起初就问有啥问题。当然这个时候也有学识的。我看老哥对单元测试挺有见解就交换下单元测试。而后问了下对996怎么看的?老哥说了一句,工作就是生存,生存就是工作~~~,极客满满~~ 起初,莫名微妙过了~~,不晓得在11月招人是为了啥,是为了背3.25吗?(狗头正告) 二面其实过后很悔恨,我就应该在二面过了请一个长假,好好筹备一下。兴许前面还有戏,之后面试官问了一些我不善于的问题挂了。 还有一家面试一面问了下redis,mysql数据一致性怎么解决? mysql b+树 而后问了差不多,面试官给过了。。 面了很多我都不会,我都差点想被动放弃了。。。 二面teamleader面1聊了下在之前公司做的我的项目,并在板子讲了下,过后心田很慌的,幸好之前在原公司,开了我的项目发布会又从新温故下。过后还感觉浪费时间,因为发布会那天下午就是我二面的那天。。。 2.聊了下b+树 3.聊了下redis为啥是单线程的? 我之前的确本人思考过,答复道点子上了吧。 4.而后又问了下gc算法,年老代,老年代为什么那样设计?有啥益处? 5.stream底层原理,为啥这么设计?( 巴拉巴拉,撕扯半天不明确) 总结最初去了一家阿里系的子公司,算是阿里生态的吧,也算对得起过来半年的致力,因为工作不到一年,又是疫情也没敢要高薪水,就勉强吃个低保了,还是比拟开心的。 最初最初我为大家筹备了一些Java架构学习材料,学习技术内容蕴含有:Spring,Dubbo,MyBatis, RPC, 源码剖析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等关注公众号前程有光回复材料即可支付

February 19, 2021 · 1 min · jiezi

关于面试:面试路上的五道JS思考题

先说说我为什么会写这个吧,从上个月开始就在筹备去魔都的面试,经验了几次失败后,意识到本人基础知识的单薄,于是开始了补习,学习过程中看到了别的笔者写的思考题与一些思路,跟着思路实现题目后感到受益匪浅,在此总结,若有谬误,欢送探讨。 答复题目的过程须要体现出本人的思考,如果能将碎片知识点串联起来,就能防止面试过程中的一问一答,晋升面试官的评估,题目一共五道,包含我的答复,内容如下: 1.JS 分为哪两大类型?都有什么各自的特点?你该如何判断正确的类型?JS分为 原始类型 和 对象类型 原始类型 有6种:undefined string symbol boolean number null 其中number须要留神 精度失落的问题 比方0.1+0.2~!==0.3。这是因为JS采纳IEEE 754双精度版本,只有是采纳了IEEE754的语言都有这个问题,0.1在二进制是有限循环的一些数字,而JS采纳的规范会裁剪这些数字。可做如下转换:parseFloat((0.1 + 0.2).toFixed(10)) === 0.3 // true 另一个须要留神的是null,因为原始类型按理说是能够通过typeof判断类型的,然而typeof null会返回 object。这是因为历史起因流传下来的bug,JS最后为了性能思考应用低位存储变量的类型信息,000结尾代表的是对象,而null示意为全0。 对象类型 和原始类型不同的是,原始类型存储的是值,对象类型存储的是地址。当创立一个对象类型的变量时,计算机会在内存中开拓一个空间来存值,但咱们须要找到这个空间,这个空间会领有一个地址。解决对象类型的变量时,须要留神因为传递的是地址,会产生扭转一方其余也都被扭转的状况,咱们能够采纳深、浅拷贝的形式来防止。 浅拷贝形式:Object.assign({}, a) 或者 { ...a } 浅拷贝解决了第一层的问题,然而当对象类型中的值还有对象类型的话,就须要应用深拷贝了。深拷贝形式:lodash的深拷贝函数。(因为深拷贝实现过程简单,须要思考很多边界,倡议应用lodash)typeof能够精确判断原始类型(除null),然而对于对象来说,除了函数都会显示object,判断一个对象的正确类型,能够应用instanceof,因为外部机制是通过原型链来判断的然而instanceof也不是齐全可信,因为能够通过Symbol.hasInstance自定义instanceof行为。 所以咱们能够通过typeof判断原始类型,通过原型的constructor属性判断对象类型,实现如下: function judge(v){ if(typeof v === 'object' || typeof v === 'function'){ if(v){ return v.constructor.name }else{ return 'null' } }else{ return typeof v }}console.log(judge(null),judge(1),judge('nice'),judge(true),judge({a:1}),judge(()=>{})) //输入:null number string boolean Object Function2.你了解的原型是什么?对于新建进去的对象 obj 来说,能够通过 __proto__ 找到一个原型对象,在原型中定义了很多函数让咱们来应用,比方valueOf、toString。并且原型对象能够通过 constructor 找到它的构造函数,可用来判断对象的类型。 ...

February 19, 2021 · 2 min · jiezi

关于面试:2021年春招小tip分享java后端面试总结心得分享面经

集体状况介绍楼主北京某理工类大学本硕,家在包邮区3+1的1,实验室摸鱼菜鸡,从大四开始一路应用Java语言到当初 2020年时间表1-2月:放寒假回家高兴地游玩3月:发现实验室的小伙伴都在筹备实习,开始焦虑中学习,缓缓的开始口试面试4月:感激美团收容我给了我第一份实习offer,拒掉了OPPO的offer5月:陆陆续续收到网易、华泰证券、趋势科技、邮储软开的实习offer;月底实习入职美团6月:在阿里的零碎里留下了第三个已拒绝流程,咱也是经验过HR面后挂掉的人了7月:高兴实习,发工资的时候是最高兴的;同时秋招提前批开启,筹备面试8月:美团转正问难后到职,全力筹备秋招;投递科研论文,月底收到录用告诉9月:写完论文初稿,中期问难;陆续收到阿里、腾讯、猿辅导、美团的offer,面了快手和网易10-11月:签约猿辅导三方,线下报考地方某部委某涉密单位,全力筹备国考12月:不要问!问就是室友、啤酒和烧烤!开始纠结秋招的抉择是否正确,想回家工作2021年1月:炒了半个月的股亏了1300,怒而退市;下定决心回家工作,开始投递简历和面试2022年2月:哈哈哈还不晓得呢找实习经验先说一下我的简历吧,刚开始我的简历上就俩我的项目,其实都是刚进实验室的时候的3个月技术培训做的货色,一个是相似于微博的web零碎,一个是用Java原生NIO做的IM即时通讯零碎,当然了我起初用Netty又写了一遍。 刚找实习那会其实还算是很高兴的,面试官问的根底的问题我还是接的很晦涩的,特地是收到了美团的实习录用意向书当前,信念暴涨。 后果等到了4月底5月初就开始变噩梦了。首先是被阿里巴巴打击了,一开始投递的蚂蚁,催了无数次面了二面后拖了我半个月给我挂了,那会我没少跟敌人吐槽这件事。而后被某部门捞起来接着面,很顺利面到了Hr面后果等了半个月又给我挂了,我问hr为什么他说hc满了。起初部门tl加我微信,说我对分布式(降级、熔断等)的常识理解的不好,心愿我去别的公司实习下秋招再来面他们,而后开始PUA我。这tmd不是死循环吗?阿里说好的实习只问根底呢?我当然忍不下这口气,在牛客发帖吐槽了一下。接着就是间断的京东挂、360挂、腾讯挂挂挂等等,还有好多连面试机会都没给。 起初想想算了,何必这么折腾本人呢,于是在5月底入职了美团。这里给大家安利下美团金服,新人造就做的是真的好。你一入职就会有一对一导师,制订具体的时间表通知你每周要干什么,要把握哪些中间件的应用。 实习的时候,我闲的没事就会去美团内网学城上扒拉货色,晓得本人分布式差就要多学一点,缓缓的开始理解、相熟分布式的一些常识。接的第一个需要也是偏架构的需要,波及两个零碎之间的信息交互。一开始真的是焦头烂额,乍看起来很简略,其实重难点是在高并发下的异步解耦、限流、高可用和保障数据一致性上。然而真的实现了需要当前,这反而成了我最强的一块。秋招面试的时候谈到实习经验,面试官着重问的也是这一块,真的感激这段经验。 秋招找工作秋招我放弃了广撒网的策略,算起来七七八八的也就投了10家左右的公司,最初拿到了5家公司的不错的offer,整体上真的比春招好太多了。 首先谈的还是阿里巴巴,我与阿里的不解之缘。一开始找了一个北邮的师兄内推,他在杭州工作,我就默认他给我推到杭州,就没有确认内推base。天然是很顺利的到了hr面,面试的时候hr小姐姐也是杭州,问我抉择北京的部门还是杭州的部门,我拍案而起地说:我打死不留北京肯定要去杭州。后果刚面完hr面师兄就火急火燎的在微信找我,问我hr面怎么答的,这个时候才晓得师兄给我推的是北京的岗位。后果天然是毫无悬念地挂掉了,因为他们认为我不会接。起初被某部门捞起来,闲着无聊也去面了面,后果就发意向书了。然而部门和工作内容不太喜爱吧,加上tl打电话给我谈薪的时候态度不怎么好,始终感觉本人居高临下,始终在PUA,所以我就罗唆麻溜给回绝了。 其次要说一下字节跳动,字节我始终认为流程块面试官好,后果我竟然也碰到了多数的奇葩。杭州抖音挂掉之后,我是心悦诚服的,因为的确技术上太菜被面试官吊打了哈哈哈,不愧是外围部门。起初被某部门捞起来,顺利到三面然而答得不太好,所以有一轮加面。加面面试官我感觉就不缺人,一开始就在不理解业务场景下始终在说:你感觉你们这样设计不low吗?行,您流批,一下子把整个团队做的零碎都否了。之后我说的用缓存做了避免新用户反复注册导致的薅羊毛问题,后果就始终在怼我你晓得什么叫薅羊毛吗?你晓得薅羊毛的定义吗?你这就叫薅羊毛的吗?我俩针对这个词什么意思敌对探讨了半个小时,后果是我先败了,被动放弃了面试。 最初是签了意外之喜的猿辅导,给我评级也很好,除了工资还是期权、签字费什么的。 之后被室友洗脑,去加入了某部委涉密单位的线下宣讲,线下报名了国考,去部委实地取准考证的时候有幸进了配楼,感叹不愧是部委的大楼就是派头。10-11月致力学了俩月的行测和申论,依照屡次粉笔模考的后果看我认为我稳进面的,后果国考的时候申论爆炸,只考了46分,差两分进面,一度心态爆炸。起初尝试过江浙的人才引进和选调政策,然而都比拟晚了错过了很多,我又等不到2021年的4.5月,也就不了了之了。 最近也是下定决心要毁约猿辅导了吧,还是想回家工作。1月在家加入了一个上海国企和杭州阿里的面试,应该是都过了在等着告诉,也有点犹豫要选哪个,目前暂定是始于阿里终于阿里了。 最初是干货工夫面试材料: 神器cyc20*佬的的csnote,根本笼罩Java根底、数据库、分布式、算法大部分的内容Github上的Advanced-java,当然了牛客也有转载,涵盖高并发、分布式、高可用、微服务等畛域常识最重要的还是源码!!!对于Java根底真的多看源码,比方CAS的上锁过程、AQS。我记得我在看泛型的时候,百度搜进去的货色很形象,而后我就跑去看了眼ArrayList的泛型源码,而后照葫芦画瓢本人也写了写。计算机网络应该都学过吧,我始终用的是我本科的第五版,高数书都卖了却留下了《计算机网络》哈哈。当然了有些货色是没有的,比方应用RST避免TCP洪泛攻打、http3.0的quic协定(常问的问题就是http只能用tcp实现吗)等。JVM倡议去看《Java虚拟机》,看面经是相对不够的,面试官略微问得深一点就凉凉,倡议重点看编译原理和运行原理。我大略全书来回翻了三遍,连class文件的编写格局都看了。而后应该就是算法题了吧,如果不是面字节和外企的话,《剑指offer》应该就够了,然而必须要相熟根本的递归回溯、BFS、DFS、动静布局这些,偷偷说一句并查集常有妙用,倡议leetcode每日一题,保持半年你也是大佬。教训分享:我的项目的话就捕风捉影地写就好了,千万!千万!千万!不要给本人挖坑!我秋招的简历就删掉了web的我的项目,因为发现有点忘了,把我研究生期间做的冬奥会的一个计算机视觉的我的项目的放上去了,纯正装逼,投递国企的时候更显的高大上。 而后就是简历整得难看点,这里举荐用WonderCV,用过的都说好!留神写我的项目经验的时候不要一大段一大段的文字,多用些加粗的小标题宰割一下,面试官没经验看你简明扼要的;最好把集体技术能力简介放在我的项目前,列一下本人的技术短处,比方redis、Spring什么的,有利于面试官疾速理解你,依照我的面试教训,很多面试官间接看的都是这一块的货色。 而后呢就是早开始,找实习的时候我就是开始慢了,3月份才开始慢吞吞的。如果不是之前有Java根底的话,可能我实习都找不到。2021届校招广泛的都提前了半个月到一个月,所以更要提前准备。 而后有很加分的一项,搭建一个本人的集体博客网站,记录本人的学习。当然了CSDN或者Github也行,总之就是多记录。面试的时候面试官常会问你平时都逛什么网站,这个时候如果你说你本人搭建了一个网站的话会十分十分加分。如果你感觉租阿里云或者腾讯云的服务器太贵的话,能够用GithubIO + hexo搭一个简略的,尽管拜访会慢一点,反正也能看,还有很多难看的模版能够抉择应用,我就是这么干的。 还有很重要的一点,眼光不要只局限在互联网,里面的世界也是很好的。不要总以为只有互联网钱多,某些国企、江浙深的公务员、外围部委公务员(能承受出国)等等,福利待遇可能没你设想的那么低,还会有些特地的福利比方个体购房优惠等,具体的我就不说了怕被查水表。这里就要提到了,早点确定本人想去的是哪里,找准一个指标,同时如果有精力工夫的话,再去尝试别的优质单位,比方加入个国考啊(狗头保命)。我始终感觉,秋招的时候多折腾,总比工作后再折腾要好得多。 而后没什么了,最重要的就是放弃心态吧,最好有个小伙伴跟你一起备战,没事发发牢骚吐吐槽什么的。我和我的搭档找实习的时候都快把阿里骂死了哈哈哈,我三个已拒绝他两个,都是很奇葩的面试经验。后果他秋招拿个十几个offer,面啥过啥,都是sp以上,给我柠檬精坏了。 最初的最初实习+秋招+春招是很漫长的过程,身材最重要。我保持了大半年的5km跑步,夏天早晨跑,冬天下午跑。别问我为什么不去健身房,问就是不喜爱室内的环境,喜爱室外的感觉。从一开始50分钟上气不接下气,到起初30分钟轻松跑完,也算是见证了本人的提高吧。 昨天交给导师了论文终稿,安安心心批改论文筹备毕业啦!心愿回学校当前走毁约流程拿到新的三方协定签完,顺利度过盲审和问难。 最初,心愿还在筹备春招的同学们找工作顺利!心愿2021届的同学们毕业顺利!心愿2022届的学弟学妹们找实习顺利!硬核地分享点面经吧,只有实习的,因为秋招的我没记录hhhh 2.1410:30-10:40 某国企 腾讯视频面自我介绍:包含学习成绩、比赛获奖、我的项目经验、邮储意识、职业规划 1分钟之内晓得Java的序列化吗?什么时候用到序列化?序列化用在长久化、深拷贝和网络传输你的方向是图像处理和后盾开发,是始终做这个吗?你学校是北京的,为什么报的是苏州的软研?说一下线程池的一些的概念和用法?说了外围线程、梗塞队列、最大线程之间的执行关系一不小心把数据库连接池c3p0、Druid说进去了晓得Netty吗?Netty怎么解决粘包拆包的问题?惊呆了,我也就看了一点Netty的粘包、心跳、pipeline4种 长度域 固定长度 分隔符 换行符罕用基于长度域LengthFieldBasedFrameDecoder 指定帧协定中的字段偏移和字段长度order by 和 group by 执行程序?9点半进入待考间,期待着叫号、验证身份证和学生证、查看正装两个人同时进入面试房间面试房间一个主持人,一些记录人员和面试官面试工夫一组只有10分钟,所以要尽量的突出自我面试官问什么,你就答什么,不要和互联网一样发散拓展面试官根本不会太看你简历上的我的项目等内容,相干问题能够提一下2.15 11:00-12:00 某互联网 二面 钉钉视频面自我介绍用过哪些框架?Spring相干的晓得吗?Java语言中说一下ReetrantLock的底层实现分布式的RPC晓得吗?一般RPC晓得吗?说一下DNS的原理?说一下Spring的IOC?如果让你实现你筹备怎么写?Java的垃圾回收机制?(然而在复制算法,面试官说from到eden也有对象降级机制,多理解)说一说CMS和G1?比拟起来有什么优缺点?算法:反转链表 判断是否有环 判断环的入口分布式事务怎么实现?(2PC、3PC、TCC、最终一致性。说了下用redis的list如同也能够)晓得哪些分布式事务的业内框架?(RocketMQ)事务的隔离级别?默认的隔离级别?可反复读解决不了什么问题?如果让你实现一个秒杀,从前端到后端要解决哪些问题?面对流量过多可能将服务器打挂的问题,怎么解决? (限流和分布式缓存)如果一个分布式事务有一个子操作挂了,怎么解决?(心跳保活、设置做大谬误数)线程和过程的区别?Sprint的AOP的实现晓得吗?动静代理晓得吗?2.16 10:30-11:30 某互联网 一面 视频面自我介绍ArrayList和LinkedList的区别?优缺点?栈和队列的区别?利用场景?我的项目中用过队列吗?(开个阻塞队列寄存音讯,通过线程实现音讯发送)工夫复杂度和空间复杂度的了解?快排和冒泡排的工夫复杂度和空间复杂度?最坏的工夫复杂度?二叉树查找的工夫复杂度?(能够用二分查找 logN)介绍下Java的垃圾收集机制. (我一个人疯狂输入,额定说JC Roots对象和OopMap)晓得Full GC是什么状况吗?晓得full GC的虚拟机调优吗?(空间大小 触发比例 不能太大因为无奈解决浮动垃圾)数据库的sql优化?为什么索引可能加快速度?聚簇索引和非聚簇索引?联结索引的命中规定?全文索引的命中规定?晓得Linux的IO复用的epoll吗?ET和LT晓得吗?手撕快排说下互斥锁、共享锁、自旋锁.线程和过程间的切换次要有什么? 上下文和虚拟内存页表映射。用到的一些开源组件?FastJson、Hadoop、Hbase瞎扯了一点列存储比照行存储的区别和优缺点2.13 20:30-21:00 某互联网 一面 电话面自我介绍你为了这次面试做了哪些筹备?(看书、源码、整顿我的项目)我的项目中做得不好的然而没写在简历上的?怎么确定业务中的要开启的线程数?公式? (N * (1 + w/c ))如果CPU飙高怎么排查?(额定说了下阿里的Arthas)设计个程序,造成CPU飙高的状况?(死循环和死锁)还有吗?如果Java里删除了异样体系,怎么解决异样?你说你用过Git,过后多大的我的项目?怎么解决提交抵触的问题?强制提交晓得吗?你说你用过Servlet,版本是多少?(2.5)列举出Java里的三个类,对应三个设计模式?(DataSource、Filter、BufferReader)StringBuffer的append办法是什么设计模式?(我集体感觉是观察者模式)设计模式的设计准则?(解耦)开闭准则、责任繁多晓得吗?(不分明)本人写代码的过程中做了哪些解耦的设计?你说你用过MVC设计模式,除了MVC还有哪些?(ORM)哪些框架用了ORM?(Hibernate)Hibernate一级缓存、二级缓存晓得吗?晓得Hibernate的一些毛病吗?(不利于sql优化)晓得怎么做sql优化吗?晓得sql执行打算吗?如果有一个一万张表的数据库,怎么晓得哪些表加了索引?什么命令?你说你用过JavaScript,你感觉他是个面向对象的语言吗?JS怎么实现继承封装和多态?你还有什么问题吗?说着说着忽然又问了个问题:晓得SDK和API的区别吗?总结置信大家看了这么多肯定有很多播种,那么真正的干货来了!最初为大家筹备了java外围知识点+全套架构师学习材料和视频+一线大厂面试宝典+面试简历模板+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书一起收费分享给大家! 以上材料都是无偿分享给大家的,有须要的敌人关注公众号:前程有光,回复材料即可下载,只心愿大家多多反对小编,祝大家都能面试顺利!

February 19, 2021 · 1 min · jiezi

关于面试:青蛙跳问题为什么是斐波那契数列

在面试中咱们可能会遇到青蛙跳的问题:一只青蛙一次能够跳上一级台阶,或者跳上二级台阶。那么如果总共有N级台阶,问这只青蛙总共有多少种跳法?首先,咱们思考最简略的状况,如果只有一级台阶,那显然青蛙只有一种跳法。如果只有二级台阶,那么青蛙就有两种跳法,一种是每次跳一级,总共跳二次,另一种就是间接跳二级。接下来,再来看N级的(N大于2)的状况。咱们先把N级台阶的跳法看做一个N的函数,记为f(N)。思考N>2时,第一次跳就有两种跳法,一种是第一次只跳一级,此时跳法数就是前面剩下的N-1级台阶的跳法数,即为f(N-1);另一种则是第一次跳二级,那么此时的跳法数就是前面剩下的N-2级台阶的跳法数,即为f(N-2)。所以,N级台阶的跳法总数就是f(N)=f(N-1)+f(N-2)。显然这就是一个N>0的斐波那契数列。C++实现递归解法#include<iostream> using namespace std; long long RecursiveFibonacci(unsigned int n){ if(n == 1 || n == 2) return n; return RecursiveFibonacci(n-1) + RecursiveFibonacci(n-2);}int main() { cout << "RecursiveFibonacci(1)=" << RecursiveFibonacci(1) << endl; cout << "RecursiveFibonacci(2)=" << RecursiveFibonacci(2) << endl; cout << "RecursiveFibonacci(3)=" << RecursiveFibonacci(3) << endl; cout << "RecursiveFibonacci(5)=" << RecursiveFibonacci(5) << endl; cout << "RecursiveFibonacci(10)=" << RecursiveFibonacci(10) << endl; cout << "RecursiveFibonacci(50)=" << RecursiveFibonacci(50) << endl; cout << "RecursiveFibonacci(100)=" << RecursiveFibonacci(100) << endl;}很显然,递归实现效率是非常低的,其工夫复杂度是n的指数级。因为递归存在着大量的反复计算,大家也能够本人跑代码试试,递归去计算n=50就十分慢了。所以,优化思路就是从前往后计算,先依据f(1)和f(2)算f(3),在依据f(2)和f(3)算f(4),以此类推算出f(N)。其工夫复杂度是O(n)。C++实现非递归解法#include<iostream> using namespace std; long long NonRecursiveFibonacci(unsigned int n){ if(n == 1 || n == 2) return n; long long n1 = 1; long long n2 = 2; long long result = 0; for (unsigned int i = 3; i <= n; i++) { result = n1 + n2; n1 = n2; n2 = result; } return result;}int main() { cout << "NonRecursiveFibonacci(1)=" << NonRecursiveFibonacci(1) << endl; cout << "NonRecursiveFibonacci(2)=" << NonRecursiveFibonacci(2) << endl; cout << "NonRecursiveFibonacci(3)=" << NonRecursiveFibonacci(3) << endl; cout << "NonRecursiveFibonacci(5)=" << NonRecursiveFibonacci(5) << endl; cout << "NonRecursiveFibonacci(10)=" << NonRecursiveFibonacci(10) << endl; cout << "NonRecursiveFibonacci(50)=" << NonRecursiveFibonacci(50) << endl; cout << "NonRecursiveFibonacci(100)=" << NonRecursiveFibonacci(100) << endl;}

February 15, 2021 · 1 min · jiezi

关于面试:这些不可不知的JVM知识我都用思维导图整理好了

JVM是面试中必问的局部,本文通过思维导图以面向面试的角度整顿JVM中不可不知的常识。先上图: 1、JVM基本概念1.1、JVM是什么JVM 的全称是 「Java Virtual Machine」,也就是咱们耳熟能详的 Java 虚拟机。 JVM具备着计算机的根本运算形式,它次要负责把 Java 程序生成的字节码文件,解释成具体零碎平台上的机器指令,让其在各个平台运行。 JVM是运行在操作系统上的,它与硬件没有间接的交互。 当然,严格来说JVM也是虚拟机标准,有很多不同的实现,Sun/OracleJDK和OpenJDK中的默认Java虚拟机是HotSpot虚拟机,是目前应用范畴最广的Java虚拟机,个别讲到的JVM默认指的就是HotSpot虚拟机。1.2、Java程序运行过程咱们都晓得 Java 源文件,通过编译器,可能生产相应的.Class 文件,也就是字节码文件,而字节码文件又通过 Java 虚拟机中的解释器,编译成特定机器上的机器码 。 也就是如下: 每一种平台的解释器是不同的,然而实现的虚拟机是雷同的,这也就是 Java 为什么可能跨平台的起因了 ,当一个程序从开始运行,这时虚拟机就开始实例化了,多个程序启动就会存在多个虚拟机实例。程序退出或者敞开,则虚拟机实例沦亡,多个虚拟机实例之间数据不能共享。 1.3、JDK、JRE、JVMJDK(Java Development Kit Java 开发工具包),JDK 是提供给 Java 开发人员应用的,其中蕴含了 Java 的开发工具,也包含了 JRE。其中的开发工具包含编译工具(javac.exe) 打包工具(jar.exe)等。JRE(Java Runtime Environment Java 运行环境) 是 JDK 的子集,也就是包含 JRE 所有内容,以及开发应用程序所需的编译器和调试器等工具。JRE 提供了库、Java 虚拟机(JVM)和其余组件,用于运行 Java 编程语言、小程序、应用程序。JVM(Java Virtual Machine Java 虚拟机),JVM 能够了解为是一个虚构进去的计算机,具备着计算机的根本运算形式,它次要负责把 Java 程序生成的字节码文件,解释成具体零碎平台上的机器指令,让其在各个平台运行。 JDK中蕴含JRE,也包含JDK,而JRE也包含JDK。 范畴关系:JDK>JRE>JVM。 2、JVM内存区域Java虚拟机在执行Java程序的过程中会把它所治理的内存划分为若干个不同的数据区域。依据《Java虚拟机标准》的规定,Java虚拟机所治理的内存将会包含以下几个运行时数据区域: 当然,实际上,为了更好的适应 CPU 性能晋升,最大限度晋升JVM 运行效率,JDK中各个版本对JVM进行了一些迭代,示意图如下: JDK1.6、JDK1.7、JDK1.8 JVM 内存模型次要有以下差别: ...

February 14, 2021 · 3 min · jiezi

关于面试:2021Java后端工程师面试指南MySQL

前言文本已收录至我的GitHub仓库,欢送Star:https://github.com/bin3923282... 种一棵树最好的工夫是十年前,其次是当初Tips面试指南系列,很多状况下不会去深挖细节,是小六六以被面试者的角色去回顾常识的一种形式,所以我默认大部分的货色,作为面试官的你,必定是懂的。 https://www.processon.com/vie...下面的是脑图地址 叨絮可能大家感觉有点陈词滥调了,的确也是。面试题,面试宝典,轻易一搜,基本看不完,也看不过去,那我写这个的意义又何在呢?其实嘛我写这个的有以下的目标 第一就是通过一个体系的温习,让本人后面的写的文章再从新的过一遍,总结升华嘛第二就是通过写文章帮忙大家建设一个温习体系,我会将大部分会问的的知识点以点带面的模式给大家做一个导论而后上面是后面的文章汇总 2021-Java后端工程师面试指南-(引言)2021-Java后端工程师面试指南-(Java根底篇)2021-Java后端工程师面试指南-(并发-多线程)2021-Java后端工程师面试指南-(JVM)明天大家一起来温习温习MySQL吧 ## 聊聊MySql的构造吧 大体来说,MySQL 能够分为 Server 层和存储引擎层两局部。 Server 层包含连接器、查问缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数外围服 务性能,以及所有的内置函数(如日期、工夫、数学和加密函数等),所有跨存储引擎的性能都 在这一层实现,比方存储过程、触发器、视图等。 而存储引擎层负责数据的存储和提取。其架构模式是插件式的,反对 InnoDB、MyISAM、 Memory 等多个存储引擎。当初最罕用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成 为了默认存储引擎。 聊聊InnoDB和MyISAM的区别吧第一个也是最重要的一个 InnoDB反对事务,MyISAM不反对在MySQL中,表级锁有两种模式:表共享读锁,表独占写锁。也就是说对于MyISAM引擎的表,多个用户能够对同一个表发动读的申请,然而如果一个用户对表进行写操作,那么则会阻塞其余用户对这个表的读和写。InnoDB引擎的表是通过索引项来加锁实现的,即只有通过索引条件检索数据的时候,InnoDB才会应用行级锁,否则也会应用表级锁。InnoDB汇集索引,MyISAM 非汇集索引企业级生成环境强制用InnoDB,所以上面的面试题都是基于InnoDB。说说一个查问SQL的执行过程连接器:首先必定和mysql建设连贯的过程查问缓存:在8以前,mysql会把雷同的sql,缓存起来,然而因为发现效率不是那么好,8之后删除了分析器: 如果没有命中查问缓存,就要开始真正执行语句了。首先,MySQL 须要晓得你要做什么,因而 须要对 SQL 语句做解析优化器:优化器是在表外面有多个索引的时候,决定应用哪个索引执行器:MySQL 通过分析器晓得了你要做什么,通过优化器晓得了该怎么做,于是就进入了执行器阶 段,开始执行语句返回数据给到客户端说说一条SQL的插入流程update T set c=c+1 where ID=2; 执行器先找引擎取 ID=2 这一行。ID 是主键,引擎间接用树搜寻找到这一行。如果 ID=2 这一行所在的数据页原本就在内存中,就间接返回给执行器;否则,须要先从磁盘读入内 存,而后再返回。执行器拿到引擎给的行数据,把这个值加上 1,比方原来是 N,当初就是 N+1,失去新的 一行数据,再调用引擎接口写入这行新数据。引擎将这行新数据更新到内存中,同时将这个更新操作记录到 redo log 外面,此时 redo log 处于 prepare 状态。而后告知执行器执行实现了,随时能够提交事务执行器生成这个操作的 binlog,并把 binlog 写入磁盘。执行器调用引擎的提交事务接口,引擎把刚刚写入的 redo log 改成提交(commit)状 态,更新实现。说说Buffer Pool吧它是mysql 一个十分重要的内存组件,因为是在内存中操作的,所以速度比拟快倡议设置正当的buffer pool的大小,如果大小在内存的百分60适合要明确的是pool的构造是一页一页的如果内存够大,能够多设计几个poolBuffer Pool脏数据页到底为什么会脏是因为咱们新增 更新 删除操作的时候只是对内存进行操作,和对咱们redo log日志进行操作,所以呢就会有脏数据在buffer pool外面 有一个保护脏数据页的双向链表,用来明确哪个数据页须要刷而后还有就是lru链表,就是假如咱们的pool满了,那么咱们必定要把一些数据删除,就是lru算法了(基于冷热数据拆散的思维的lru)说说InnoDB页InnoDB是一个将表中的数据存储到磁盘上的存储引擎,所以即便关机后重启咱们的数据还是存在的。而真正解决数据的过程是产生在内存中的,所以须要把磁盘中的数据加载到内存中,如果是解决写入或批改申请的话,还须要把内存中的内容刷新到磁盘上。而咱们晓得读写磁盘的速度十分慢,和内存读写差了几个数量级,所以当咱们想从表中获取某些记录时,InnoDB存储引擎须要一条一条的把记录从磁盘上读出来么?不,那样会慢死,InnoDB采取的形式是:将数据划分为若干个页,以页作为磁盘和内存之间交互的根本单位,InnoDB中页的大小个别为 16 KB。也就是在个别状况下,一次起码从磁盘中读取16KB的内容到内存中,一次起码把内存中的16KB内容刷新到磁盘中。 ...

February 9, 2021 · 2 min · jiezi

关于面试:上干货大厂面试走心经验分享

先说下楼主经验: 其实我之前曾经写过一篇对于本人秋招经验的文章了,外面有很多面试题,能够作为参考: 往年行情这么差,到底如何进大厂? 上面从新介绍一下本人: 我集体是双非本,去年五月份至今始终在 JD 实习,拿到了 JD 的 offer 后,偶尔的机会(boss 上)就开始面试 部门是百度云 cdn 具体如同是做音视频相干的,次要语言是 Java 和我自己相符 一、二、三面两天面完,具体的问题记不清楚了,以下内容仅凭回顾(下班摸鱼写的): 注释一面面经:2021/1/21 下午五点 是个小姐姐,然而很庄重 自我介绍介绍实习我的项目、难点、参加的工作我的项目用到的设计模式以及其余设计模式syn 锁(降级过程、降级?(读写锁)一些底层原理)操作系统线程间同步机制syn 和 lock 区别线程池、参数详解?你怎么设置参数(I/O 密集型、计算密集型)JVM 内存区域如何排查一下线上 OOM 问题?类加载机制?双亲委派?tomcat 如何突破的?写代码 1 翻转链表(秒)2 手写快排序 介绍各个排序算法工夫复杂度在看的书籍?常识?《深刻了解 Java 虚拟机》说下最粗浅的局部?我说了个 R 大写的 JVM 是如何辨别出是援用类型还是根本类型反诘 大概 47 min二面:2020/1/22 上午十一点 HR 说的是一个高 T 二面面试我,果不其然,一个秃头大叔。 自我介绍介绍京东实习我的项目我的项目分布式锁怎么用的?主从的缓存 master 节点 down 了怎么办?(Redlock)脑裂问题(配置文件)、数据歪斜(一致性哈希,虚构节点)、数据分片缓存穿透、击穿、雪崩Redis 哨兵?cluster?zset 底层,为什么用压缩列表(防止内存碎片),跳表查问复杂度?log(n)(逮住 Redis 真就往死里问啊)看你博客里有微服务,讲讲微服务、分布式?我的项目中各个服务之间怎么调用的?我说用 JSF(JSF 是京东外部的RPC通信工具,相似于 dubbo)分布式 CAP 定理讲讲分布式事务解决方案,各自优缺点(心田。。。还好前几天看过)写题 遗记具体是啥了 反正都是属于 easy 的题目,大概 50+min还有一些回顾不起来了,如同是 Spring 源码的货色,电脑面试没有录音,总之抠得很细,面试官果然是个大佬。。。 ...

February 9, 2021 · 2 min · jiezi

关于面试:同时拿到BATJMD的Offer是怎样的一种体验

写在后面又到了收割Offer的节令,你筹备好了吗?已经的我,横扫各个大厂的Offer。还是那句话:进大厂长期抱佛脚是必定不行的,肯定要重视平时的总结和积攒,多思考,多积攒,多总结,多复盘,将工作经验真正转化为本人的工作教训。 明天,我就跟小伙伴们分享一些经典的大数据面试题,跟我一起横扫各个大厂的Offer!后续,我会给大家输入一篇我平时是如何在工作过程中总结经验的,心愿可能给小伙伴们带来实质性的帮忙。不多说了,开始明天的主题——面经分享。 面经分享明天给大家分享一个面试大厂的残缺面经,小伙伴们能够对照下,这些面试题本人是否都会了呢?欢送文末留言说出你的答案!如果你想晋升本人的技术,或者对本人的倒退比拟迷茫,都能够在文末说出你感触! 一轮技术面(90分钟)1.hashmap和hashtable区别 2.为什么产生死锁 3.jvm类加载 4.java反射获取公有属性,扭转值 5.反射用处 6.所用数据库 7.我的项目难点,问题 8.如何解决我的项目中遇到的问题 9.我的项目中遇到最骄傲的中央 10.会什么算法 二轮技术面(120分钟)1.讲我的项目 2.数据库乐观锁应用 3.状态机 4.如何解决状态机不对问题 5.如何分库分表 6.MySQL极限 7.HashMap源码 8.设计一个线程平安的HashMap 9.快排的实现,工夫复杂度和空间复杂度 10.会什么算法 11.如何把我的项目变成SOA架构 12.Spring源码,最粗浅的模块,aop用处 13.JVM内存模型 14.垃圾回收机制 15.我的项目中查看垃圾回收 三轮技术面(150分钟)1.ConcurrentHashMap底层原理? 2.手写一个LRU(用LinkedHashMap) 3.HashMap底层数据结构? 4.JDK1.8中的HashMap为什么用红黑树不必一般的AVL树? 5.为什么在8的时候链表变成树? 6.为什么在6的时候从树退回链表? 7.线程池7个参数,该怎么配置最好? 8.说一下volatile 9.volatile的可见性和禁止指令重排序怎么实现的? 10.CAS是什么?PriorityQueue底层是什么,初始容量是多少,扩容形式呢? 11.若原始大小<64,则扩容为原来的2倍+2,不然就扩容为原来的1.5倍 12.HashMap的容量为什么要设置为2的次幂? 13.你晓得跳表吗,什么场景会用到? 14.CopyOnWriteArrayList晓得吗,迭代器反对fail-fast吗? 15.innodb的底层数据结构? 16.为什么用B+树不必B树? 17.为什么用B+树不必红黑树? 18.coding:无序数组怎么寻找第k大的数,写一个二叉树档次遍历 19.不晓得大小的数据流取其中100个数,怎么的取法能最随机 20.n个物品每个物品都有肯定价值,分给2集体,怎么分两个人的价值差最小 四轮技术面(120分钟)1.我的项目中的权限治理 2.登录状态如何贮存 3.session和cookie的区别,session如何治理 4.HashMap底层构造 5.synchronized关键字的用法 6.synchronized润饰类办法和一般办法的锁区别,获取类锁之后还能获取对象锁吗 7.类加载器的双亲委派模型的作用,能反复加载某个类吗 8.类加载器的类的缓存,key是什么 9.介绍Redis 10.如何将数据分布在不同的Redis 11.有理解过取余算法? 12.spring的apo实现 13.字节码构造 14.浏览器输出网址过程,联合springmvc 五轮技术面(120分钟)1.HashMap在大量哈希抵触该怎么解决 2.红黑树比BST长处 3.MySQL为什么应用B+树 4.多个索引会有多份数据吗 5.数据库的隔离级别和解决的问题 6.数据库默认隔离级别,肯定会产生幻读吗,怎么解决 7.输出网址到展现的整个过程,联合springmvc来讲 8.负载平衡的算法 9.哈弗曼编码,如何解决译码问题 10.实习会对工作有影响吗 11.用英文介绍一个我的项目 12.如何查看零碎负载 13.形容一个解决问题的过程 14.如何把文件从服务器复制到本地,用什么命令 ...

February 8, 2021 · 1 min · jiezi

关于面试:LeetCode-第-45-场双周赛题解

点击 这里 能够查看更多算法面试相干内容~t1:5657. 惟一元素的和(简略)给你一个整数数组 nums 。数组中惟一元素是那些只呈现恰好一次的元素。 请你返回 nums 中惟一元素的和。 示例 1: 输出:nums = [1,2,3,2]输入:4解释:惟一元素为 [1,3] ,和为 4 。示例 2: 输出:nums = [1,1,1,1,1]输入:0解释:没有惟一元素,和为 0 。示例 3 : 输出:nums = [1,2,3,4,5]输入:15解释:惟一元素为 [1,2,3,4,5] ,和为 15 。提醒: 1 <= nums.length <= 1001 <= nums[i] <= 100奢侈解法一道模拟题,间接应用哈希表或者数组来存元素呈现次数即可。 对于一些给定了元素数据范畴的题目,倡议应用数据来进行统计,这样对于 Java 语言来说,代码会短些。 对于没有给定元素数据范畴,或者数据范畴很大的,则应用哈希表。 代码: class Solution { public int sumOfUnique(int[] nums) { int[] cnt = new int[110]; for (int i : nums) cnt[i]++; int ans = 0; for (int i = 0; i < 110; i++) { if (cnt[i] == 1) ans += i; } return ans; }}工夫复杂度:$O(n)$空间复杂度:$O(n)$t2:5658. 任意子数组和的绝对值的最大值(中等)给你一个整数数组 nums 。 ...

February 7, 2021 · 5 min · jiezi

关于面试:2021Java后端工程师面试指南JVM

前言文本已收录至我的GitHub仓库,欢送Star:https://github.com/bin3923282... 种一棵树最好的工夫是十年前,其次是当初Tips面试指南系列,很多状况下不会去深挖细节,是小六六以被面试者的角色去回顾常识的一种形式,所以我默认大部分的货色,作为面试官的你,必定是懂的。 https://www.processon.com/vie...下面的是脑图地址 叨絮可能大家感觉有点陈词滥调了,的确也是。面试题,面试宝典,轻易一搜,基本看不完,也看不过去,那我写这个的意义又何在呢?其实嘛我写这个的有以下的目标 第一就是通过一个体系的温习,让本人后面的写的文章再从新的过一遍,总结升华嘛第二就是通过写文章帮忙大家建设一个温习体系,我会将大部分会问的的知识点以点带面的模式给大家做一个导论而后上面是后面的文章汇总 2021-Java后端工程师面试指南-(引言)2021-Java后端工程师面试指南-(Java根底篇)2021-Java后端工程师面试指南-(并发-多线程)JVM 作为一个Java工程师,必须要把握和了解的一个点 ## 聊聊什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,引入Java语言虚拟机后,Java语言在不同平台上运行时不须要从新编译。Java语言应用Java虚拟机屏蔽了与具体平台相干的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的指标代码(字节码),就能够在多种平台上不加批改地运行。 ### 什么是类加载器,类加载器有哪些?实现通过类的全限定名获取该类的二进制字节流的代码块叫做类加载器。 次要有一下四品种加载器: 启动类加载器(Bootstrap ClassLoader)用来加载java外围类库,无奈被java程序间接援用。扩大类加载器(extensions class loader):它用来加载 Java 的扩大库。Java 虚拟机的实现会提供一个扩大库目录。该类加载器在此目录外面查找并加载 Java 类。零碎类加载器(system class loader):它依据 Java 利用的类门路(CLASSPATH)来加载 Java 类。一般来说,Java 利用的类都是由它来实现加载的。能够通过 ClassLoader.getSystemClassLoader()来获取它。用户自定义类加载器,通过继承 java.lang.ClassLoader类的形式实现。说说JVM类的生命周期和加载过程类的生命周期就蕴含了加载过程了,咱们JVM类的生命周期有以下7个阶段 加载: 通过全类名获取定义此类的二进制字节流将字节流所代表的动态存储构造转换为办法区的运行时数据结构在内存中生成一个代表该类的 Class 对象,作为办法区这些数据的拜访入口验证:验证文件格式,字节码验证,魔数验证等筹备 筹备阶段是正式为类变量分配内存并设置类变量初始值的阶段,如果是根本数据类型,就会给他们设置默认值解析:解析阶段是虚拟机将常量池内的符号援用替换为间接援用的过程初始化:首先明确一点的就是,必须存在以下的行为,才会进行类的初始化 当jvm执行new指令时会初始化类。即当程序创立一个类的实例对象。当jvm执行getstatic指令时会初始化类。即程序拜访类的动态变量(不是动态常量,常量会被加载到运行时常量池)。当jvm执行putstatic指令时会初始化类。即程序给类的动态变量赋值。当jvm执行invokestatic指令时会初始化类。即程序调用类的静态方法。应用 java.lang.reflect 包的办法对类进行反射调用时如Class.forname("..."),newInstance()等等。 ,如果类没初始化,须要触发其初始化。初始化一个类,如果其父类还未初始化,则先触发该父类的初始化。当虚拟机启动时,用户须要定义一个要执行的主类 (蕴含 main 办法的那个类),虚构机会先初始化这个类。应用:就是咱们失常应用了卸载: 卸载类即该类的Class对象被GC。卸载类须要满足3个要求: 该类的所有的实例对象都已被GC,也就是说堆不存在该类的实例对象。该类没有在其余任何中央被援用该类的类加载器的实例已被GC说说类加载器双亲委派模型机制?说说它的益处每一个类都有一个对应它的类加载器。零碎中的 ClassLoder 在协同工作的时候会默认应用 双亲委派模型 。即在类加载的时候,零碎会首先判断以后类是否被加载过。曾经被加载的类会间接返回,否则才会尝试加载。加载的时候,首先会把该申请委派该父类加载器的 loadClass() 解决,因而所有的申请最终都应该传送到顶层的启动类加载器 BootstrapClassLoader 中。当父类加载器无奈解决时,才由本人来解决。当父类加载器为null时,会应用启动类加载器 BootstrapClassLoader 作为父类加载器。 小六六总结一句话总结就是 类加载总是向上查看,向下加载。 双亲委派模型保障了Java程序的稳固运行,能够防止类的反复加载(JVM 辨别不同类的形式不仅仅依据类名,雷同的类文件被不同的类加载器加载产生的是两个不同的类),也保障了 Java 的外围 API 不被篡改。如果没有应用双亲委派模型,而是每个类加载器加载本人的话就会呈现一些问题,比方咱们编写一个称为 java.lang.Object 类的话,那么程序运行的时候,零碎就会呈现多个不同的 Object 类。 ...

February 7, 2021 · 2 min · jiezi

关于面试:每日算法刷穿-LeetCode15-三数之和中等

题目形容给你一个蕴含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不反复的三元组。 留神:答案中不能够蕴含反复的三元组。 示例 1: 输出:nums = [-1,0,1,2,-1,-4]输入:[[-1,-1,2],[-1,0,1]]示例 2: 输出:nums = []输入:[]示例 3: 输出:nums = [0]输入:[]提醒: 0 <= nums.length <= 3000-105 <= nums[i] <= 105排序+双指针解法对数组进行排序,应用三个指针 i、j 和 k 别离代表要找的三个数。 通过枚举 i 确定第一个数,另外两个指针 j,k 别离从右边 i + 1 和左边 n - 1 往两头挪动,找到满足 nums[i] + nums[j] + nums[k] == 0 的所有组合。j 和 k 指针的挪动逻辑,分状况探讨 sum = nums[i] + nums[j] + nums[k] : ...

February 6, 2021 · 2 min · jiezi

关于面试:每日算法刷穿-LeetCode14-最长公共前缀简单

点击 这里 能够查看更多算法面试相干内容~题目形容编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。 示例 1: 输出:strs = ["flower","flow","flight"]输入:"fl"示例 2: 输出:strs = ["dog","racecar","car"]输入:""解释:输出不存在公共前缀。提醒: 0 <= strs.length <= 2000 <= strs[i].length <= 200strs[i] 仅由小写英文字母组成奢侈解法对每个字符串进行逐位查看,直到不满足公共前缀: class Solution { public String longestCommonPrefix(String[] ss) { String ans = ""; if (ss.length == 0) return ans; for (int i = 0; i < Integer.MAX_VALUE; i++) { String s = ss[0]; if (i >= s.length()) return ans; char c = ss[0].charAt(i); for (String item : ss) { if (i >= item.length() || item.charAt(i) != c) return ans; } ans += String.valueOf(c); } return ans; }}阐明:判断条件不肯定要写成 i < Integer.MAX_VALUE,题目给出了范畴是 200 以内,写成 i <= 200 也能够。不影响执行效率。 ...

February 6, 2021 · 1 min · jiezi

关于面试:刷穿-LeetCode13-罗马数字转整数简单

点击 这里 能够查看更多算法面试相干内容~题目形容罗马数字蕴含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。 通常状况下,罗马数字中小的数字在大的数字的左边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的右边,所示意的数等于大数 5 减小数 1 失去的数值 4 。同样地,数字 9 示意为 IX。这个非凡的规定只实用于以下六种状况: I 能够放在 V (5) 和 X (10) 的右边,来示意 4 和 9。X 能够放在 L (50) 和 C (100) 的右边,来示意 40 和 90。C 能够放在 D (500) 和 M (1000) 的右边,来示意 400 和 900。给定一个罗马数字,将其转换成整数。输出确保在 1 到 3999 的范畴内。 ...

February 6, 2021 · 2 min · jiezi

关于面试:每日算法刷穿-LeetCode12-整数转罗马数字中等

点击 这里 能够查看更多算法面试相干内容~题目形容罗马数字蕴含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。 通常状况下,罗马数字中小的数字在大的数字的左边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的右边,所示意的数等于大数 5 减小数 1 失去的数值 4 。同样地,数字 9 示意为 IX。这个非凡的规定只实用于以下六种状况: I 能够放在 V (5) 和 X (10) 的右边,来示意 4 和 9。X 能够放在 L (50) 和 C (100) 的右边,来示意 40 和 90。C 能够放在 D (500) 和 M (1000) 的右边,来示意 400 和 900。给定一个整数,将其转为罗马数字。输出确保在 1 到 3999 的范畴内。 ...

February 6, 2021 · 2 min · jiezi

关于面试:即使技术再精面试时一问这个必挂

写在后面在前几年面试Java高级程序员的时候,只有是会一点JVM的基础知识,根本就都可能面试通过了。最近几年,对Java工程师的要求越来越严格,对于中级Java工程师来说,也须要把握JVM相干的常识了。这不,一名读者进来面试Java岗位,就被问及了JVM相干的类的加载、链接和初始化的问题。后果凉凉了,明天,咱们就一起来具体探讨下这个问题。 文章已收录到: https://github.com/sunshinelyz/technology-binghe https://gitee.com/binghe001/technology-binghe 概述本文咱们一起探讨Java类的加载、链接和初始化。 Java字节代码的表现形式是字节数组(byte[]),而Java类在JVM中的表现形式是 java.lang.Class类 的对象。一个Java类从字节代码到可能在JVM中被应用,须要通过加载、链接和初始化这三个步骤。这三个步骤中,对开发人员间接可见的是Java类的加 载,通过应用Java类加载器(class loader)能够在运行时刻动静的加载一个Java类;而链接和初始化则是在应用Java类之前会产生的动作。本文会具体介绍Java类的加载、链接和 初始化的过程。 Java 类的加载Java类的加载是由类加载器来实现的。 一般来说,类加载器分成两类:启动类加载器(bootstrap)和用户自定义的类加载器(user-defined)。 两者的区别在于启动类加载器是由JVM的原生代码实现的,而用户自定义的类加载器都继承自Java中的 java.lang.ClassLoader类。在用户自定义类加载器的局部,个别JVM都会提供一些根本实现。应用程序的开发人员也能够依据须要编写本人的类加载器。 JVM中最常应用的是零碎类加载器(system),它用来启动 Java应用程序的加载。通过java.lang.ClassLoader的 getSystemClassLoader()办法能够获取到该类加载器对象。 类加载器须要实现的最终性能是定义一个Java类,即把Java字节代码转换成JVM中的java.lang.Class类的对象。然而类加载的过程并不是这么简略。 Java类加载器有两个比拟重要的特色:档次组织构造和代理模式。 档次组织构造指的是每个类加载器都有一个父类加载器,通过 getParent()办法能够获取到。类加载器通过这种父亲-后辈的形式组织在一起,造成树状层次结构。代理模式则指的是一个类加载器既能够本人实现Java类的定义工作,也能够代理给其它的类加载器来实现。因为代理模式的存在,启动一个类的加载过程的类加载器和最终定义这个类的类加载器可能并不是一个。前者称为初始类加载器, 而后者称为定义类加载器。 两者的关联在于:一个Java类的定义类加载器是该类所导入的其它Java类的初始类加载器。比方类A通过import导入了类 B,那么由类A的定义类加载器负责启动类B的加载过程。个别的类加载器在尝试本人去加载某个Java类之前,会首先代理给其父类加载器。当父类加载器找不到的时候,才会尝试本人加载。这个逻辑是封装在java.lang.ClassLoader类的 loadClass()办法中的。一般来说,父类优先的策略就足够好了。在某些状况下,可能须要采取相同的策略,即先尝试本人加载,找不到的时候再代理给父类加载器。这种做法在Java的Web容器中比拟常见,也是 Servlet标准举荐的做法。比方,Apache Tomcat为每个Web利用都提供一个独立的类加载器,应用的就是本人优先加载的策略。 IBM WebSphere Application Server则容许Web利用抉择。 类加载器应用的策略类加载器的一个重要用处是在JVM中为雷同名称的Java类创立隔离空间。在JVM中,判断两个类是否雷同,不仅是依据该类的二进制名称 ,还须要依据两个类的定义类加载器。只有两者齐全一样,才认为两个类是雷同的。因而,即使是同样的Java字节代码,被两个不同的类加载器定义之后,所失去的Java类也是不同的。如果试图在两个类的对象之间进行赋值操作,会抛出 java.lang.ClassCastException。这个个性为同样名称的Java类在JVM中共存发明了条件。在理论的利用中,可能会要求同一名称的Java类的不同版本在JVM中能够同时存在。通过类加载器就能够满足这种需要。这种技术在 OSGi中失去了宽泛的利用 Java 类的链接Java类的链接指的是将Java类的二进制代码合并到JVM的运行状态之中的过程。在链接之前,这个类必须被胜利加载。类的链接包含验证、筹备和解析等几个步骤。验证是用来确保Java类的二进制示意在结构上是完全正确的。如果验证过程呈现谬误的话,会抛出 java.lang.VerifyError谬误。 筹备过程则是创立Java类中的动态域,并将这些域的值设为默认值。筹备过程并不会执行代码。在一个Java类中会蕴含对其它类或接口的模式援用,包含它的父类、所实现的接口、办法的形式参数和返回值的Java类等。解析的过程就是确保这些被援用的类能被正确的找到。解析的过程可能会导致其它的 Java类被加载。不同的 JVM 实现可能抉择不同的解析策略。 一种做法是在链接的时候,就递归的把所有依赖的模式援用都进行解析。而另外的做法则可能是只在一个模式援用真正须要的时候才进行解析。也就是说如果一个 Java 类只是被援用了,然而并没有被真正用到,那么这个类有可能就不会被解析。思考上面的代码: public class LinkTest { public static void main(String[] args) { ToBeLinked toBeLinked = null; System.out.println("Test link."); }}类LinkTest 援用了类 ToBeLinked,然而并没有真正应用它,只是申明了一个变量,并没有创立该类的实例或是拜访其中的动态域。 在 Oracle 的 JDK 6 中,如果把编译好的 ToBeLinked 的 Java 字节代码删除之后,再运行 LinkTest,程序不会抛出谬误。这是因为 ToBeLinked 类没有被真正用到,而 Oracle 的 JDK 6 所采纳的链接策略使得ToBeLinked 类不会被加载,因而也不会发现 ToBeLinked 的 Java 字节代码实际上是不存在的。如果把代码改成 ToBeLinked toBeLinked = new ToBeLinked();之后,再依照雷同的办法运行,就会抛出异样了。因为这个时候 ToBeLinked 这个类被真正应用到了,会须要加载这个类。 ...

February 6, 2021 · 2 min · jiezi

关于面试:职场-跳槽之后如何平稳走过试用期

上篇:职场 | 3天筹备5天面试,跳槽实现 试用期什么事件最重要?把那些能帮忙本人疾速转正的事件做好。01实现跳槽之后,进入新公司并不阐明就算真正进入该公司,试用期的三个月考核这才是正式开始。 尤其互联网行业中,在试用期被到职或者被动到职的亘古未有,两头起因很难一概而论。 不过大部分起因可能就是公司环境适应不下来,可能是开发环境,或者工作环境,再或者就是什么价值观不和的虚与委蛇。 这也就是为什么很多人跳槽之后的三个月并不敢间接把房子搬到公司左近,因为总怕没转正来回折腾麻烦,这应该是大多数流浪在外的敌人心中无言的伤。 生存就是这样,花里胡哨的,你能够不酷爱然而要面对。 02互联网公司的程序员试用期到底要做哪些事件?一句话形容:很多。 入职的第一周,一天搭建环境,一天相熟代码构造,三天看看业务和局部接口逻辑,这都是良心公司才有的安顿,合不合理?谁晓得呢。 有些公司不讲武德,入职一天之后间接甩个小需要过去,美其名曰能够疾速适应业务,说的也挺不苟言笑的。 搭建公司的开发环境这是起手操作,个别除了实习阶段有人手把手的教环境搭建之外,后续在入职新公司都须要本人折腾。 环境搭建好之后就是疾速的把代码在本地构建好,并运行起来,这里可能会有一些非凡的配置能够依据环境文档操作即可,而后就是相熟代码中的各种技术组件,标准和根底工具。 新的公司不论零碎如何,可能都会遇到本人不相熟模块,比方公司零碎开发的技术栈基于是分布式,有些新技术组件的须要学习,能够在上班后工夫疾速相熟官网文档和联合我的项目用法,疾速熟悉起来。 尤其留神的是这些不相熟的技术组件,能够说本人不太熟然而不能说不会,利用闲暇的工夫疾速恶补一下,而后照葫芦画瓢摆出一副不难的样子。 对于大多数公司而言,环境和代码构造相熟根本也就管制在两天的工夫,而后就是对于现有产品的流程相熟,这里肯定要做到心里有数,相熟产品中的外围业务流即可。 借助业务文档,需要文档,和开发环境的,理分明外围业务模式的流程,像零碎根底,权限治理,架构这些内容都不是以后最要害的,只有相熟外围流程,能力在前面需要开发的时候做到心里有数。 03能给一周相熟环境和产品的公司,目测相对良心了,第二周开始就会染指到版本需要开发,工作的这几年真的不乏有很多人在第一个版本就凉了的。 加入的第一个版本需要开发通常不会很难,可能是遗留的小需要或者线上呈现的小的BUG,这个版本也不是用来考查新人的能力下限,根本就是看做事格调,思维,还有就是对环境的相熟度。 需要开发的根本套路无非就是评审,立项,开发,测试,上线,然而这是个回绝犯错的版本,如果第一个需要开发不顺或者有重大失误,根本就试用期完结,留神上面几点,根本无压力: 第一:了解根本需要;这时候不须要端着,不合理不懂或者不了解,版本开始的时候就要探讨分明,最禁忌开始说很明确,在周期结尾发现有关联问题或者考虑不周导致延期。这样会导致心里压力大,工夫紧,效应型谬误就会间断呈现,而后HR谈话就会呈现。 第二:代码与标准;首先就是新分支的创立,而后就是根本需要实现开发,理论的代码开发倡议在开始的时候参考现有代码格调与逻辑即可,不须要过多退出本人的习惯和格调。 第三:良好的意识;业务开发真的很考验程序员的意识,因为业务之间的关联性可能在需要上不能间接体现,只有在一直推动和调试中才会呈现,新人最大痛点莫过于需要开发完之后,引起一些盲区问题,所以在倡议业务不相熟的状况下,通过加班赶开发进度,提前开发完如果发现关联问题能够有工夫解决,同时给团队留下很好的印象,防止处于被动状态。 如果这个需要能够顺利完成上线,那就根本算正式融入这个新的环境了,不须要再有太多心里压力,后续就会开始一直的版本开发和业务相熟的良好状态中。 04这里来聊聊集体在团队中的定位,有多大的能力拿多少钱,就要承当相应的责任,这是通常的共识。 在一个正当的气氛良好的团队中,通常对于分工都是极其正当的,高级工程师承当外围业务,高级工程师负责边缘业务,架构师做日常架构保护和降级。 所以本人以新人入职到一个团队之后,要明确部门对本人的定位,并且承当相应的责任,在试用期后半段,个别会依照能力调配不同难度的开发需要,保持良好的心态认真对待就好。 另一个关键问题就是集体价值,如果作为新人对现有业务不相熟是毛病,那作为新人带着之前公司的积攒和教训过去就是集体的劣势,能给现有团队带来多少影响和扭转就是集体价值。 相比之下显出好坏,所以每个跳槽的人心里都要分明本人的优劣势,所以把本人之前工作的积攒在新公司施展出价值就至关重要,比方开发标准,好用的组件,业务解决方案,产品迭代等等。 不论是专业技能还是教训,都能够帮本人疾速融入新团队,疾速在新的环境中产生价值。只有这样能力给后续的倒退做好铺垫,这就是跳槽中的劣势积攒。 05最初聊一个事实的问题,如何面对转正述职,通常从工作内容、量化后果、将来布局这三个外围方面做总结。 其实真正理论考量的就是试用期的工作成绩,你负责的模块要匹配你的薪酬程度,如果试用期没有犯过重大失误,而且承当的开发模块有肯定的难度,这就根本判断能够通过试用期了。 能够适当展现本人在需要开发中的文档,例如开发设计、流程形容、接口文档等内容,懂得一直积攒的人通常更令人释怀和信赖。 其次就是将来布局,思路清晰和布局明确的人能够承当更高难度的工作,因为明确本人要做什么并且懂得如何安顿和具体落实,这里要能够针对具体零碎问题或者产品规定层面来思考,防止假大空放烟花。 最初适当的彩虹屁要撒一波,比方共事靠谱团队气氛好,领导关照公司前景等,不必过分和适度,几句话八面玲珑即可。 浏览标签 【Java根底】【设计模式】【构造与算法】【Linux零碎】【数据库】【分布式架构】【微服务】【大数据组件】【SpringBoot进阶】【Spring&Boot根底】【数据分析】【技术导图】【 职场】

February 6, 2021 · 1 min · jiezi

关于面试:每日算法刷穿-LeetCode10-正则表达式匹配困难

点击 这里 能够查看更多算法面试相干内容~题目形容给你一个字符串 s 和一个字符法则 p,请你来实现一个反对 '.' 和 '*' 的正则表达式匹配。 '.' 匹配任意单个字符'*' 匹配零个或多个后面的那一个元素所谓匹配,是要涵盖整个字符串 s 的,而不是局部字符串。 示例 1: 输出:s = "aa" p = "a" 输入:false解释:"a" 无奈匹配 "aa" 整个字符串。示例 2: 输出:s = "aa" p = "a*" 输入:true解释:因为 '*' 代表能够匹配零个或多个后面的那一个元素, 在这里后面的元素就是 'a'。因而,字符串 "aa" 可被视为 'a' 反复了一次。示例 3: 输出:s = "ab" p = ".*" 输入:true解释:".*" 示意可匹配零个或多个('*')任意字符('.')。示例 4: 输出:s = "aab" p = "c*a*b"输入:true解释:因为 '*' 示意零个或多个,这里 'c' 为 0 个, 'a' 被反复一次。因而能够匹配字符串 "aab"。示例 5: ...

February 5, 2021 · 3 min · jiezi

关于面试:每日算法刷穿-LeetCode9-回文数简单

点击 这里 能够查看更多算法面试相干内容~题目形容判断一个整数是否是回文数。回文数是斧正序(从左向右)和倒序(从右向左)读都是一样的整数。 示例 1: 输出: 121 输入: true示例 2: 输出: -121 输入: false解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因而它不是一个回文数。示例 3: 输出: 10 输入: false解释: 从右向左读, 为 01 。因而它不是一个回文数。进阶: 你能不将整数转为字符串来解决这个问题吗? 字符串解法既然进阶里提到了不能用字符串来解决,那么三叶就提供一下吧。 class Solution { public boolean isPalindrome(int x) { String s = String.valueOf(x); StringBuilder sb = new StringBuilder(s); sb.reverse(); return sb.toString().equals(s); }}工夫复杂度:数字 n 的位数,数字大概有 log10(n) 位,翻转操作要执行循环。复杂度为 O(log10(n)) 空间复杂度:应用了字符串作为存储。复杂度为 O(log10(n)) 非字符串解法(齐全翻转)原数值 x 的不超过 int 的示意范畴,但翻转后的值会有溢出的危险,所以这里应用 long 进行接管,最初比照两者是否相等。 class Solution { public boolean isPalindrome(int x) { if (x < 0) return false; long ans = 0; int t = x; while (x > 0) { ans = ans * 10 + x % 10; x /= 10; } return ans - t == 0; }}工夫复杂度:数字 n 的位数,数字大概有 $\log{10}{n}$ 位。复杂度为 $\log{10}{n}$ ...

February 5, 2021 · 2 min · jiezi

关于面试:面试官问我斐波拉契数列我从暴力递归讲到动态规划

文章首发于公众号 宫水三叶的刷题日记,转载请分割开白名单。 前言在零碎学习动静布局之前,始终搞不懂「动静布局」和「记忆化搜寻」之间的区别。 总感觉动静布局只是单纯的难在于对“状态”的形象定义和“状态转移方程”的推导,并无具体的法则可循。 本文将助你彻底搞懂动静布局。点击 这里 能够查看更多算法面试相干内容~ 演变过程暴力递归 -> 记忆化搜寻 -> 动静布局 其实动静布局也就是这样演练过去的。 能够说简直所有的「动静布局」都能够通过「暴力递归」转换而来,前提是该问题是一个“无后效性”问题。 无后效性所谓的“无后效性”是指:当某阶段的状态一旦确定,尔后的决策过程和最终后果将不受此前的各种状态所影响。可简略了解为当编写好一个递归函数之后,当可变参数确定之后,后果是惟一确定的。 可能你还是对什么是“无后效性”问题感到难以了解。没关系,咱们再举一个更具象的例子,这是 LeetCode 62. Unique Paths :给定一个 m x n 的矩阵,从左上角作为终点,达到右下角共有多少条门路(机器人只能往右或者往下进行挪动)。 这是一道经典的「动静布局」入门题目,也是一个经典的“无后效性”问题。 它的“无后效性”体现在:当给定了某个状态(一个具体的 m x n 的矩阵和某个终点,如 (1,2)),那么从这个点达到右下角的门路数量就是齐全确定的。 而与如何达到这个“状态”无关,与机器人是通过点 (0,2) 达到的 (1,2),还是通过 (1,1) 达到的 (1,2) 无关。 这就是所谓的“无后效性”问题。 当咱们尝试应用「动静布局」解决问题的时候,首先要关注该问题是否为一个“无后效性”问题。 1:暴力递归常常咱们面对一个问题,即便咱们明确晓得了它是一个“无后效性”问题,它能够通过「动静布局」来解决。咱们还是感觉难以动手。 这时候我的倡议是,先写一个「暴力递归」的版本。 还是以刚刚说到的 LeetCode 62. Unique Paths 举例: class Solution {    public int uniquePaths(int m, int n) {        return recursive(m, n, 0, 0);    }    private int recursive(int m, int n, int i, int j) {        if (i == m - 1 || j == n - 1) return 1;        return recursive(m, n, i + 1, j) + recursive(m, n, i, j + 1);    }} 当我还不晓得如何应用「动静布局」求解时,我会设计一个递归函数 recursive() 。 函数传入矩阵信息和机器人以后所在的地位,返回在这个矩阵里,从机器人所在的地位登程,达到右下角有多少条门路。 有了这个递归函数之后,那问题其实就是求解 recursive(m, n, 0, 0):求解从 (0,0) 到右下角的门路数量。 接下来,实现这个函数: Base case: 因为题目明确了机器人只能往下或者往右两个方向走,所以能够定下来递归办法的 base case 是当曾经处于矩阵的最初一行或者最初一列,即只一条路能够走。其余状况:机器人既能够往右走也能够往下走,所以对于某一个地位来说,达到右下角的门路数量等于它左边地位达到右下角的门路数量 + 它下方地位达到右下角的门路数量。即 recursive(m, n, i + 1, j) + recursive(m, n, i, j + 1),这两个地位都能够通过递归函数进行求解。其实到这里,咱们曾经求解了这个问题了。 ...

February 5, 2021 · 2 min · jiezi

关于面试:每日算法刷穿-LeetCode8-字符串转换整数-atoi-中等

点击 这里 能够查看更多算法面试相干内容~题目形容请你来实现一个 atoi 函数,使其能将字符串转换成整数。 首先,该函数会依据须要抛弃无用的结尾空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规定如下: 如果第一个非空字符为正或者负号时,则将该符号与之前面尽可能多的间断数字字符组合起来,造成一个有符号整数。如果第一个非空字符是数字,则间接将其与之后间断的数字字符组合起来,造成一个整数。该字符串在无效的整数局部之后也可能会存在多余的字符,那么这些字符能够被疏忽,它们对函数不应该造成影响。如果该字符串中的第一个非空格字符不是一个无效整数字符、字符串为空或字符串仅蕴含空白字符时,则你的函数不须要进行转换,即无奈进行无效转换。 在任何状况下,若函数不能进行无效的转换时,请返回 0 。 留神: 本题中的空白字符只包含空格字符 ' '。假如咱们的环境只能存储 32 位大小的有符号整数,那么其数值范畴为 [−2^31, 2^31 − 1]。如果数值超过这个范畴,请返回 2^31 − 1 或 −2^31 。示例 1: 输出: "42" 输入: 42示例 2: 输出: "-42" 输入: -42解释: 第一个非空白字符为 '-', 它是一个负号。咱们尽可能将负号与前面所有间断呈现的数字组合起来,最初失去 -42 。 示例 3: 输出: "4193 with words 输入: 4193*解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。 示例 4: 输出: "words and 987" 输入: 0解释: 第一个非空字符是 'w', 但它不是数字或正、负号。因而无奈执行无效的转换。 示例 5: 输出: "-91283472332" 输入: -2147483648解释: 数字 "-91283472332" 超过 32 位有符号整数范畴。 因而返回 INT_MIN (−231) 。 ...

February 4, 2021 · 2 min · jiezi

关于面试:我们一起学集合LinkedList

linkedlist,LinkedList遍历,linkedlist实现,linkedlist和arraylist区别,linkedlist线程平安,linkedlist源码微信关注【面试情报局】咱们一起干翻面试官。 1.前言明天咱们要钻研的汇合是LinkedList,在咱们学习LinkedList之前,咱们先看看LinkedList的相干面试题。 1.LinkedList的构造。2.LinkedList插入元素的具体过程。3.LinkedList和ArrayList的区别。4.……这些面试题都是考查咱们对链表这种构造是否有理解,是否有看过相干源码实现;只有看过源码,这些问题答复起来很是轻松;废话不多说,让咱们一起来看看LinkedList的源码实现。 2.概述LinkedList 底层实现是一个双向链表,这种构造非常适合队列(先入先出)和栈(先入后出)的操作;并且他实现了List和Deque接口,所以它不仅有列表的操作还有队列相干的操作;其实现的队列和栈的出队入队,出栈入栈操作工夫复杂度均为O(1), 如下是其构造示意图: 3.类图 AbstractSequentialList 抽象类,提供了List接口的相干实现和迭代逻辑的实现,不过对LinkedList意义不大,因为LinkedList大量重写了其中的实现List 接口,定义了数组的增删改查迭代遍历等相干操作。Cloneable 接口,反对LinkedList克隆Serializabel 接口,反对LinkedList序列化与反序列化Deque接口,定义了队列两端插入和删除元素的相干操作。4.属性首先让咱们看看源码中的定义: public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable{ // 链表大小(贮存元素的个数) transient int size = 0; // 头结点 transient Node<E> first; // 尾结点 transient Node<E> last; // 贮存元素的类(节点) private static class Node<E> { // 理论贮存的元素 E item; // next节点 Node<E> next; // prev节点 Node<E> prev; Node(Node<E> prev, E element, Node<E> next) { this.item = element; this.next = next; this.prev = prev; } } // 该属性是通过继承 AbstractList 得来,列表批改的次数(版本号) protected transient int modCount = 0;}Node 是链表中贮存数据的节点,他有三个属性item(存储元素),next(指向下一个节点),prev(指向上一个节点)。size 双向链表的节点个数。first 双向链表头,头节点的prev指向null。last 双向链表尾,尾节点的next指向null。modCount 版本号,记录批改次数。5.罕用办法5-1.新增LinkedList的新增分三类:首节点新增,指定索引节点新增,尾节点新增。首先,看看对List\`接口实现的新增: ...

February 4, 2021 · 6 min · jiezi

关于面试:2021Java后端工程师面试指南并发多线程

前言文本已收录至我的GitHub仓库,欢送Star:https://github.com/bin3923282... 种一棵树最好的工夫是十年前,其次是当初Tips面试指南系列,很多状况下不会去深挖细节,是小六六以被面试者的角色去回顾常识的一种形式,所以我默认大部分的货色,作为面试官的你,必定是懂的。 https://www.processon.com/vie...下面的是脑图地址 叨絮可能大家感觉有点陈词滥调了,的确也是。面试题,面试宝典,轻易一搜,基本看不完,也看不过去,那我写这个的意义又何在呢?其实嘛我写这个的有以下的目标 第一就是通过一个体系的温习,让本人后面的写的文章再从新的过一遍,总结升华嘛第二就是通过写文章帮忙大家建设一个温习体系,我会将大部分会问的的知识点以点带面的模式给大家做一个导论而后上面是后面的文章汇总 2021-Java后端工程师面试指南-(引言)2021-Java后端工程师面试指南-(Java根底篇)明天来看看多线程的,这块是重点,也是难点,硬核有点多哈哈。 ## 并发 记得阿里的第一个题就是面的并发,哈哈 这个小六六得好好总结了。 ### 聊聊Java的并发模型 这个为啥是第一个问题,必定是有起因的,如果连Java的并发模型都不分明,你跟我扯一堆的锁,一堆的juc有啥用呢? Java并发 采纳的是 共享内存模型,Java线程之前的通信总是隐式进行的。Java线程通信由Java内存模型(简称 JMM)管制,JMM 决定一个线程对共享变量的写入何时对另一个线程可见。从形象角度看,JMM定义了 线程 和 主内存 之间的形象关系:线程之间的共享变量贮存在主内存中,每个线程都有一个公有的本地内存,本地内存贮存了 该线程 以读共享变量的正本。 对多线程理解吗,说说你平时怎么对临界资源的访问控制的。其实这个题就是一个引人,由浅入深的过程, 如果对应的临界资源是在单JVM的过程中,那么咱们能够用Synchronized和lock对于分布式环境下的多线程中,那么就得用上分布式锁(redis 或者zookeeper实现)那么聊聊你对Synchronized的意识吧synchronized 关键字解决的是多个线程之间拜访资源的同步性,synchronized关键字能够保障被它润饰的办法或者代码块在任意时刻只能有一个线程执行。synchronized 最次要三种用法 - 润饰实例办法 要取得以后对象实例的锁润饰静态方法 取得以后类对象的锁润饰代码块 synchronized(this|object) 示意进入同步代码库前要取得给定对象的锁。synchronized(类.class) 示意进入同步代码前要取得 以后 class 的锁synchronized 关键字最次要的二种底层实现形式: synchronized 同步语句块的实现应用的是 monitorenter 和 monitorexit 指令,其中 monitorenter 指令指向同步代码块的开始地位,monitorexit 指令则指明同步代码块的完结地位。wait/notify等办法也依赖于monitor对象,这就是为什么只有在同步的块或者办法中能力调用wait/notify等办法,否则会抛出java.lang.IllegalMonitorStateException的异样的起因。synchronized 润饰的办法并没有 monitorenter 指令和 monitorexit 指令,获得代之的的确是 ACC_SYNCHRONIZED 标识,该标识指明了该办法是一个同步办法。JVM 通过该 ACC_SYNCHRONIZED 拜访标记来分别一个办法是否申明为同步办法,从而执行相应的同步调用。聊聊Java对象的布局首先咱们晓得Java对象散布由三个局部组成 对象头、实例数据、对对齐填充字节,上面咱们来一个个说说 对象头的组成由 Mark Word、类元数据的指针(Klass Pointer)、数组长度(不肯定有),在64位Java虚拟机外面的Mark word 蕴含了咱们的 hashcode的值 咱们的分代年龄 锁标记位等实例数据 并不是所有的变量都寄存在这里,对象的的所有成员变量以及其父类的成员变量是寄存在这里的。JVM要求Java对象的大小必须是8byte的倍数,所以这个的作用就是把对象的大小补齐至8byte的倍数。那你说说Synchronized锁降级的过程吧锁级别从低到高顺次是: ...

February 4, 2021 · 1 min · jiezi

关于面试:????-关于-TCP-三次握手和四次挥手满分回答在此

0. 前言在面试中,计算机网络的 TCP 三次握手和四次挥手是很常见的问题,然而在理论面试中,面试官会更违心听到怎么的答复呢?具体水平是怎么的? 越简略常见的问题越不可小觑,万丈高楼平地起,把简略的问题深刻化,才更能拉开与竞争者的间隔。把握了本文讲的全副知识点,对于 TCP 三次握手和四次挥手根本就 OK 了 ???? 1. TCP 和 UDP解说 TCP 三次握手和四次握手之前,咱们先理解一下 TCP 和 UDP 这两个重量级的传输层协定。 ???? 用户数据报协定 UDP(User Datagram Protocol): UDP 在传送数据之前不须要先建设连贯,近程主机在收到 UDP 报文后,不须要给出任何确认。尽管 UDP 不提供牢靠交付,但在某些状况下 UDP 确是一种最无效的工作形式(个别用于即时通信),比方: QQ 语音、 QQ 视频 、直播等等???? 传输控制协议 TCP(Transmission Control Protocol): TCP 提供面向连贯的服务。在传送数据之前必须先建设连贯,数据传送完结后要开释连贯。TCP 不提供播送或多播服务。因为 TCP 要提供牢靠的,面向连贯的传输服务(TCP的牢靠体现在TCP在传递数据之前,会有三次握手来建设连贯,而且在数据传递时,有确认、窗口、重传、流量管制、拥塞管制机制,在数据传完后,还会四次挥手断开连接用来节约系统资源),这不仅使协定数据单元的首部增大很多,还要占用许多处理机资源。TCP 个别用于文件传输、发送和接管邮件、近程登录等场景。2. TCP 报文段首部格局TCP 报文段的具体格局大家能够不用都记住,然而其中的几个管制位与咱们接下来要讲的三次握手和四次挥手非亲非故,大家肯定要牢记。 首部固定局部各字段意义如下: 1 - 源端口和目标端口:各占 2 个字节,别离写入源端口和目标端口。IP 地址 + 端口号就能够确定一个过程地址2 - 序号/序列号(Sequense Number,SN):在一个 TCP 连贯中传送的字节流中的每一个字节都按程序编号。该字段示意本报文段所发送的数据的第一个字节的序号。初始序号称为 Init Sequense Number, ISN(序号/序列号这个字段很重要,大家留个印象,下文会具体解说)例如,一报文段的序号是 101,共有 100 字节的数据。这就表明:本报文段的数据的第一个字节的序号是 101,最初一个字节的序号是 200。显然,下一个报文段的数据序号该当从 201 开始,即下一个报文段的序号字段值应为 201。 ...

February 3, 2021 · 3 min · jiezi

关于面试:前端常见面试题框架部分五

1.vue相熟吗,说一下vue计算属性与监听属性的区别? computed 计算属性在数据未发生变化时,优先读取缓存,只有在相干的数据发生变化时才会扭转要计算的属性。 watch 监听属性会实时监听数据变动,数据每次有变动都去执行函数。 举个例子 1. <div id="app"> 2. <input type="text" v-model="firstName"> 3. <input type="text" v-model="lastName"> 4. <input type="text" v-model="fullName"> 5. </div> 6. <script> 7. new Vue({ 8. el: '#app', 9. data: { 10. firstName: 'Micheal', 11. lastName: 'Jackson', 12. fullName: 'Micheal Jackson' 13. }, 14. watch: { 15. firstName: function (val) { 16. this.fullName = val + ' ' + this.lastName 17. }, 18. lastName: function (val) { 19. this.fullName = this.firstName + ' ' + val 20. } 21. }, 22. computed:{ 23. fullName:function(){ 24. return this.firstName + " " +this.lastName; 25. } 26. } 27. }) 28. </script> 在此案例中,如果fullname扭转并不会触发计算属性的执行,只有当fullname中监测的firstname或lastname其中之一扭转时才会触发;而监听属性,当监听的属性扭转时就会触发。 ...

February 3, 2021 · 3 min · jiezi

关于面试:前端常见面试题总结ajax部分四

1.碰到过跨域问题吗,个别跨域问题是怎么解决的? 浏览器都有一个“同源策略”限度,限度了ajax的申请同源策略:示意申请的协定,域名,端口号雷同,就是同源,ajax只能拜访同源的申请。 同源策略的限度: ajax只能申请同源的地址js只能获取同源的cookie及本地存储js只能操作同源的dom同源策略的限度,使网络之间互相拜访的安全性失去了进步。 办法一:jsonp跨域 原理:尽管同源策略限度了ajax的跨域申请,然而并没有限度标签上的src 和href拜访不同域下的资源,jsonp就是利用了这一点。 1. $.ajax({ 2. url: "http://www.kugou.com/yy/index.php?r=play/getdata&_=1497972864535", 3. dataType: 'jsonp', //设置dataType为jsonp 4. data:{hash: "ECB956D9AD23EC123617F63EC6E90A7F",album_id:"1008922"}, //url前面的参数 5. success: function (data) { 6. console.log(data); 7. } 8. }); 办法二: 批改响应头 Cross-Origin Resource Sharing(CORS)跨域资源共享是一份浏览器技术的标准,与 JSONP 不同,CORS 除了 GET 要求办法以外也反对其余的 HTTP 要求。服务器个别须要减少如下响应头的一种或几种: 1. //设置跨域拜访的中间件 2. router.all('*', function(req, res, next) { 3. res.header("Access-Control-Allow-Origin", "*"); //容许所有的外来地址 都能够拜访 4. res.header("Access-Control-Allow-Headers", "X-Requested-With");//查看是不是ajax拜访 5. res.header("Access-Control-Allow-Methods", "POST,GET");//容许申请的办法是post 和get 6. res.header("Content-Type", "application/json;charset=utf-8");//设置响应的头部 7. next(); 8. }); 除此之外还有:window.name+iframe的形式, window.postMessage()的办法,批改document.domain跨子域等办法。 ...

February 3, 2021 · 2 min · jiezi

关于面试:前端常见面试题总结ES6部分三

1.es6相熟吗,说几个es6的新增办法 (1)新增申明命令let和const 在es6中通常用 let 和 const 来申明,let 示意变量、const 示意常量。 特点: let 和 const 都是块级作用域。以{}代码块作为作用域范畴 只能在代码块外面应用。不存在变量晋升,只能先申明再应用,否则会报错。在代码块内,在申明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。在同一个代码块内,不容许反复申明。const申明的是一个只读常量,在申明时就须要赋值。(如果 const 的是一个对象,对象所蕴含的值是能够被批改的。形象一点儿说,就是对象所指向的地址不能扭转,而变量成员是能够批改的。)(2)模板字符串(Template String) 用一对反引号(`)标识,它能够当作一般字符串应用,也能够用来定义多行字符串,也能够在字符串中嵌入变量,js表达式或函数,变量、js表达式或函数须要写在${ }中。 var str = `abcdefgh`;console.log(str);let name = "小明";function a() { return "ming";}console.log(我的名字叫做${name},年龄${17+2}岁,性别${'男'},游戏ID:${a()});(3)函数的扩大 函数的默认参数ES6为参数提供了默认值。在定义函数时便初始化了这个参数,以便在参数没有被传递进去时应用。 function A(a,b=1){ console.log(a+b);}A(1); //2A(2+3); //5箭头函数 在es6中,提供了一种简洁的函数写法,咱们称作“箭头函数”。 写法:函数名=(形参)=>{……}     当函数体中只有一个表达式时,{}和return能够省略,当函数体中形参只有一个时,()能够省略。 特点:箭头函数中的this始终指向箭头函数定义时的离this最近的一个函数,如果没有最近的函数就指向window。 //省略写法var people = name => 'hello' + name;var getFullName = (firstName, lastName) => { var fullName = firstName + lastName; return fullName;} (4)对象的扩大 属性的简写。ES6 容许在对象之中,间接写变量。这时,属性名为变量名, 属性值为变量的值。var foo = 'bar';var baz = {foo}; //等同于 var baz = {foo: foo};办法的简写。省略冒号与function关键字。var o = { method() { return "Hello!"; }};// 等同于var o = { method: function() { return "Hello!"; }};Object.keys()办法,获取对象的所有属性名或办法名(不包含原形的内容),返回一个数组。var obj={name: "john", age: "21", getName: function () { alert(this.name)}};console.log(Object.keys(obj)); // ["name", "age", "getName"]console.log(Object.keys(obj).length); //3console.log(Object.keys(["aa", "bb", "cc"])); //["0", "1", "2"]console.log(Object.keys("abcdef")); //["0", "1", "2", "3", "4", "5"]Object.assign (),assign办法将多个原对象的属性和办法都合并到了指标对象下面。能够接管多个参数,第一个参数是指标对象,前面的都是源对象。var target = {}; //指标对象var source1 = {name : 'ming', age: '19'}; //源对象1var source2 = {sex : '女'}; //源对象2var source3 = {sex : '男'}; //源对象3,和source2中的对象有同名属性sexObject.assign(target,source1,source2,source3);console.log(target); //{name : 'ming', age: '19', sex: '男'}(5)for...of  循环 ...

February 3, 2021 · 3 min · jiezi

关于面试:前端常见面试题总结JavaScript部分二

1.如何对一个数组进行去重/排序? 去重: 除了罕用的双重循环,还有两种办法 办法一:遍历该数组,利用indexOf()办法判断新数组中是否存在,不存在就push到新驻足中,代码如下: 1. var arr = ['a', 'b', 'b', 'c', 'c', 'd']; 2. var newArr = []; 3. for (var i = 0; i < arr.length; i++) { 4. if (newArr.indexOf(arr[i]) == -1) { 5. newArr.push(arr[i]); 6. } 7. } 办法二:通过es6中的set数据结构,对数组去重 1. var setNum = new Set(arr); 2. Array.from(setNum); 4. //或者用rest参数 5. [...setNum]  排序: 办法一:利用数组的sort()办法排序,如果调用该办法时没有应用参数,是依照字符编码的程序进行排序,并不是数字大小排序。 1. var arr = [5, 1, 3, 6, 8, 12]; 2. arr.sort(); //[1, 12, 3, 5, 6, 8] 4. arr.sort(function (a, b) { 5. return a - b; 6. }); 7. console.log(arr); //[1, 3, 5, 6, 8, 12]  办法二:双重循环,冒泡排序 ...

February 3, 2021 · 3 min · jiezi

关于面试:阿里终面谈谈微服务架构之服务注册中心

服务注册核心在微服务的架构中, 服务注册核心是一个外围的概念。 就像上节所讲, 服务注册核心是服务发现中不可短少的一部分。 服务注册核心, 艰深来讲, 是一个存储网络实例的网络地址和数据库, 一个服务注册核心应该是高可用的, 而且其数据是最新的。 客户端在查问服务注册核心后, 会缓存一部分网络地址的数据, 然而, 这些信息须要设置过期工夫, 因为数据会实时的发生变化。 因而, 一个服务注册核心, 应蕴含一个服务器的集群, 在这个集群中, 各个机器中的数据须要保持一致, 机器之间通过replication协定来实现这个性能。 Netflix Eureka是服务注册核心的一个很好的实例。它提供了一个用于注册和查问服务实例的REST API。服务实例应用POST申请注册其网络地位。每30秒,它必须应用PUT申请刷新注册。通过应用HTTP删除申请或实例注册超时来删除注册。客户端能够应用HTTP GET申请检索已注册的服务实例。 Netflix 通过在多个Amazon服务器上运行多个Eureka来保障服务注册核心的高可用性,每个Eureka服务器运行在一个EC2实例上, 而且具备一个可变IP地址。DNS TEXT 用于存储Eureka集群配置,这个是个映射关系,用来失去可用的Eureka服务器的网络地位列表。 当Eureka服务器启动时,它查问DNS来检索Eureka集群配置,定位它的对应节点,并为本人调配一个未应用的IP地址。 Eureka客户端通过查问DNS来发现Eureka服务器的网络地址, 客户端更偏向于拜访雷同区域的Eureka服务器, 当然, 如果没有找到服务器, 也会拜访其余区域的服务器。 其余的比拟好的服务注册核心是: etcd: 一个高可用的,分布式的,一致性key-value构造, 用于共享配置信息和服务发现, Kubernetes应用了etcd。consul: 一个发现和配置服务的工具, 提供API供注册和发现服务, 为了确保可用性, consul会执行健康检查。zookeeper: 一个被宽泛应用的分布式的高性能服务。上面探讨下服务注册核心的实现机制: 次要有两种模式: 一种是自注册模式; 另一种是第三方的注册模式。 自注册模式自注册模式,就是每个服务实例都须要负责向服务注册核心来注册和解除注册,同时, 还须要发送心跳来放弃注册信念不被过期。 Netflix OSS Eureka Client 应用了这种模式。 Eureka Client负责注册和解除注册, 在Spring Cloud工程中,向Eureka注册服务是很不便的,只须要加个注解即可@EnableEurekaClient 自注册模式的益处是: 简略,不须要其余的组件。 不过, 毛病就是: 耦合度比拟高,须要和服务注册核心适配, 应用编程语言和框架会受到限制。 第三方注册模式应用第三方的注册模式, 服务实例将不再负责间接向服务注册核心注册和解除注册, 实际上, 另外一个第三方的零碎组件来做这个注册的操作。 ...

February 3, 2021 · 1 min · jiezi

关于面试:????-别再恐惧-IP-协议万字长文-多图预警

0. 前言对我集体来说,本科的时候,除去计算机组成原理,计算机网络堪称温习难度最大的一门课,其中无穷无尽的 IP 地址的计算、子网划分、路由转发几乎就是梦靥。当初回过头来再看,其实真的不难,只不过是过后的常识体系切实太乱。???? 本篇耗时长达十几个小时,醉生梦死,置信大家看完必然有所播种。 ???? 计算机网络的细碎知识点真的是越扣越多......,本文次要解说 IP 协定相干的重要知识点,一些相对来说比拟冷门的就不再说了1. 从网络层说起家喻户晓,IP 协定属于网络层,回顾一下之前文章 一文读懂两台计算机之间是如何通信的 所说的,网络层的作用: 在计算机网络中进行通信的两个计算机之间可能会通过很多个数据链路,也可能还要通过很多通信子网。网络层的工作就是抉择适合的网间路由和替换结点, 确保数据及时传送。 艰深点来说吧,数据链路层的作用很简略,它是无脑的,只负责在两个相邻节点之间传送数据,它并不知道它所传送的数据最终目的地是哪。而网络层便是它的大脑,网络层负责指定源地址和目标地址,并通知数据链路层该走哪条路线。上面这张图能够说是十分形象了 ????: 运输层交付给网络层的数据格式是 TCP/UDP 报文段,那么网络层会将这些报文封装成 IP 数据报交付给数据链路层。在之前的文章中咱们说过,每个数据链路上会规定一个最大传输单元 MTU,如果 IP 数据报的长度超过 MTU,那么网络层就会把这些报文宰割成一个一个的小组(分组)进行传送。数据链路层收到 IP 数据报之后将其封装成帧。 为什么网络层的传输单元(协定单元)称为 IP 数据报呢?那是因为在 TCP/IP 体系结构中,网络层应用 IP 协定,因而称为 IP 数据报 ,简称数据报。上面咱们就来具体解说 IP 协定 ???? 2. 什么是 IP 协定IP 协定是整个 TCP/IP 协定族的外围,也是形成互联网的根底,位于 TCP/IP 模型的网络层。 IP 协定用于屏蔽上层物理网络的差别,为下层提供对立的 IP 数据报。 ⭐ IP 协定提供无连贯的、不牢靠的、尽力的数据报投递服务: 1)无连贯的投递服务 发送端可于任何时候自在发送数据,而接收端永远不晓得本人会在何时从哪里接管到数据。每个 IP 数据报独立解决和传输, 一台主机收回的数据报序列,可能会走不同的门路, 甚至有可能其中的一部分数据报会在传输过程中失落 2)不牢靠的投递服务 IP 协定自身不保障 IP 数据报投递的后果。 在传输的过程中,IP 数据报可能会失落、反复、提早和乱序等, IP 协定不对内容作任何检测,也不将这些后果告诉收发单方 ...

February 2, 2021 · 5 min · jiezi

关于面试:重点Java大厂面试10个知识点汇总

本文收录在猪哥GitHub:https://github.com/pig6/Java 中,本我的项目收集一线大厂面试、实战、Java学习路线等。本篇笔记是我五年来的工作学习面试教训&记录,心愿对大家有一些帮忙 一、java根底Object类的所有办法:getClass hashCode equals clone toString notify notifyAll wait finalize八种根本数据类型&取值范畴主动拆装箱&包装类型的缓存机制ThreadLocal 了解String&不可变性 StringBuffer StringBuilder源码ArrayList LinkedList HashMap(重点,能够花一天工夫彻底把握) LinkedHashMap TreeMap HashSet LinkedHashSet TreeSet源码异样体系结构Java8:了解函数式编程 流式操作 CompletableFuture二、并发编程必考,高并发的解决必要伎俩,对于juc以及线程模型的演进过程的把握十分重要 了解并发与并行线程池的原理:了解每个参数Thread Runnable CallableAQS(重要:经常会配合synchronized来说) ConditionLock:ReentrantLock ReentrantReadWriteLockSemaphore CountDownLatch CyclicBarrier各种AtomicConcurrentHashMap BlockingQueue CopyOnWriteArrayListExecutors线程的状态转换:wait sleep notify notifyAll join park进行线程的办法线程模型:了解BIO、NIO(重点)、AIO、理解netty并发包就那些货色,把握AQS之后其余的很快就买通了,所以不必三、jvm《深刻了解java虚拟机》没事就看一遍,每次都会有新的了解 jvm内存构造罕用调优参数gc算法gc的工具:CMS&G1重点&ZGCjava内存模型: 可见性、原子性、程序性、happens-before、内存屏障、volatile、finalsynchronized(对象头):偏差锁->轻量级锁->重量级锁、monitor、锁优化、锁打消、锁粗化、自旋锁、可重入锁常用工具以及命令类加载过程对象创立过程fullGC的排查思路工具:jps, jstack, jmap、jstat, jconsole, jinfo, jhat, javap, Arthas四、设计模式创立型:单例模式、形象工厂模式、建造者模式、工厂模式、原型模式。结构型模式:适配器模式、桥接模式、装璜模式、组合模式、外观模式、享元模式、代理模式。行为型模式:模版办法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)、访问者模式。五、mysql上面列出来的全是重点 罕用sql以及内置函数索引 hash索引b+树的索引汇集索引&非汇集索引回表联结索引:最左前缀&笼罩索引&索引下沉事务&隔离级别&实现原理:readview undolog redolog mvcc锁的应用&锁算法&行锁&表锁&乐观锁&乐观锁连贯查问的原理(算法)binlog&应用场景分库分表:垂直&程度工具:explain六、redis《redis的设计与实现》看完这本书就行了,深入浅出,很快就可以看完和把握,间接搞定redis 纯熟五种类型对象&实用场景:字符串 列表 哈希 汇合 有序汇合理解底层数据结构:SDS 链表 字典 跳跃表 整数汇合 压缩列表淘汰策略RDB&AOF复制性能的实现Sentinel&集群的构造公布订阅&事务分布式锁常见问题&解决方案:缓存击穿,缓存穿透,缓存雪崩七、web感觉很少有人问了,应届生可能问的多些 三次握手与四次挥手http/1.0 http/1.1 http/2之间的区别http中 get和post区别了解https加密过程forward&redirect的区别CSRF&XSS攻打与防备常见的web申请返回的状态码cookie&sessionServlet&filter&listenerDNStomcat&nginx区别八、spring说实话问到我的不多,感觉把握上面几个足够了 IOC&DI&AOP把握罕用注解如何解决循环依赖事务流传机制事务生效场景springMVC的了解springboot的了解九、分布式&高可用平时多留神怎么解决好程序可能遇到的极其状况,保障服务的高可用 zookeeper 了解应用:文件系统+监听器理解选举算法&分布式锁的实现mq(重要,有时候面试官间接一串mq连环炮就能够决定要不要一个人了) 作用:异步 解耦 削峰kafka(之后会就kafka写一个系列) ...

February 2, 2021 · 1 min · jiezi

关于面试:深入浅出mysql索引总结下-一文就OK

目录汇集索引和非汇集索引 汇集索引汇集索引应用场景非汇集索引非汇集索引应用场景什么是回表笼罩索引索引生效问题索引最左匹配准则索引总结汇集索引和非汇集索引《数据库原理》外面的解释:汇集索引的程序就是数据的物理存储程序,而非汇集索引的程序和数据物理排列无关。因为数据在物理寄存时只能有一种排列形式,所以一个表只能有一个汇集索引。在SQL SERVER中,索引是通过二叉树的数据结构来形容的;咱们能够如此了解这个两种索引:汇集索引的叶节点就是数据节点,而非汇集索引的叶节点依然是索引节点,只不过其蕴含一个指向对应数据块的指针。汇集索引汇集索引中键值的逻辑程序决定了表中相应行的物理程序。 汇集索引确定表中数据的物理程序。汇集索引相似于电话簿,后者按姓氏排列数据。因为汇集索引规定数据在表中的物理存储程序,因而一个表只能蕴含一个汇集索引。但该索引能够蕴含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。 汇集索引对于那些常常要搜寻范畴值的列特地无效。应用汇集索引找到蕴含第一个值的行后,便能够确保蕴含后续索引值的行在物理相邻。 例如,如果应用程序执行 的一个查问常常检索某一日期范畴内的记录,则应用汇集索引能够迅速找到蕴含开始日期的行,而后检索表中所有相邻的行,直到达到完结日期。这样有助于进步此 类查问的性能。 同样,如果对从表中检索的数据进行排序时常常要用到某一列,则能够将该表在该列上汇集(物理排序),防止每次查问该列时都进行排序,从而节省成本。 当索引值惟一时,应用汇集索引查找特定的行也很有效率。例如,应用惟一雇员 ID 列 emp_id 查找特定雇员的最疾速的办法,是在 emp_id 列上创立汇集索引或 PRIMARY KEY 束缚。 汇集索引应用场景此列蕴含无限数目的不同值查问的后果返回一个区间的值查问的后果返回某值雷同的大量后果集非汇集索引一种索引,该索引中索引的逻辑程序与磁盘上行的物理存储程序不同。 索引是通过二叉树的数据结构来形容的,咱们能够这么了解聚簇索引:索引的叶节点就是数据节点。而非聚簇索引的叶节点依然是索引节点,只不过有一个指针指向对应的数据块。 非汇集索引指定了表中记录的逻辑程序,但记录的物理程序和索引的程序不统一,汇集索引和非汇集索引都采纳了B+树的构造,但非汇集索引的叶子层并不与理论的数据页相重叠,而采纳叶子层蕴含一个指向表中的记录在数据页中的指针的形式。 非汇集索引比汇集索引档次多,增加记录不会引起数据程序的重组。 非汇集索引应用场景此列蕴含了大量数目不同的值查问的完结返回的是大量的后果集order by 子句中应用了该列什么是回表假如,咱们有一个主键列为ID的表,表中有字段k,并且在k上有索引。 这个表的建表语句是: mysql> create table T(id int primary key, k int not null, name varchar(16),index (k))engine=InnoDB;表中R1~R5的(ID,k)值别离为(100,1)、(200,2)、(300,3)、(500,5)和(600,6),两棵树的示例示意图如下 SQL语句 select * from T where k between 3 and 5 执行过程: 在 k 索引树上找到 k=3 的记录,获得 ID = 300;再到 ID 索引树查到 ID=300 对应的 R3;在 k 索引树取下一个值 k=5,获得 ID=500;再回到 ID 索引树查到 ID=500 对应的 R4;在 k 索引树取下一个值 k=6,不满足条件,循环完结。在这个过程中,回到主键索引树搜寻的过程,咱们称为回表。能够看到,这个查问过程读了 k 索引树的 3 条记录(步骤 1、3 和 5),回表了两次(步骤 2 和 4)。 ...

February 2, 2021 · 2 min · jiezi

关于面试:深入浅出mysql索引总结上-一文就OK

目录前言索引索引罕用模型 哈希表有序数组均衡二叉树InnoDB索引模型主键索引和一般索引页决裂和页合并主键为什么倡议抉择自增主键?前言当提到mysql数据库时,脑海里本能反馈蹦出几个关键词:数据结构(B+树)、索引、事务、锁、日志等等,明天就来说一说索引那些事儿,我会把索引分为高低两集来进行论述。 可能你理解mysql索引底层采纳数据结构B+树实现的,在某个字段中建设索引,会放慢查问效率,然而在面试中是远远不够的,在这里,先抛出几个对于索引的面试题: 索引为什么应用B+树,而不应用B树,二叉搜寻树?那些数据结构能够作为索引?他们的优缺点是什么?一般索引和主键索引的区别?汇集索引和非汇集索引的区别?索引什么时候会生效,最左匹配准则是什么?索引下推理解吗?谈一谈你对回表的了解,能够举个例子吗?主键为什么倡议应用自增主键?页决裂和页合并这几个面试题都会在索引这两集中一一揭晓。第一个面试题,我在上篇文章就解答了(https://mp.weixin.qq.com/s/1sy-jLCuWgpci-56vxdiLA) 索引一句话简略的来说,索引的呈现就是为了放慢数据库的查问效率,就好比书的目录一样。 举个生存中的例子,在你眼前有一本500页的书籍,如果你想要查找某个知识点,在没有目录的状况下,你可能须要一页一页翻书查找;如果这本数据有目录性能,你只需在目录上找到对应知识点的页数即可,效率大幅度提高。同样mysql也是,索引就是他的"目录"。 索引常见模型索引的呈现为了放慢数据库的查问效率,然而索引的实现有多种形式,比方哈希表、有序数组、搜寻树、B+树。这几种数据结构比较简单但又是面试常问的问题,心愿重点关注一下。上面我会去介绍一下这几个数据结构,他们的优缺点是什么。 哈希表哈希表是对于键值对(key-value)存储的数据结构,应用起来比较简单,咱们只须要输出特定的key值就可找到对应的value值。实现起来也比较简单,通过哈希函数把key值转换成一个固定的值,作为桶位,而后将value值存储在该桶位下。 但应用哈希表作为索引数据结构的话,存在一个问题,多个key通过哈希函数的换算,会呈现同一值的状况。解决这种状况,就是在某个桶位上拉出链表进行实现,构造如下所示: 因而应用哈希表作为索引存储构造,比拟实用于只有等值查问的场景。比方Memcached 及其他一些 NoSQL 引擎。 有序数组有序数组和哈希表相比,有序数组在等值查问和区间查问场景中的性能十分优良。因为数组为有序的,因而在区间查问的时候,定位起始值和开端值即可,效率十分高。等值查问和哈希表相似,通过key值找到对应的value值。 但若应用有序数组作为索引数据结构,如果要往有序数组中插入某条记录,则须要移动该记录前面的所有记录,老本较高。 因而,有序数组索引只实用于动态存储引擎,比方你要保留的是 2017 年某个城市的所有人口信息,这类不会再批改的数据。 均衡二叉树均衡二叉树是比拟常见也是罕用的数据结构,他们的特点如下: 均衡二叉树又被称为AVL树均衡二叉树是一颗空树或者它的左右两个子树的高度差的绝对值不超过1,并且左右子树也是均衡树非叶子节点值大于左子节点值而小于右子节点值非叶子节点最多领有两个子节点 应用均衡二叉树作为索引数据结构,有几点不足之处: 思考到极其状况下,每次插入的数据都比上一次插入的数据大,那么用均衡二叉树就会以线性形式进行存储,工夫复杂度为O(n)。数据量很大时,在mysql中一张表存储百万条数据是很失常的一件事,这样会导致树的深度更深,mysql读取时耗费大量io。 mysql进行过磁盘读取时,是以页为单位进行读取,每个节点示意一页。而均衡二叉树每个节点存储一个关键词,导致存储空间被节约。 InnoDB索引模型在 InnoDB 中,表都是依据主键程序以索引的模式寄存的,这种存储形式的表称为索引组织表。InnoDB引擎默认应用B+树作为索引数据结构,所有的数据都存储在B+树中的。 每一个索引在 InnoDB 外面对应一棵 B+ 树。 B+树特点 非叶子节点中不存储data,只存储索引,能够放更多的索引叶子节点蕴含所有索引字段叶子节点蕴含数据(key和data域)和指针叶子节点用指针连贯,进步区间拜访的性能图片: 主键索引和一般索引在InnoDB引擎中,索引类型能够分为主键索引和一般索引。 假如,咱们有一个主键列为ID的表,表中有字段k,并且在k上有索引。 这个表的建表语句是: mysql> create table T(id int primary key, k int not null, name varchar(16),index (k))engine=InnoDB;表中R1~R5的(ID,k)值别离为(100,1)、(200,2)、(300,3)、(500,5)和(600,6),两棵树的示例示意图如下 从图中不难看出,依据叶子节点的内容,索引类型分为主键索引和非主键索引。 主键索引的叶子节点存的是整行数据。在 InnoDB 里,主键索引也被称为聚簇索引(clustered index)。 非主键索引的叶子节点内容是主键的值。在 InnoDB 里,非主键索引也被称为二级索引(secondary index)。 依据下面的索引构造阐明,咱们来探讨一个问题:基于主键索引和一般索引的查问有什么区别?如果语句是 select * from T where ID=500 ,即主键查问形式,则只须要搜寻 ID 这棵 B+ 树;如果语句是 select * from T where k=5 ,即一般索引查问形式,则须要先搜寻 k 索引树,失去 ID 的值为 500,再到 ID 索引树搜寻一次。这个过程称为回表。也就是说,基于非主键索引的查问须要多扫描一棵索引树。因而,咱们在利用中应该尽量应用主键查问。 ...

February 2, 2021 · 1 min · jiezi

关于面试:如何写简历才能捕获腾讯阿里HR芳心

前言魔幻的2020年曾经过来,意味着秋招告一段落了。行将迎来的便是比秋招残暴百倍的春招。春招对于大厂来说,侧重点招聘下一届毕业的暑期实习生,但也不是不招应届生学生,所以大三/研二的学生,你们该动起来了,该长点心了❤️。 如果为21届&22届的学生,能够回复【22】进入春招备战群,群里有腾讯,京东等一线公司内退人,也有国内各大高校优秀学生(22届&21届)和你一起pk大厂。应届生/实习生对于行将毕业的应届生来说,春招能够了解为秋招的补录,难度却不压于秋招的难度,可能比秋招的要求更高?这是因为公司招聘应届生的坑位无限,而大部分坑位在秋招中就放出去了。而公司进行春招,可能是人数没招够或者被放鸽子,并且春招来的快也去得快,可能本人认为还没开始,但事实上曾经完结了。所以,进行春招的应届生须要时刻关注公司招聘官网最新进度,把握好时机,你就赢了一大半。 大三/研二想进入大厂的话,春招实习可能是你的一次机会,对于大厂来说,他们更喜爱春招实习进来的学生,秋招的坑位可能会被暑期实习的学生占有,所以,春招进入大厂,最终留在大厂的概率是很大的。 在春招中,不论是应届生春招还是大三/研二春招实习生,一份好的简历是极其重要的。因为我出世背景不是很好,不是985/211名校,所以我更加重视简历的排版及其内容书写。如何进行书写,能够捕捉HR芳心? 简历书写对于简历的书写形式,可能不同的人领有不同的见解,并且不同HR/面试官都有不同的侧重点,所以在我看来,并没有一个白璧无瑕的简历。我只能分享一下我对简历的认识。 我之前加入校招的时候,简历编写也是一个头疼的中央?因而也问过很多过来人对于简历的问题,并且也让本人的学长学姐帮忙批改一下简历,明天我就依据本人的教训以及大佬们的倡议,跟大家说一下简历如何编写,能够让人眼前一亮,或者这篇文章就能够给你带来无益的参考。 最初我也会把我本人加入校招的简历模版分享进去,给你们提供一个方向,在【迈莫coding】中回复【简历】即可。简历是写一页比拟好还是越多也好?说简历之间,先答复一个问题,简历是写一页比拟好还是越多也好? 认为简历写的越多越好的人,他们可能会存在一个侥幸心理,认为我写的越多,证实我把握的常识越多,其实恰恰相反,越牛逼越顶级的大佬,可能他们的简历就几句话,比方"我写了xx我的项目,GitHub上10w Star",一句话代表他的实力。 但也不是简历越少越好,毕竟金字塔尖的人比比皆是,大多数都是普通人,那咱就按普通人的形式来肝。其实写简历在我看来,你把本人想要表白的都表达出来了,那么就能够了,但还是不倡议简历的页数超过三页,这只是集体倡议。 简历中蕴含那些货色?对于校招生来说,简历无非就是几大类:集体背景、教育背景、根底技能、我的项目经验、获奖证书、自我评估。而在这几个模块中,对于面试官而言,绝对重要也是比拟外围的是根底技能和我的项目经验。唯有这两块能够在最短的工夫内对应聘者有大略的理解,看是否可能胜任。 集体技能编写对于想进大厂的人来说,集体技能这块是比拟重要的一个点,在一面面试中就是依据你的简历所写的基础知识疯狂炮轰,看应聘者的根底如何。因为对于大厂来说,他更看重应聘者将来的可塑性,而扎实的根底,就是一个良好的证实。这时候,可能有人会问,什么是基础知识? 基础知识无非就是在大学期间所学的那些课程,比方数据结构与算法、计算机网络、操作系统、数据库、Linux、c/c++/java/go等。 在这里想多说一句,我见过好多人在集体技能这一块写到精通这一词。你想想,精通二字代表着你对你所写的知识点曾经了解地十分透彻,一个还未毕业的学生简直不太可能吧?也不排除优良顶级大佬,但大佬毕竟多数,所以倡议精通二字慎用。 在面试过程中一旦有人写精通二字,面试官铁定会疯狂炮轰,直到你答不进去为止。你答出来还好说,一旦你答不进去,你会给面试官留下一个不好的印象,原本面试官对你期待贼高,而你却没有答出来,一下子在面试官心理掉了一大截。所以面试官心理就会犯嘀咕,处于彷徨之地,那你就危险了。 所以,集体技能这一块是至关重要的,写你善于的知识点。如果你没拿的出手的经验,那么我倡议你肯定要在集体技能这一方向下功夫。我会给大家截图下我当时候校招时个人简历这一块。 我在一面面试过程中,基本上都是依据我集体技能这一块开展问的,所以你要对你写的知识点负责,不熟的或者压根没用过的连忙抹掉。在面试中,尽量取长补短,你能够疏导面试官到你比拟善于的畛域,那你拿offer就胜利一大半了,前提面试官吃你这一套。 我的项目教训编写我的项目教训这一块的话,对于校招生来说,很大公司在这方面不会对你有太大的刻薄。所以在我看来,一个我的项目最重要的不是这个我的项目有多高大尚,重要的是你从我的项目中应用了什么样的技术,解决了什么问题,播种到什么。 如果切实写不出我的项目的话,倡议花一两周工夫,找个我的项目能够跟着视频敲一边,相熟一下我的项目开发流程,从视频中学到的知识点转化为本人的常识,最初把这我的项目包转一下,作为本人的我的项目,也是一个不错的抉择。 个别状况下会在二面面试中问应聘者的我的项目教训能力,次要是想看你的coding能力,上面是我校招时我的项目教训所展现的内容。我的项目中写的技术栈肯定要有把握,俗话说的好,"不打不筹备之战"。能够给你们一个参考。 集体荣誉如果你有取得什么好的证书或者较量,那么你能够在这一专栏上写上去,比方你加入ACM较量取得区铜牌,那能够相当加分呀,校招就喜爱这ACM获奖学生????(惋惜我不配);英语六级问题不错,也能够写上去,凸显本人的语言能力。但如果四级考的个别或者四级就没过的人,不倡议裸露本人的短板。 还有就是你加入了一些社交活动,获取了一些荣誉证书,这些的话我不倡议你写上去。个别集体荣誉这一模块写的是与你面试这个岗位所匹配的证书。 最初如果你的简历写好了,那么能够依据我这篇文章看看有没有改良的中央,有责改良无则加勉。如果你还没筹备好你的简历,能够在【迈莫coding】中回复【简历】获取我的校招简历模版,让您有一个抉择的机会。 文章也会继续更新,能够微信搜寻「 迈莫coding 」第一工夫浏览。

February 2, 2021 · 1 min · jiezi

关于面试:const-声明对象或者数组可以改变吗

明天逛帖子,忽然遇到这个问题,我第一反馈是不能扭转,如果要扭转,为什么还用const定义,而后在浏览器控制台试试后果。 耶,这是什么操作啊, 而后在时候定义一个根本类型,的确是预料中的后果 那为什么const 定义的对象和数组能够扭转它的值呢? 因为对象和数组是援用类型,a中保留的仅是数组的指针,这就意味着,const仅保障指针不产生扭转,批改数组的值不会扭转对象的指针,所以是被容许的。也就是说const定义的援用类型只有指针不产生扭转,其余的不论如何扭转都是容许的。 咱们试着批改一下指针,让a指向一个新数组,后果如下图: 即便对象的内容没产生扭转,指针扭转也是不容许的。 好了,算爬出了一个坑,记录下

February 2, 2021 · 1 min · jiezi

关于面试:2021Java后端工程师面试指南引言

前言文本已收录至我的GitHub仓库,欢送Star:https://github.com/bin3923282... 种一棵树最好的工夫是十年前,其次是当初叨絮昨天跟大学同学聊天,而后它是毕业之后呢?就始终在准备考公务员,而后它刚好去年考上了,而后我就跟他聊它的备考过程,而后它也给我说了很多,跟我说他是怎么保持的,考上之后的状况,待遇啥的。而后我就在想如果我当年不写代码而是去考公务员是不是也能像他一样走向人生巅峰呢?其实不然,你就是你,且不说这个公务员到最初是不是能比我过的难受,然而每个人的路都是入地最好的安顿,如果你抉择了这行,那么便只有风雨兼程。 如何安顿本人的领有的工夫我刚好前段时间不怎么忙,而后呢,就是双休,而后我每周就会想这周要实现什么什么,然而真正到了的时候,我就会发现自己保持不上来,会忍不住把王者光荣关上(上个赛季王者xx星)而后玩起来,让本人在愧疚和短暂的高兴中温水煮青蛙,我不晓得有多少小伙伴像我一样,前面我就删了王者,然而最初还是没有用,因为我在看剧去了,所以我其实是那种晓得本人要做什么的人,并且也是违心去思考怎么去实现这些事件的人,然而我感觉短少了点执行力,而后我就思考了,为啥会这样,失去上面的论断 及时反馈,其实很多工夫咱们去学习一个货色,其实在工作中并不能马上失去反馈,而后就不能让你持续的去保持,大多数人是这种性情,那么我倡议你保持写博客学习得靠气氛,从小就是这样,对于学习就喜爱和他人一起。那么我倡议你找一群气味相投的人一起提高就好了。最初还是要本人对本人要有所布局,而后就会有我要写的这个系列文章。幸存者偏差人与人的差距到底在哪?是智商?还是情商? 大家都是同龄人为什么我还在为生存苦苦挣扎,他人就曾经实现了财务自在?明明是一个学校毕业,为什么他就能进入一个大公司有好的平台,而我还在频繁跳槽? 这些问题每个进入社会的人都会遇到过,一边想要胜利,一边常常想要放弃,到底如何能成为生存的“幸存者”? 往年咱们看到一博主,长年霸占掘金 csdn前几名,而后一年微信公众号粉丝几十万,年收入百万以上,哈哈我置信很多人猜到了是哪位大佬了,而后呢?大家就会想,哎,这写的货色也就那样呀,我也能够年入百万,而后马上开始码文章,而后过几天,发现放弃了。是不是很实在,哈哈,实在就对了,因为咱们所有的人都只看到了头部的那些人,而后都想去模拟他,可是呢?胜利是真的能够复制的嘛? 从古至今咱们素来都是只能看到英雄的胜利,却看不见胜利背地的累累白骨,因为那些失败的人没有机会站到后面就被淘汰了,所以咱们看到的就都是胜利的人。而后咱们大部分人都是属于那百分之99 保持不肯定会胜利如果你写文章的目标,是为了对标那些大佬年入百万,我置信百分之99.9是会失败的,因为概率只有百分之0.1会胜利。尽管保持不肯定会胜利,然而肯定会给你带来莫大的益处,本人也写博客一年了,基本上我会对我的每个读者倡议它去写文章,哪怕是复制转载别人的文章也好,有人说剽窃是不好的,要尊重人家的劳动成果,这个我认可,然而转载能够让你的劳动胜利可能流传的更远,这才是真正的开源精力。 上一年回顾掘金 一年的工夫,写的文章也很多了,庆幸本人保持了下来。只有还在做技术我都会坚持下去 github500多颗星星,加油!淦 为什么写 2021-Java后端工程师面试指南?什么是费曼学习法?有个故事,有一位农民父亲,他的女儿考上了清华,儿子也上了北大。有人就好奇的问他:你把两个孩子都送进名牌大学,是不是有什么绝招啊?农民淳朴的说:“我这人没什么文化,也不懂什么绝招。只是感觉孩子上学花了那么多钱,不能白花了,就让孩子每天放学回家,把老师在学校讲的内容跟我讲一遍,如果有弄不懂的中央就问孩子,如果孩子也弄不懂,就让孩子第二天问老师。这样一来,花一份的钱,教了两个人。”“奇怪的是,孩子学习的劲头特地强,哪怕是他人的孩子在里面玩的热气腾腾,他也不为所动,就这样学习成绩从小学到高中一路攀升,直到考上清华北大……”其实这位父亲所用的,就是费曼学习法,只是他没意识到而已。费曼学习法,就是以教的形式,逼迫本人盲目,甚至是开心的实现无意识的被动学习。 这个也是我写这个系列的起因,其实就是为了一边给读者们温习来让本人的常识更加的坚固,比方你看一本书,你看完之后?会很快遗记,然而如果你能总结进去,再讲给其他人听,那么你学到的货色肯定是很难遗记的。 总结的相干知识点的纲要,前期我会始终保护的,目前可能不那么全而后下面的内容,我会以总结的模式一章一章的去总结。 而后是这样的,因为作者也要筹备面试了,到时候会把面试的实战整理出来,给大家参考下,大略从2月底就会开始面的,到时候去面试的时候录个音。整顿下,给那些很久没有进来面试的同学一个理解的机会。 结尾最初的最初我想通知大家的是,尽管大部分人不能成为幸存者,然而呢?咱们是一样的,每个人都是举世无双的,胜利不是跟他人比,而是跟本人比。建设好的心态,让本人一直的学习、成长,使本人各个方面能力都能失去晋升。最终你会让本人称心的。和大家共勉 日常求赞好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是真粉。 创作不易,各位的反对和认可,就是我创作的最大能源,咱们下篇文章见 微信 搜 "六脉神剑的程序人生" 回复888 有我找的许多的材料送给大家

February 2, 2021 · 1 min · jiezi

关于面试:????-如何写前端简历能敲开字节跳动的大门

本文由字节跳动-根底工程-APM团队单干编写,咱们负责开发字节跳动的性能监控平台,还须要很多(10 个以上)优良的同学来一起共建。 往年咱们组打算建设一个字节跳动招聘社群,如果你对退出字节跳动感兴趣的话,咱们能够一起进行面试相干的答疑、评估简历、聊聊面试的故事、并且在你筹备好的时候随时帮你内推。 间接加 sshsunlight,备注「面试」,或者发送简历到 shanshihao@bytedance.com 或者在这个仓库里理解详情:https://github.com/sl1673495/bytedance-apm-group 前言魔幻的 2020 年曾经过来,金三银四很快就要到来,不少小伙伴开始思考跳槽的事件。 咱们也收到了不少的简历,有一部分同学技术很强,然而却不晓得如何写出一份可能吸引面试官的简历,导致在简历筛选的过程中就被淘汰了,十分惋惜。 这篇文章的目标,就是帮忙你理解:怎么样的一份简历能够更容易通过面试官的筛选。 适用人群:社招、校招、实习????实用指标:进入大厂???? 本篇文章会从一下几个角度切入,教你成为一个优良的“简历工程师”。(???? 玩笑而已,实力最重要) 不同阶段的工程师别离应该有一份怎么的简历如何布局简历构造如何防止简历中的“坑”如何优化简历的细节优良简历的片段摘选不同阶段的简历校招 -1 年这个阶段还属于成长期,更须要看重的是你的根底和激情。对于 JS 根底,计算机根底,网络通信,算法等局部的要求会绝对高一些。毕竟这个阶段比拟难考查你的业务我的项目中的积淀,所以只能从根底局部动手考查。 在学校学习,或是利用网络上的各种材料坚固本人的根底,是这个阶段的要害。在简历里用各种形式展现出你对前端的激情,让面试官看到你的后劲。多去理解社区前沿技术,关注国内外的各种技术趋势。尝试本人写一些小我的项目,或者是参加社区开源的我的项目。开始记录本人的技术博客,尝试费曼学习法,用输入倒逼你的输出。1 年 - 4 年这个阶段一般来说是向着独当一面的工程师倒退。也是十分要害的一个期间,防止一年的教训用三年。 社区里对于进阶的材料和路线有很多,平时多关注一下,补齐本人的基础知识。平时罕用的框架进阶一步去应用,比方它的一些高级用法是否有所把握,有没有试着去理解它的原理实现。日常的业务开发中不局限于实现性能,是否有去思考我的项目构造如何设计,如何封装根底工具,根底组件如何设计、开发、共享。在日常的业务开发中有没有去思考团队提效的形式,比方: 接入 eslint、prettier 等代码测验、格调对立的插件。工程化的角度思考本地开发的提效,如何去进行 webpack 构建的优化,最近社区 esbuild 很火,尝试去接入一下。vite 和 snowpack 的思路很赞,能不能在新我的项目中使用起来等等……平时如果常常有多我的项目开发的需要,整顿出差别和对立的局部,建设团队外部的脚手架防止重复劳动。尝试搭建CI / CD 平台,尝试搭建npm 私服保护本人公司外部的通用包。锤炼你的软技能,沟通合作也是很重要的一项能力。通过思考业务实在需要砍掉多余的需要,协调各个角色一起推动指标,也是高级工程师很重要的技能。以咱们 APM 团队(Application Performance Monitor)为例,咱们的业务就是性能监控相干。那么你在日常的业务中有没有关注过网站的性能指标,是否尝试过调研、接入开源的性能监控平台,是否理解性能监控 sdk 的一些原理,这些都会让咱们感觉你和团队的符合度很高,当然这不是必要的,在其余方面亮眼的经验会让咱们感觉你的学习能力足够 cover 这些。4 年以上走到这个阶段,可能就往技术专家或者治理的方向后退了。咱们心愿你能够把握某(多)个具体产品或者技术方向的研发工作,独立负责一个复杂度高的我的项目,并冲破其中的关键技术。 你须要具备相当的产品视线和技术深度,须要站在更宏观的角度来看问题,也须要具备肯定的跨团队合作能力;可能制订所负责方向的产品和技术布局,并推动落地,同时在研发效率、品质、资源使用率、产品渗透率等方面有肯定的进步。 如何负责技术调研,是否关注行业前沿趋势,依据不同场景抉择最优的技术计划,能不能有拍板决定的能力和气魄。技术教训是否丰盛,有没有相当的技术储备,参加过的我的项目类型多吗,遇到的艰难都是如何解决,是否有积淀出一套本人的办法?回绝一年的教训重复使用。产品上是否能帮助甚至主导业务指标的制订,并依据业务指标划分工作,指定排期,正当的推动我的项目达到预期成果。是否带过团队,或者是合作过跨团队我的项目,带团队有什么心得,能协调解决团队成员情绪问题吗,成员技能散布不均衡等问题如何解决。如何打造一个有技术气氛的团队,不局限于本人晋升技术,而是帮忙团队独特成长。如何布局简历构造通常来说,简历构造最好遵循肯定法则。一个容易突出亮点,浏览敌对的简历构造能够是这样的: 个人信息劣势总结工作经验我的项目经验个人信息简洁明了即可,包含你的: 姓名、电话邮箱:最好不要是 QQ 邮箱。学校:可选,如果你的学校还不错,能够间接列出,否则放在简历最初即可,记得写分明退学和离校工夫哦。目前任职公司:可选,如果你目前的公司还不错,能够放这里,否则放在工作经验即可,简历中的工作经验肯定要保障残缺哦。对将来团队或者业务方向的冀望:可选,如果对本人将来的布局比拟明确,篇幅较长的话,甚至能够单开一个章节好好聊聊,这阐明你是一个对将来布局很清晰的人照片:可选,这个须要你本人判断是否对你的简历有加分 ????,留神参考简历中的照片怎么抉择?劣势总结很多人漏掉了劣势总结这一步,个人信息写完就开始急急忙忙的介绍本人的我的项目。 但大厂的 HR 一天可能要看上百份简历,要一个个的从候选人的我的项目形容中找到你的技术栈和亮点,是不太事实的一件事件。 在个人信息上面附上一段劣势介绍,是很容易加分的。 举个简略的社招工程师的例子,并不是说以下这些你都要有,依据集体状况参考即可,最好是每一项都能够列出简略的相干成就: ???? 相熟以下类型我的项目的开发: PC Web、小程序、Electron 桌面客户端利用、React Native 开发原生利用。 陈说本人用过的技术类型,第一工夫表白你能够做什么事件。让 HR 第一眼看到技术匹配度,最好和投递的职位要求联合起来。???? 相熟React / Vue / Angular技术栈,成就如:搭建了 React 后盾零碎,设计了权限管理体系。 ...

February 1, 2021 · 1 min · jiezi

关于面试:TCP总结TCP-三次握手和四次挥手

越致力,越侥幸, 本文已珍藏在GitHub中JavaCommunity, 外面有面试分享、源码剖析系列文章,欢送珍藏,点赞 https://github.com/Ccww-lx/Ja...TCP简介为什么须要 TCP 协定?TCP 工作在哪一层?IP 层是「不牢靠」的,它不保障网络包的交付、不保障网络包的按序交付、也不保障网络包中的数据的完整性。 OSI 参考模型与 TCP/IP 的关系 如果须要保障网络数据包的可靠性,那么就须要由下层(传输层)的 TCP 协定来负责。 因为 TCP 是一个工作在传输层的牢靠数据传输的服务,它能确保接收端接管的网络包是无损坏、无距离、非冗余和按序的。那么TCP是什么呢? 什么是 TCP ?TCP 是面向连贯的、牢靠的、基于字节流的传输层通信协议。 面向连贯:肯定是「一对一」能力连贯,不能像 UDP 协定 能够一个主机同时向多个主机发送音讯,也就是一对多是无奈做到的;牢靠的:无论的网络链路中呈现了怎么的链路变动,TCP 都能够保障一个报文肯定可能达到接收端;字节流:音讯是「没有边界」的,所以无论咱们音讯有多大都能够进行传输。并且音讯是「有序的」,当「前一个」音讯没有收到的时候,即便它先收到了前面的字节曾经收到,那么也不能扔给应用层去解决,同时对「反复」的报文会主动抛弃。其中,面向连贯意味着两个应用 TCP 的利用(通常是一个客户和一个服务器)在彼此替换数据之前必须先建设一个 TCP 连贯。 在一个 TCP 连贯中,仅有两方进行彼此通信。而字节流服务意味着两个应用程序通过 TCP 链接替换 8bit 字节形成的字节流,TCP 不在字节流中插入记录标识符。对于可靠性,TCP 通过以下形式进行保障: 数据包校验:目标是检测数据在传输过程中的任何变动,若校验出包有错,则抛弃报文段并且不给出响应,这时 TCP 发送数据端超时后会重发数据。对失序数据包重排序:既然 TCP 报文段作为 IP 数据报来传输,而 IP 数据报的达到可能会失序,因而 TC P报文段的达到也可能会失序。TCP 将对失序数据进行从新排序,而后才交给应用层。抛弃反复数据:对于反复数据,可能抛弃反复数据。应答机制:当 TCP 收到发自 TCP 连贯另一端的数据,它将发送一个确认。这个确认不是立刻发送,通常将推延几分之一秒。超时重发:当 TCP 收回一个段后,它启动一个定时器,期待目标端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。流量管制:TCP 连贯的每一方都有固定大小的缓冲空间。TCP 的接收端只容许另一端发送接收端缓冲区所能接收的数据,这能够避免较快主机以致较慢主机的缓冲区溢出,这就是流量管制。TCP 应用的流量控制协议是可变大小的滑动窗口协定。那么TCP的结构是怎么样的呢? TCP头部格局咱们先来看看 TCP 头部格局: 序列号:在建设连贯时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。 ...

February 1, 2021 · 3 min · jiezi

关于面试:1202年最新最详细最全的synchronized知识详解

synchronized详解前言艰深:造成线程平安问题的次要诱因有两点: 存在共享数据(也称临界资源)存在多条线程独特操作共享数据学术:造成线程平安问题的次要诱因有两点: 主内存和线程的工作内存而导致的内存可见性问题,重排序导致的问题,须要晓得happens-before规定。当存在多个线程操作共享数据时,须要保障同一时刻有且只有一个线程在操作共享数据,其余线程必须等到该线程解决完数据后再进行,这种形式的名称叫·互斥锁,也就是说当一个共享数据被以后正在拜访的线程加上互斥锁后,在同一个时刻,其余线程只能处于期待的状态,直到以后线程处理完毕开释该锁。 关键字 synchronized能够保障(1)在同一个时刻,只有一个线程能够执行某个办法或者某个代码块(次要是对办法或者代码块中存在共享数据的操作),(2)synchronized保障一个线程的变动(次要是共享数据的变动)被其余线程所看到(保障可见性,齐全能够代替Volatile性能)也就是happens-before规定。 标注:在学习中须要批改的内容以及笔记全在这里 www.javanode.cn,谢谢!有任何不妥的中央望纠正 synchronized次要形式synchronized关键字最次要有以下3种利用形式,上面别离介绍 润饰实例办法,作用于以后实例加锁,进入同步代码前要取得以后实例的锁润饰静态方法,作用于以后类对象加锁,进入同步代码前要取得以后类对象的锁润饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要取得给定对象的锁。synchronized应用作用于实例办法所谓的实例对象锁就是用synchronized润饰实例对象中的实例办法,留神是实例办法不包含静态方法 public class AccountingSync implements Runnable{ //共享资源(临界资源) static int i=0; /** * synchronized 润饰实例办法 */ public synchronized void increase(){ i++; } @Override public void run() { for(int j=0;j<1000000;j++){ increase(); } } public static void main(String[] args) throws InterruptedException { AccountingSync instance=new AccountingSync(); Thread t1=new Thread(instance); Thread t2=new Thread(instance); t1.start(); t2.start(); t1.join(); t2.join(); System.out.println(i); } /** * 输入后果: * 2000000 */}咱们应该留神到synchronized润饰的是实例办法increase,在这样的状况下,以后线程的锁便是实例对象instance,留神Java中的线程同步锁能够是任意对象。 这里咱们还须要意识到,当一个线程正在拜访一个对象的 synchronized 实例办法,那么其余线程不能拜访该对象的其余 synchronized 办法,毕竟一个对象只有一把锁,当一个线程获取了该对象的锁之后,其余线程无奈获取该对象的锁,所以无法访问该对象的其余synchronized实例办法,然而其余线程还是能够拜访该实例对象的其余非synchronized办法,当然如果是一个线程 A 须要拜访实例对象 obj1 的 synchronized 办法 f1(以后对象锁是obj1),另一个线程 B 须要拜访实例对象 obj2 的 synchronized 办法 f2(以后对象锁是obj2),这样是容许的,因为两个实例对象锁并不同雷同,此时如果两个线程操作数据并非共享的,线程平安是有保障的, ...

February 1, 2021 · 5 min · jiezi

关于面试:一文读懂两台计算机之间是如何通信的

前言计算机网络的知识点十分芜杂且琐碎,非常容易让人产生畏惧心理。其实计网通篇钻研的外围就是不同计算机之间的通信过程,???? 本文将从小白的角度,解说两台计算机之间是如何准确的找到对方的地位并发送和接管音讯的,以帮忙读者从宏观角度把握计算机网络的体系结构。 五层协定参考模型所谓通信协议就是通信单方都必须要恪守的通信规定。如果没有网络通信协定,计算机的数据将无奈发送到网络上,更无奈达到对方计算机,即便可能达到,对方也未必能读懂。有了通信协议,网络通信才可能产生。 个别咱们用五层协定参考模型来进行计算机网络的学习: 应用层运输层网络层数据链路层物理层上述各层的作用会在下文具体解说,咱们首先要明确为什么要分层: 协定的实现是很简单的。因为协定要把人读得懂的数据,如网页、电子邮件等加工转化成能够在网络上传输的信号,须要进行的解决工作十分多。 两个零碎中实体间的通信是一个十分复杂的过程。为了缩小协定设计和调试过程的复杂性,网络协议通常都按结构化的档次形式来进行组织,每一层实现肯定性能,每一层又都建设在它的上层之上。不同的网络协议,其层的数量、各层的名字、和性能不尽相同。 ???? 也就是说,每一层都是在下一层的根底上,通过层间接口向上一层提供肯定的服务,而把 “这种服务是如何实现的” 细节对下层加以屏蔽。 ❓ 那么,咱们将一个大型网络体系分成了若干个层,各个层之间是如何进行通信的呢? 1)对等层之间通信(不同开放系统中的雷同档次之间的通信,对等层实体之间的信息替换):OSI 规范为每一层的通信都严格定义了 协定数据单元 PDU的格局。 对等层之间的通信是目标,对等层实体的合作保障该层性能和服务的实现2)相邻层之间通信(相邻的上上层之间的通信,属于部分问题):相邻层之间的通信是伎俩,保障对等层实体之间的通信得以实 施⭐ 假如网络协议分为若干层,那么 A、B 两节点通信,理论是节点 A 的第 n 层与节点 B 的第 n 层进行通信,故协定总是指某一层的协定,例如物理层协定、传输层协定、应用层协定。每一相邻层协定间有一接口,上层通过该接口向上一层提供服务。 物理层两台计算机之间要进行通信,必然须要传输介质/物理媒介来连贯两台计算机,这样,咱们能力把数据传输过来。传输介质分为: 导向型传输介质:非导向型传输介质:⭐ 也就是说,物理层的作用就是实现计算机之间的数据传送,这个数据其实是比特流,物理层须要尽可能屏蔽掉具体传输介质和物理设施的差别, 使其下面的数据链路层不用思考网络的具体传输介质是什么,即实现比特流的通明传输。 数据链路层物理层只是简略的把计算机连接起来并在下面传输比特流,它还是存在着很多问题的: 1)物理连贯是有过错和不牢靠的2)物理设施之间可能存在传输速度不匹配问题也就是说仅仅靠物理层是无奈保障数据传输的正确性的。 ⭐ 这样,数据链路层的次要作用就是增强物理层传输原始比特流的性能,将物理层提供的可能出错的物理连贯革新成为逻辑上无差错的数据链路,使之对网络层体现为一条无差错的链路。在物理层提供服务的根底上,数据链路层还肩负着为网络层提供服务的责任,其最根本的服务是将来自网络层的 IP 数据报封装成帧,牢靠的传输到相邻结点的指标网络层。 ① 封装成帧首先理解一下为什么须要封装成帧:后面说了,物理层它只是简略的把计算机连接起来并在下面传输比特流(0、1 序列),如果这些 0,1 组合的传送毫无规定的话,计算机是解读不了的。因而,咱们须要制订一套规定来进行 0、1 的传送,让计算可能读懂这些序列。 ⭐ 封装成帧就是:发送端的数据链路层接管到下层网络层传过来的 IP 数据报后,在其前后局部增加首部、尾部,这样就形成了一个帧。接收端在收到物理层上交的比特流后,就能依据首部和尾部的标记,从收到的比特流中辨认帧的开始和完结。 把一台计算的的数据通过物理层和链路层发送给另一台计算机,到底是谁发给谁的,计算机与计算机之间如何辨别,你总得给他们一个惟一的标识吧? 于是,MAC 地址呈现了 ???? ② MAC 地址MAC 地址就是链路层地址,长度为 6 字节(48 位),用于惟一标识网络适配器(网卡)。计算机之间的数据传送,就是通过 MAC 地址来惟一寻找、传送的。 一台主机领有多少个网络适配器就有多少个 MAC 地址。例如笔记本电脑普遍存在无线网络适配器和有线网络适配器,因而就有两个 MAC 地址。 ...

February 1, 2021 · 2 min · jiezi

关于面试:职场-3天准备5天面试跳槽完成

为什么跳槽?大饼吃多了太撑,想进来走走。01从想到职到提出到职,思考了半个月,至于跳槽的起因,曾经有出名互联网大佬给出过精辟解答,这里不反复说了; 到职手续办理好之后,劳动了几天工夫,而后筹备简历和抉择公司,在以后这个阶段和待业环境下,心里的确有点犯毛躁,不过选好的河就大胆的去趟,这就是生存该有的样子。 上面聊聊整个跳槽过程和面试相干的问题,首先说下跳槽的整体状况,从到职到劳动完结开始算起话,打算是两周内实现跳槽,过后的构想是这样: 第一周:劳动的时候思考好本人想去的公司,周三筹备好简历,周四看看JDK必问试题,周五给动向公司投去简历,周末理解一下将要面试公司的根底业务;如果第二周动向公司面试失败,就海投筹备再面一周; 第二周:本周面的都是动向公司,大略面了11家公司,收到了三份offer,也都是本人中意的公司,这样跳槽就完结,最初就抉择一家公司持续搬砖的节奏,第三周的打算齐全落空; 下面就是整个到职和跳槽的整体状况,而后来说说具体的面试过程,心愿给筹备跳槽的敌人一些参考。 02到职后的第一周,次要是劳动和面试的筹备工夫,而后就是浏览本人想要跳槽的公司,筹备好简历,在周四周五两天给想去的公司投简历或者发邮件。尽管这段时间是打算劳动的,然而筹备的事件还是很多。 寻找动向公司:每个程序员都有本人中意的几家公司,可能是大公司或者一些崛起的小厂,找好本人想去的公司,并且相熟相干业务和网上的风评,这样给面试的时候留个话题。 筹备简历:简历是最要害的,用来介绍本人的相干学历信息,技能展现,以及工作经验和教训,最初做好PDF格局的简历,防止不同电脑下的简历打不开或者格局凌乱。 面试题筹备:程序员跳槽的最大麻烦就是要筹备面试题,这个没什么须要多说的,在工作4-5年这个阶段,根本不会被问框架的大问题,更偏重细节和难点问题的解决思路,所以这些不必适度筹备,就看了JVM的执行周期和并发编程相干的内容,这两个方面问题说分明根本不会再问JDK底层原理。 扫视本人:这是集体认为最重要的一个过程,看清本人业务教训和编程技能,尤其是本人写的简历内容,要晓得面试官的发问除了JDK底层原理,其余问题根本都是依据简历形容发问,所以换位思考一下,如果拿本人的简历发问,会问出哪方面的问题,而后本人再构思好如何答复,这样真到面试的时候不会呈现缓和情绪,如果你对本人的认知足够分明,不出意外的话本人构思的问题肯定会被面试官问到。 出于对本人的工作教训的把握,过后依据本人的简历内容构思好如下几个方面问题的答复思路:1.分布式应用的难点和细节;2.微服务模式下事务组件和原理;3.异步流程的注意事项;4.海量数据的治理思路和不同业务场景存储选型;5.开发中遇到的难点问题解决思路;6.JDK底层的JVM虚拟机执行周期;从起初的面试过程看,不论是阿里快手等大厂,还是面试的几家小厂,技术问题根本都是问这几个,过后看本人的简历时,感觉也就问这几个问题适合了。 投递简历:集体的打算是先面本人中意的公司,抉择在第一周最初给这批公司投去简历,周末接到的第一个面试机会竟然是支付宝,几轮面试下来几乎是难尽一言。倡议对于收到面试邀请的公司要疾速相熟一下对方的业务和简略的状况,这是少数HR和管理者喜爱问的内容,能够留个不错的印象。 03大抵流程 劳动和筹备一周之后,就正式开始面试,每天至多面试3家,有家公司面试到早晨10点完结,那感觉几乎是细品柠檬味酸透心,不必诧异早晨面试的状况,真的是很常见的操作。当初阶段的面试,公司对入职者更加审慎,所以根本不会间接发offer下来,抉择是双向的,求职者拿多个offer要衡量一下,公司对多个面试者也须要斟酌一下再抉择,根本都是面试完结后2-3天的思考工夫才会有最终后果。 没折腾完这个流程,很难收到最终的offer邮件,确实很闹心不过这就是职场,如果有其余公司卡offer工夫节点,也能够提前和本人中意的公司沟通,放慢面试的流程,这里齐全没必要怂或者感觉难堪。本人过后因为拿到offer,支付宝的面试流程还没走完,就间接电话和过后的面试官沟通,提后面了第三轮,然而难度过大,间接凉凉了。 技术面试 现场面的首轮十分重要,通常是由架构师或者服务端主管来面,次要还是技术问题居多,给第一位面试官留下足够好的印象,会让你接下来的面试难度升高。首轮技术面根本都是围绕简历内容:理解之前工作教训业务模式和相干技术选型,以及相干业务难点解决方案,这是一大块;另一块就是本人在简历上列举的技术栈,联合我的项目的具体利用场景;最初就是JDK底层会有2-3个问题,无非就是容器,并发,JVM的内容;基本面到这里没有问题,就差不多完结了。 有的公司间接给你二轮技术面的机会,有的公司可能会让你回去等告诉,毕竟技术负责人的工夫的确须要协调,不可能随时有空来面试,技术二面根本都是技术负责人来面: 如何猜想可能的发问,你须要判断该公司是技术型公司,还是业务型公司,不同的类型的业务其部门负责人的关注方向天然不一样,技术二面的问题通常不会很偏业余技术或者业务,问题答复的空间很大,须要思路清晰并且言之有理,这个真的须要本人了解,当然不排除遇到技术型负责人,例如下面说的支付宝三面,被问理屈词穷,集体感觉二面个别考验人的思维和事物的认知程度,难度会比一面要简略一些。在二面中如果相熟过该公司的业务,也能够提出来简略沟通一下作为加分项,薪水问题也会在这里做个初步交换,面试的最初能够问下该公司的技术栈选型,后续如果拿到offer,也能够提前相熟一下,防止刚入职时慌手慌脚。 根本两轮技术面决定这家公司能给你开多少薪水,之后就会把技术面试的后果转到HR部门,由HR部门做音讯同步,如果技术面试HR重点沟通薪水问题。 人事部HR面 首先必须要阐明一点,并不是后面两轮面试通过,就能拿到适合本人的薪水和offer邮件,和HR的面试对薪水的影响很大,HR面根本没有什么须要提前思考的,根本就是有套路性的闲聊,相熟一下性情三观等,所以放松且自信的有说有笑就好,也能够多问一些公司的状况,这是一个双向对话,不是单方面被发问。 最初HR会给到一个薪水线,而后通常给1-2天的思考工夫,如果对这个薪水不称心,这里也能够给出本人的薪水线,这取决你本人对整个面试过程的把握,如果面试过程顺利,该公司也对你体现出很大的好感,就自信大胆的沟通就好,不会因为薪水问题间接回绝的,后续思考两天才会有最终后果。 最初就是思考后明确薪水的事,如果薪水没有问题,邮件offer也就根本当天就发了。 04对面试过程的问题做个简略总结,给大家一个参考,留神这里针对【4-5年】的工作教训,同时也受到工作教训的影响,不同阶段的面试问题必定是不一样的: 这是公司考查一个求职者的基本思路,从面试过程就能分明的感觉到。 业务能力:通常是面试最开始的发问,难度不大,都是对于之前接触的业务和技术选型,业务难点的解决思路,再难度大点就是业务的演进过程和相干解决计划,尤其是数据体量收缩和业务重构的问题,这种问题的范畴取决简历上你本人是否做了形容,如果你形容过我的项目有这样的历程,天然很可能被发问到。 技术栈利用:这个就不必多说,简历上排列的技术栈就是重点发问的内容,不过这里重点提一下当初阶段求职根本都很关注分布式体系,这算是根底的能力,尤其是微服务的技术组件,对于技术细节的考核不会过于深,重点是在业务中的利用细节解决,例如缓存,异步,高并发,服务状态,散布事务等问题,大的方向没必要多说,细节问题说好2-3个根本就能看进去是用过还是学过,或者是背过面试题。解决过业务问题的坑坑洼洼的事件吐槽它几件进去,很容易和面试官达成共识,例如分布式事务组件或者中间件解体等常见问题。 JDK底层:一个开明的面试官通常不会适度尴尬你JDK底层原理,根本都会抛抉择给你本人:聊聊你最相熟的JDK模块,或者剖析浏览过的JDK源码。工作4.5年不能一点JDK底层不理解吧,选最相熟的两块内容就好,举荐并发和JVM两方面内容。JVM作为底层多少都要相熟根本流程,并发作为开发中难度较高的模块也最体现Java水准线。这里能够从理论的底层原理去聊,也能够从理论场景去聊,例如解决JVM问题或者用并发解决什么场景的问题,这样应酬JDK底层的问题都是能够的。 综合能力:综合考查根本都是在部门负责人和HR的两次面试中,会通过各种自带套路的问题,例如:上次到职的起因,如何对待上家公司,对本人职场布局等。这些问题最重要的是思路清晰并且防止吐槽指错景象,任何事件都是互相的,认知要好,态度要坦然,职场上公司和员工都不容易。 05整体上看当初的跳槽状况,面试机会的确比上两年少一些,可能也因为不在3月和9月,公司的抉择也更加审慎,求职周期拉长,让人感觉跳槽难度很大,另外薪水相比之前的确有降落,这是大环境导致的,技术须要日常多用心积攒,业务能力也须要用心去思考,平时积攒足够,跳槽之前理清做好打算,心态温和就好。 最初说一句集体对于工作了解就是:积攒专业技能,进步认知能力,做事件三思而后行,预则立,不预则废。

February 1, 2021 · 1 min · jiezi

关于面试:深入理解JavaScript作用域和作用域链

前言JavaScript中有一个被称为作用域(Scope)的个性。尽管对于许多老手开发者来说,作用域的概念并不是很容易了解,本文我会尽我所能用最简略的形式来解释作用域和作用域链,心愿大家有所播种! 作用域(Scope)1.什么是作用域作用域是在运行时代码中的某些特定局部中变量,函数和对象的可拜访性。换句话说,作用域决定了代码区块中变量和其余资源的可见性。可能这两句话并不好了解,咱们先来看个例子: function outFun2() { var inVariable = "内层变量2";}outFun2();//要先执行这个函数,否则基本不晓得外面是啥console.log(inVariable); // Uncaught ReferenceError: inVariable is not defined从下面的例子能够领会到作用域的概念,变量inVariable在全局作用域没有申明,所以在全局作用域下取值会报错。咱们能够这样了解:作用域就是一个独立的地盘,让变量不会外泄、裸露进来。也就是说作用域最大的用途就是隔离变量,不同作用域下同名变量不会有抵触。 ES6 之前 JavaScript 没有块级作用域,只有全局作用域和函数作用域。ES6的到来,为咱们提供了‘块级作用域’,可通过新增命令let和const来体现。 2.全局作用域和函数作用域在代码中任何中央都能拜访到的对象领有全局作用域,一般来说以下几种情景领有全局作用域: 最外层函数 和在最外层函数里面定义的变量领有全局作用域var outVariable = "我是最外层变量"; //最外层变量function outFun() { //最外层函数 var inVariable = "内层变量"; function innerFun() { //内层函数 console.log(inVariable); } innerFun();}console.log(outVariable); //我是最外层变量outFun(); //内层变量console.log(inVariable); //inVariable is not definedinnerFun(); //innerFun is not defined所有末定义间接赋值的变量主动申明为领有全局作用域function outFun2() { variable = "未定义间接赋值的变量"; var inVariable2 = "内层变量2";}outFun2();//要先执行这个函数,否则基本不晓得外面是啥console.log(variable); //未定义间接赋值的变量console.log(inVariable2); //inVariable2 is not defined所有window对象的属性领有全局作用域个别状况下,window对象的内置属性都领有全局作用域,例如window.name、window.location、window.top等等。 全局作用域有个弊病:如果咱们写了很多行 JS 代码,变量定义都没有用函数包含,那么它们就全副都在全局作用域中。这样就会 净化全局命名空间, 容易引起命名抵触。 ...

January 30, 2021 · 2 min · jiezi

关于面试:长沙社区团购独角兽兴盛优选-18k-面试题记录已拿offer

长沙或者想从北上宽广回长沙的小伙伴,应该都据说过《昌盛优选》,一家位于长沙市从事社区团购业务的独角兽企业。 目前日订单1000+万,在长沙薪资也较有诱惑力,要不要来挑战一下? 我在外面埋伏过一段时间,发现外面缺人十分重大,大家都晓得长沙互联网倒退的晚,目前《昌盛优选》的招人要求也比拟高(绝对长沙其余企业),所以招到称心的人非常少,100份简历可能只能进1到2个。 目前外面次要分两大业务线:电商和物流,电商是比拟早的业务业,当初业务十分稳固需要不多,然而物流是比拟新的业务线需要挺多了,所以倡议在投简历时要选好哪条业务线,如果喜爱体验感好一点举荐电商业务线,如果你喜爱挑战可抉择物流业务,各有优劣,因人而异。 面试体验《昌盛优选》面试体验还是不错的,如果是在长沙本地能够抉择到面,当地能够抉择电面。到面的话感觉还是错的,个别会到9楼的茶水间面试,基本上有三到四面,看你的职级,但起码都有三面。第一面是纯正的技术面,第二面是更纯正的技术面,第三面的话业务方面的比拟多,四面的话那就是CTO来面试的了。 以下是自己整顿的一些《昌盛优选》的局部面试题: Java 面试题次要询问Java相干的技术,会问到线程池、线程平安、Spring、Spring Cloud等问题。 线程池线程的corePoolSize、、maximumPoolSize、workQueue参数的作用和相互之间的关系?平时开发过程中你们是如何创立线程池的?线程池工作的入队机会,什么时候线程会间接执行,什么时候会被放入期待队列中?什么时候会启动新的工作线程?多线程(线程平安)线程平安的实质是什么(JMM)解释下什么是原子性、程序性、可见性Volatile有哪些个性,由Volatile润饰的i++是否保留原子性?列举几个Volatile的利用场景synchronized 是可重入锁吗?synchronized 是否能被中断?synchronized 润饰对象办法与静态方法有什么不同?AQS原理汇合HashMap低层数据结构HashMap是否是线程平安的?HashMap是如何解决hash抵触的?ArrayList低层数据结构ArrayList与LinkedList的区别,各有什么特点?10w数据插入,ArrayList与LinkedList哪个性能更好?ConcurrentHashMap低层数据结构,如何保障线程平安?SpringSpring Bean创立过程Spring如何解决循环依赖的Spring Autowire原理数据结构与算法快排的根本流程快排的时候复杂度二分查找的实现流程跳表的数据结构hash环链表的增删改查MySQL事务的隔离级别,默认隔离级别事务的四大个性事务的实现原理MySQL InnoDB中索引的类型?聚簇索引和非聚簇索引的区别?什么是回表?B+的数据结构索引区分度MySQL慢SQL排查过程explain的用法惟一索引会死锁吗?分库分表分库分表理解过吗?分库分表有哪些策略?分库分表后要跨库查问怎么解决?音讯队列音讯队列的利用场景?用过RocketMQ吗?事务音讯根本流程是什么样的?如何保留音讯不失落?如何解决音讯反复生产问题?分布式Redis实现分布式锁理解过吗?Redis实现分布式锁的原理是什么样的?Redison理解过吗,它是如何实体锁续期的?分布式事务的解决方案有哪些?事务最终一致性的实现原理?事务最终一致性如何进行事务弥补?临时只回忆起了这么多,有晓得的敌人允补充!如果对面试题有不懂的能够公众号架构文摘一样交换,一起提高! 我列出的面试题不肯定都会问到,但问到的几率都很高,至多我待过的业务线这些问题都是常常问的,次要还是看业务线如果你面的是电商的业务线那十有八九会问到秒杀、高并发的问题。如果有趣味去《昌盛优选》小伙伴能够关注我的公众号架构文摘内推入坑!

January 28, 2021 · 1 min · jiezi

关于面试:前端常见面试题总结HTML和CSS部分一

之前的共事到职了,目前在面试新的前端,从网上整顿一套面试题进去 1.怎么实现垂直居中,程度居中,说出2-3种形式? 办法一:相对定位 + left:50%,top: 50% + margin-left:(本身宽度的一半),margin-top:(本身高度的一半) 毛病:要本人计算容器的宽高,万一容器的宽高扭转还要批改css款式 .parent { /*父标签*/ width: 600px; height: 600px; border: 1px solid red; position: relative;}.box1 { width: 200px; height: 200px; background: skyblue; position: absolute; top: 50%; left: 50%; margin-top: -100px; /*本身高度的一半*/ margin-left: -100px; /*本身宽度的一半*/}办法二:相对定位 + left:50% ,top: 50%+ translate(-50%,-50%) 毛病:兼容性问题,必须要带上兼容性前缀。 .parent { /*父标签*/ width: 600px; height: 600px; border: 1px solid red; position: relative;}.box2 { width: 200px; height: 200px; background: skyblue; position: absolute; top: 50%; left: 50%; transform: translate(-50%,-50%);}办法三:相对定位 + left: 0,right: 0, top: 0, bottom: 0 + margin:auto ...

January 27, 2021 · 1 min · jiezi

关于面试:深圳某小公司面试题AQS是什么公平锁和非公平锁ReentrantLock

文章以纯面试的角度去解说,所以有很多的细节是未曾铺垫的。 单纯通过一篇文章来想要在面试中答出AQS、偏心锁&&非偏心锁以及ReentrantLock的加解锁????流程是很难的,强烈建议看完之后本人去翻下源码。 鉴于很多同学反馈没看懂【对线面试官】系列,根底相干的常识我的确写过文章解说过啦,但有的同学就是不爱去翻。 我把这些上传到网盘,你们有须要间接下载就好了。做到这份上了,不会还想白嫖吧?点赞和转发又不必钱。 链接:https://pan.baidu.com/s/1pQTuKBYsHLsUR5ORRAnwFg 明码:3wom 欢送关注我的微信公众号【Java3y】来聊聊Java面试 【对线面试官】系列 一周两篇继续更新中! 欢送关注我的微信公众号【Java3y】来聊聊Java面试 【对线面试官】系列 一周两篇继续更新中!

January 27, 2021 · 1 min · jiezi

关于面试:上海某小公司面试题synchronized锁原理

文章以纯面试的角度去解说,所以有很多的细节是未铺垫的。 鉴于很多同学反馈没看懂【对线面试官】系列,根底相干的常识我的确写过文章解说过啦,但有的同学就是不爱去翻。 为了让大家有更好的体验,我把根底文章也找进去(重要的知识点我还整顿过电子书,比如说像多线程、汇合这种面试必考的早就曾经转成PDF格局啦) 我把这些上传到网盘,你们有须要间接下载就好了。做到这份上了,不会还想白嫖吧?点赞和转发又不必钱。 链接:https://pan.baidu.com/s/1pQTuKBYsHLsUR5ORRAnwFg 明码:3wom 欢送关注我的微信公众号【Java3y】来聊聊Java面试 【对线面试官】系列 一周两篇继续更新中! 文章以纯面试的角度去解说,所以有很多的细节是未铺垫的。 欢送关注我的微信公众号【Java3y】来聊聊Java面试 【对线面试官】系列 一周两篇继续更新中!

January 27, 2021 · 1 min · jiezi

关于面试:字节跳动总监对Android组件化的最佳实战总结-覆盖整个互联网公司附源码

背景组件化作为Android客户端技术的一个重要分支,近年来始终是业界积极探索和实际的方向。每个大厂外部的各个Android开发团队也在尝试和实际不同的组件化计划,并且在组件化通信框架上也有很多高质量的产出。本文次要介绍咱们的组件化计划,心愿对从事Android组件化开发的同学能有所启发。 为什么要组件化近年来,为什么这么多团队要进行组件化实际呢?组件化到底能给咱们的工程、代码带来什么益处?咱们认为组件化可能带来两个最大的益处: 1.进步组件复用性 可能有些人会感觉,进步复用性很简略,间接把须要复用的代码做成Android Module,打包AAR并上传代码仓库,那么这部分性能就能被不便地引入和应用。然而咱们感觉仅仅这样是不够的,上传仓库的AAR库是否不便被复用,须要组件化的规定来束缚,这样能力进步复用的便捷性。 2.升高组件间的耦合 咱们须要通过组件化的规定把代码拆分成不同的模块,模块要做到高内聚、低耦合。模块间也不能间接调用,这须要组件化通信框架的反对。升高了组件间的耦合性能够带来两点间接的益处:第一,代码更便于保护;第二,升高了模块的Bug率。 怎么实现组件化要实现组件化须要思考的问题次要包含上面几个: 代码解耦。将一个宏大的工程拆合成耦,这是十分耗时耗力的工作,但这也是最根底最重要的一步数据传递。每个组件都有可能提供给其余组件应用,主我的项目与组件、组件与组件之间的数据传递UI跳转。组件的生命周期。组件加载、卸载和降维的生命周期集成调试。在开发阶段如何做到按需的编译组件?一次调试中可能只有一两个组件参加集成,这样编译的工夫就会大大降低,进步开发效率。代码隔离。如何杜绝耦合的产生。上面给大家介绍的是全网最全的Android组件化实战整顿,笼罩了整个互联网公司,受篇幅限度不会展现所有内容,只能截图展现局部,残缺内容已整顿成PDF文档,如果你正好须要这份完整版Android组件化最佳实战PDF,能够点此处收费获取。第一章 Android组件化初识1.组件化和模块化的区别 组件化和插件化的区别组件化开发的劣势业务逻辑层5.从组件化实战来解决问题 6 . Android组件化根底 第二章 Android组件化初探1.组件化演示案例 模块化和组件化模块化组件化组件化Demo项目分析组件application和library动静切换组件间的数据传递和办法调用组件类(例如:Fragment)的获取,以及夸组件页面跳转和通信2. WanAndroid APP 组件化我的项目实战附demo 简介版本更新效果图次要性能我的项目目录构造次要开源框架 第三章 架构演变(大厂篇)1.从智行 Android 我的项目看组件化架构实际 前言概述组件化调整的起因和指标组件化架构调整的整体规划组件化架构调整中遇到的一些问题组件化架构的实际成绩 2.失去 App Android彻底组件化demo公布JIMU使用指南组件化拆分的感悟Android彻底组件化—代码和资源隔离代码隔离资源隔离调试切换 组件化:代码隔离也难不倒组件的按序初始化 问题的本源为什么不应用官网StartUp而抉择造轮子设计思路有向无环图(DAG)环校验符合需要的排序形式工作的形容在JIMU中应用重要事项 3.微信 App 微信Android模块化架构重构实际微信Android架构历史为何再次重构微信重塑模块化取舍和抉择代码之外,架构之内 4.蘑菇街 App 蘑菇街 App 的组件化之路实现形式组件生命周期治理壳工程遇到的问题继续集成周边设施小结 蘑菇街 App 的组件化之路·续 对立的调用实现通过 Category 来对立组件对外裸露的接口更明确的表述注册这个组件关怀的 URL注册这个组件可能被调用的办法/属性在 App 生命周期的不同阶段做不同的响应针对casatwy的一些回应小结 5 爱奇艺 App 对于组件化基于Service的IPC通信组件化跨过程通信的外围诉求Andromeda架构剖析 6.美团 App 外卖客户端容器化架构的演进背景美团外卖业务介绍美团外卖挪动端历史架构概述美团外卖容器化架构全景图 什么是容器化架构容器化架构的劣势外卖容器化架构全景图容器化的挑战外卖跨端容器建设MRN容器Titans容器外卖页面容器建设 页面容器化设计思路业务构建模块标准化小结外卖容器化架构的掂量指标 容器化架构掂量指标的特点链路指标要害指标外卖容器化架构的监控运维外卖容器化架构的公布能力容器化架构公布体系跟版本公布流程bundle资源公布多种公布能力综合应用 7. 美团Android组件化计划及组件音讯总线modular-event实战 背景组件化之前的状态组件化计划调研美团其余团队组件化计划调研组件化计划组件化音讯总线框架modular-event组件音讯总线modular-event的实现音讯总线modular-event的构造应用动静代理实现运行时调用订阅和发送的模式8. 美团Android音讯总线的演进之路:用LiveDataBus代替RxBus、EventBus 背景公布/订阅模式RxBus的呈现引入LiveDataBus的想法为什么应用LiveData构建数据通信总线LiveDataBusLiveDataBus的设计和架构LiveDataBus最终实现9.WMRouter:美团外卖Android开源路由框架 10.美团猫眼android模块化实战-可能是最具体的模块化实战 11.携程App(篇幅过长,无奈展现全副) 12.支付宝 App ...

January 26, 2021 · 1 min · jiezi

关于面试:从URL输入到页面展现到底发生什么

前言关上浏览器从输出网址到网页出现在大家背后,背地到底产生了什么?经验怎么样的一个过程?先给大家来张总体流程图,具体步骤请看下文合成! 总体来说分为以下几个过程: DNS 解析:将域名解析成 IP 地址TCP 连贯:TCP 三次握手发送 HTTP 申请服务器解决申请并返回 HTTP 报文浏览器解析渲染页面断开连接:TCP 四次挥手一、URL 到底是啥URL(Uniform Resource Locator),对立资源定位符,用于定位互联网上资源,俗称网址。比方 http://www.w3school.com.cn/html/index.asp,恪守以下的语法规定: scheme://host.domain:port/path/filename各局部解释如下:scheme - 定义因特网服务的类型。常见的协定有 http、https、ftp、file,其中最常见的类型是 http,而 https 则是进行加密的网络传输。host - 定义域主机(http 的默认主机是 www)domain - 定义因特网域名,比方 w3school.com.cnport - 定义主机上的端口号(http 的默认端口号是 80)path - 定义服务器上的门路(如果省略,则文档必须位于网站的根目录中)。filename - 定义文档/资源的名称 二、域名解析(DNS)在浏览器输出网址后,首先要通过域名解析,因为浏览器并不能间接通过域名找到对应的服务器,而是要通过 IP 地址。大家这里或者会有个疑难----计算机既能够被赋予 IP 地址,也能够被赋予主机名和域名。比方 www.hackr.jp。那怎么不一开始就赋予个 IP 地址?这样就能够省去解析麻烦。咱们先来理解下什么是 IP 地址 1.IP 地址IP 地址是指互联网协议地址,是 IP Address 的缩写。IP 地址是 IP 协定提供的一种对立的地址格局,它为互联网上的每一个网络和每一台主机调配一个逻辑地址,以此来屏蔽物理地址的差别。IP 地址是一个 32 位的二进制数,比方 127.0.0.1 为本机 IP。域名就相当于 IP 地址乔装打扮的伪装者,带着一副面具。它的作用就是便于记忆和沟通的一组服务器的地址。用户通常应用主机名或域名来拜访对方的计算机,而不是间接通过 IP 地址拜访。因为与 IP 地址的一组纯数字相比,用字母配合数字的示意模式来指定计算机名更合乎人类的记忆习惯。但要让计算机去了解名称,相对而言就变得艰难了。因为计算机更善于解决一长串数字。为了解决上述的问题,DNS 服务应运而生。 ...

January 25, 2021 · 2 min · jiezi

关于面试:漫画-卧槽我把面试官整崩溃了~

明天这篇是《漫画|Bug是如何产生的?》下半局部,还没有看过的敌人能够先看一下哦,讲述的是上一篇中王大拿受不了不懂技术的领导,各种无理的需要与内卷,有了跑路的想法,在面试中产生的一系列故事… 编后年底了很多同学必定都会看机会,很多都是年前面试,年后拿了老东家年终奖再入职,算的上是完满跳槽了,但在面试过程中,通过了层层通关后,步入面试序幕时,技术面试官/HR等通常都会在完结面试前,抛出一个问题:“请问您还有什么想问的吗?”,话说你通常都是如何答复的呢,你会问些什么问题呢?在这里我收集了几点大家比拟认可的倡议: 您能谈谈我行将共事的团队吗?您工作在这儿最喜爱的一点是什么?您能通知我该职位的日常工作和安顿吗?…等等,放心大胆的去问吧,面试本就是双向选择,不要带着纳闷和顾虑去了这家公司,否则就有可能跟漫画中的王大拿一样哦,从这个坑掉进了另一个坑…… 切忌,漫画情节不可模拟哦,学王大拿问“会不会跑路…”,你就真完蛋了… 本文系 “ 前端布道师 ” 原创转载请先微信分割苏南 (su-south)受权,并表明出处! 撰稿:苏南插画 / 排版:苏南 往期回顾漫画 | 工作中遇上个傻X领导是什么体验??漫画 | 产品经理频繁更改需要,我没忍住把他给砍了!漫画 | 夜深了,程序员的电脑却没关,产生了这样的故事…漫画 | 小公司发愤图强三年,意外拿到美团offer漫画 | 人到中年,一地鸡毛漫画 | 带你领略前端发展史的江湖恩怨情仇 更多精彩,欢送关注咱们本文首发于公众号:前端布道师 链接:https://mp.weixin.qq.com/s/VMOKeB1vLVMW6scrJBU2iA 转载请分割微信:su-south 受权 用漫画解读前端技术,执笔演绎程序人生,愿吾手中笔,能博君(卿)一笑Github地址:更多乏味漫画https://github.com/meibin08/comics-program-life欢送 Star、watch

January 25, 2021 · 1 min · jiezi

关于面试:写Java但不懂Java系列之加载和存储

很多Java工程师语法用的很,然而真的让他说说Java是怎么运行的,我置信他会懵逼!!! 心愿处于这个阶段的同学能够认真阅Class文件系列的文章,这里涵盖了Class文件的绝大部分内容,当你浏览并了解之后,置信你不再迷茫。 不晓得是否还记得Code属性,不记得的小伙伴倡议回顾一下,Code属性中存储了明天咱们将要解说的字节码指令。 明天介绍一下字节码指令(加载和存储指令)。所谓的字节码指令就是JVM在运行时所须要进行的操作,字节码指令大抵分以下集中类型: 加载和存储指令运算指令类型转换指令对象创立与拜访指令操作数栈治理指令管制转移指令办法调用和返回指令异样解决指令同步指令对于大部分字节码指令,都蕴含了其操作所对应的数据类型,i对应Integer类型,l代表Long类型,f代表Float类型,d代表Double类型,a代表Reference类型,b代表byte类型,s代表short类型,c代表char类型。 加载和存储指令加载和存储指令用于将数据在栈帧的局部变量表和操作数栈中传输。 局部变量加载到操作数栈iload,iload_<n>,lload, lload_<n>, fload, fload_<n>, dload, dload_<n>, aload, aload_<n> <n>其实只是助记符,比方iload_1意思是将局部变量表slot索引为1的int型元素压入操作数栈顶,iload_1齐全等同于iload(1)。 操作数栈加载到局部变量表istore,istore_<n>、lstore, lstore_<n>, fstore, fstore_<n>, dstore, dstore_<n>, astore, astore_<n>。 istore_1作用就是将操作数栈顶元素保留到局部变量表索引为1的地位处。 将常量压入到操作数栈bipush,sipush,ldc,ldc_w,ldc2_w,aconst_null,iconst_m1,iconst_<n>,lconst_<l>,fconst_<f>,dconst_<d>。 这里咱们说一下ldc、ldc_w、ldc2_w,咱们先看一下Java8虚拟机标准对它的定义,如下图: 图上的意思大抵是说将常量池中的一些特定类型的常量推入操作数栈顶,这些类型包含int,float,String, Class,java.lang.invoke.MethodType, java.lang.invoke.MethodHandle。 ldc等同于ldc_w, ldc2_w等同于ldc的特定类型的long和double。 public class ClassTest { public void test() { Class<Long> c = Long.class; String s = "test"; int r = Integer.MAX_VALUE; float f = Float.MAX_VALUE; long l = Long.MAX_VALUE; double d = Double.MAX_VALUE; }} 留神看红框中的局部,ldc #2,常量池中的第二项是个Class类型,合乎虚拟机标准的形容;在看 ldc #3,常量池中的第三项是个String类型,合乎虚拟机标准的形容;ldc2_w #8、ldc2_w #11,在常量池的第8和第11项别离是Long和Double型,合乎虚拟机标准。 ...

January 24, 2021 · 1 min · jiezi

关于面试:HashMap源码阅读

本文基于JDK1.8  >读完本文预计须要25分钟(因有大量源代码,电脑屏观看体验较佳)摘要HashMap置信这是呈现频率最高的面试点之一,应该是面试问到烂的面试题之一,同时也是Java中用于解决键值对最罕用的数据类型。那么咱们就针对JDK8的HashMap独特学习一下! 次要办法要害变量: /** * The default initial capacity - MUST be a power of two. * 初始容量大小 必须是2的次幂 */ static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 /** * The maximum capacity, used if a higher value is implicitly specified * by either of the constructors with arguments. * MUST be a power of two <= 1<<30. * 最大的容量大小 * 超过这个值就将threshold批改为Integer.MAX_VALUE,数组不进行扩容 */ static final int MAXIMUM_CAPACITY = 1 << 30; /** * The load factor used when none specified in constructor. * 负载因子 为什么是0.75?因为统计学中hash抵触合乎泊松散布,7-8之间抵触最小 */ static final float DEFAULT_LOAD_FACTOR = 0.75f; /** * The bin count threshold for using a tree rather than list for a * bin. Bins are converted to trees when adding an element to a * bin with at least this many nodes. The value must be greater * than 2 and should be at least 8 to mesh with assumptions in * tree removal about conversion back to plain bins upon * shrinkage. * 链表大于这个值就会树化 * 留神:树化并不是整个map链表,而是某一个大于此阈值的链表 */ static final int TREEIFY_THRESHOLD = 8; /** * The bin count threshold for untreeifying a (split) bin during a * resize operation. Should be less than TREEIFY_THRESHOLD, and at * most 6 to mesh with shrinkage detection under removal. * 小于这个值就会反树化 */ static final int UNTREEIFY_THRESHOLD = 6;四个构造方法://构造方法1//指定初始容量大小,负载因子public HashMap(int initialCapacity, float loadFactor) { if (initialCapacity < 0) throw new IllegalArgumentException("Illegal initial capacity: " + initialCapacity); if (initialCapacity > MAXIMUM_CAPACITY) //1<<30 最大容量是 Integer.MAX_VALUE; initialCapacity = MAXIMUM_CAPACITY; if (loadFactor <= 0 || Float.isNaN(loadFactor)) throw new IllegalArgumentException("Illegal load factor: " + loadFactor); this.loadFactor = loadFactor; //tableSizeFor这个办法用于找到大于等于initialCapacity的最小的2的幂 this.threshold = tableSizeFor(initialCapacity); }//构造方法2//其实调用了上边的构造方法1 负载因子给的默认值0.75public HashMap(int initialCapacity) { this(initialCapacity, DEFAULT_LOAD_FACTOR); }//构造方法3//空参结构,均应用默认值public HashMap() { this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted } //构造方法4//与其余三个相比,初始化了public HashMap(Map<? extends K, ? extends V> m) { this.loadFactor = DEFAULT_LOAD_FACTOR;//0.75f //调用了putVal办法,而putVal办法中有resize办法,有初始化 putMapEntries(m, false); }对四个构造方法简略总结一下: ...

January 23, 2021 · 7 min · jiezi

关于面试:Redis高可用总结Redis主从复制哨兵集群脑裂

越致力,越侥幸, 本文已珍藏在GitHub中JavaCommunity, 外面有面试分享、源码剖析系列文章,欢送珍藏,点赞 https://github.com/Ccww-lx/Ja...在理论的我的项目中,服务高可用十分重要,如,当Redis作为缓存服务应用时, 缓解数据库的压力,进步数据的访问速度,进步网站的性能 ,但如果应用Redis 是单机模式运行 ,只有一个服务器宕机就不能够提供服务,这样会可能造成服务效率低下,甚至呈现其绝对应的服务利用不可用。 因而为了实现高可用,Redis 提供了哪些高可用计划? Redis主从复制Redis长久化哨兵集群... Redis基于一个Master主节点多Slave从节点的模式和Redis长久化机制,将一份数据放弃在多个实例中实现减少正本冗余量,又应用哨兵机制实现主备切换, 在master故障时,自动检测,将某个slave切换为master,最终实现Redis高可用 。 Redis主从复制Redis主从复制,主从库模式一个Master主节点多Slave从节点的模式,将一份数据保留在多Slave个实例中,减少正本冗余量,当某些呈现宕机后,Redis服务还能够应用。 然而这会存在数据不统一问题,那redis的正本集是如何数据一致性? Redis为了保证数据正本的统一,主从库之间采纳读写拆散的形式: 读操作:主库、从库都能够执行解决;写操作:先在主库执行,再由主库将写操作同步给从库。 应用读写拆散形式的益处,能够防止当主从库都能够解决写操作时,主从库解决写操作加锁等一系列巨额的开销。 采纳读写拆散形式,写操作只会在主库中进行后同步到从库中,那主从库是如何同步数据的呢? 主从库是同步数据形式有两种: 全量同步:通常是主从服务器刚刚连贯的时候,会先进行全量同步增量同步 :个别在全同步完结后,进行增量同步,比方主从库间网络断,再进行数据同步。全量同步主从库间第一次全量同步,具体分成三个阶段: 当一个从库启动时,从库给主库发送 psync 命令进行数据同步(psync 命令蕴含:主库的 runID 和复制进度 offset 两个参数),当主库接管到psync 命令后将会保留RDB 文件并发送给从库,发送期间会应用缓存区(replication buffer)记录后续的所有写操作 ,从库收到数据后,会先清空以后数据库,而后加载从主库获取的RDB 文件,当主库实现 RDB 文件发送后,也会把将保留发送RDB文件期间写操作的replication buffer发给从库,从库再从新执行这些操作。这样一来,主从库就实现同步了。 另外,为了分担主库生成 RDB 文件和传输 RDB 文件压力,提高效率,能够应用 “主 - 从 - 从”模式将主库生成 RDB 和传输 RDB 的压力,以级联的形式扩散到从库上。 增量同步增量同步,基于环形缓冲区repl_backlog_buffer缓存区实现。 在环形缓冲区,主库会记录本人写到的地位 master_repl_offset ,从库则会记录本人曾经读到的地位slave_repl_offset, 主库并通过master_repl_offset 和 slave_repl_offset的差值的数据同步到从库。 主从库间网络断了, 主从库会采纳增量复制的形式持续同步,主库会把断连期间收到的写操作命令,写入 replication buffer,同时也会把这些操作命令也写入 repl_backlog_buffer 这个缓冲区,而后主库并通过master_repl_offset 和 slave_repl_offset的差值数据同步到从库。 ...

January 22, 2021 · 1 min · jiezi

关于面试:虚言妙诀终虚见面试躬行是致知Python技术面试策略与技巧实战记录

原文转载自「刘悦的技术博客」https://v3u.cn/a_id_183 2021年,对于正在找工作的敌人来说,笼罩在新冠肺炎疫情之下,往年的待业季显得更加具备挑战性,更有意思的是,每当这个时候,各种面试教训分享就如同过江之鲫个别,俯拾皆是,因为例子过多,兹不细举。然而这些面试教训大部分都停留在实践阶段,这就造成了一个问题:实践和理论,到底有多大出入?我国现代小名仕曾文正公已经说:“天下事,在局外呐喊谈论,总是有益,必须躬身入局,挺膺负责,方有成事之可冀。”革命先烈李大钊学生也曾感叹:“凡事都要好高鹜远去作,不驰于空想,不骛于虚声,而惟以求真的态度作虚浮的时间。以此态度求学,则真谛可明,以此态度做事,则功业可就。”所以本次咱们来进行一次实在的线上面试,正所谓空谈误国,实干兴邦,可能测验真谛的也只有实际这一条路。 首先关上某驰名垂直招聘app软件,寻找咱们的猎物: 能够看到,咱们找到了北京某企事业单位的高级python开发岗位,正所谓不打无筹备之仗,在正式面试之前,咱们须要对该岗位进行剖析,尝试揣测出面试中可能会被问到的问题,首先该岗位要求有flask/django/tornado的教训,那么能够必定,web开发必然是次要工作,尤其是flask,很有可能是该职位的主力框架,所以咱们须要筹备python根底、网络协议、以及flask和django的一些相干常识用来应答。其次,要求对mysql/pgsql/es/redis等数据库有应用教训,那么能够揣测出对数据库要纯熟应用,特地是pgsql,要筹备pgsql与mysql的异同,同时留神到文中提及es,那么对于全文检索相干的知识点也须要有所准备,最初redis相干的nosql数据库知识点也必须坚固,以备不时之需。最初,该职位提及须要相熟linux常用命令以及docker生态体系,同时有对于selenium自动化测试教训。由此能够推断出:该岗位有可能须要参加运维或者部署工作,同时也有很大机会参加到自动化测试项目中去,所以对于docker和selenium相干知识点的筹备迫不及待,除此之外,如果还能筹备一些深度学习的案例和我的项目那就更是精益求精了。 万事俱备,择一黄道吉日,咱们开始面试: 面试官:请您做一下自我介绍? 面试者:您好,我是15年毕业的,在内蒙古民族大学学的计算机,毕业之后呢,教了两年的高中计算机课程,干了两年多当前在咱们本地找了一家公司做微信小程序开发,而后咱们这个前端是用的这个mp-vue框架,后端就是用Django,写的是一个C端的电商平台,最近日活维持在5万左右。 我次要负责的就是后端的Django的一些接口逻辑开发,次要和业务打交道,另外也接触过继续交付部署,咱们采纳的是这个容器式部署(docker),还有灰度的测试以及监控以及一些日常的sql语句提取数据小bug修复这类的工作,最近就是我看咱们公司的这个职位里要求这个selenium, 最近我也钻研了一下selenium,并且写了一个小脚本,就是能够自动化上传表单数据。这就是我最近的一些工作。其实自我介绍最禁忌的就是说废话,比方姓名、年龄这些简历中都有体现,所以咱们要说点简历中没有的,比方本人的我的项目过往,获得的成就与建树(日活5万,日活是一个十分重要的指标,对于增长前期的产品,一个要害的晋升指标就是做沉闷,尽管5万日活还无奈变现,但它是一个从0到1的过程,是百万日活的根底),甚至有意无意的,议论的技术点能够往岗位形容上歪斜,比方岗位形容中呈现过的django、部署、docker、selenium等技术,都能够在面试的自我介绍中再次出现,暗示本人与该岗位珠连璧合,井水不犯河水。须要留神一点的是,面试过程中最好全程应用敬语:您,以示尊敬。 面试官:好的,你简略说下这个es全文检索, 面试者:es是这样,就是过后咱们就是想做一个这个检索性能嘛,然而这个老板要求是他这个响应工夫要比拟短,所以咱们就采纳这个es,es自身就是他就是这个基于内存它的这个响应速度比拟快,第二它是基于这个倒排索引,速度上要比那个mysql的那个正向索引,io操作要损耗的小一些,所以过后我是联合结巴分词不晓得您听没听说过? 面试官:略有耳闻。 面试者:咱们能够了解为,将用户搜寻的语句进行分词操作,给它切词切完词之后呢,我依照词性做这个索引,我就是举个简略例子,比如说他要搜这个超薄笔记本,但实际上超薄和笔记本一个是形容词,一个是名词,那其实我是把这个词性作为这个搜寻等级,形容词优先级为2;名词作为优先级为1。在es里做那个分层索引,依照优先级来去检索数据。开始正式进入技术面试,首先面试官问了岗位形容中呈现过的技术点:es全文检索,咱们能够先简略介绍一下我的项目背景、底层原理,同时在适当时候,进行反诘,反诘的意义在于,防止干燥的一问一答模式,可能减少互动,调节氛围,最初在技术细节上,最好举例子,而不是泛泛而谈,这里既是以用户搜寻“超薄笔记本”为例子,具体论述后端es的检索策略,对于检索策略,其实实质上探讨的是搜索词权重(术语权重,也称作Term Necessity,Query Term Weight)问题,属于检索词解析的一部分。相熟倒排索引的敌人都晓得,文档通常以词的粒度建设索引。所以对于词的解析,在检索解析中属于十分重要的工作,其中,不仅仅包含正确辨认指标词,还包含围绕指标词的各种特征提取,所以,当检索词文本中蕴含不止一个词时,问题的复杂程度就产生指数级的增长。用户的搜寻有更具体的需要,最直观的体现于文本长度增长,围绕指标词有了更多的补充、限度。同时语序也相较文章类文本更加自在,解决方案就是通过结巴分词对检索词进行切词操作,当检索词存在多个词时,每个词的重要水平是不同的,在基于词召回的根底上,对词设立优先级(基于词性),以此达到近似用户原始需要的语义级别。 面试官:那请再谈谈零碎的登录模块。 面试者:登录模块一开始做了一个绝对简略的校验性能,那么后续我是做了一下优化,就改成了这个openldap,不晓得您听没听说过,就是一个基于层级架构的对立管理系统。 面试官:如同没有据说过。 面试者:它有点像es,检索速度十分快,也是便于对立治理,也是为了便于扩大,避免当前有多个我的项目即陆续上线反复造轮子,同时,B端如果新上线一些我的项目的话,不便我做single sign on,就是单点登录。这也是我本人集体后续革新的一个小零碎,能够了解为对立认证,就是把登录这个货色作为微服务给它抽离进去。登录模块对于大部分利用来说,都是最根底的模块。看似简略,却与相当多的产品性能用户应用场景交错在一起,受到产品类型、用户定位、业务逻辑、应用场景、用户操作等不同因素影响,所以此时咱们须要回升产品高度,防止流水账式的形容,而是点出对立认证(openldap)和微服务架构,同样应用反诘来试探对方的常识体系深浅,最初基于对立认证体系,点出最终性能实际:Single Sign On(单点登录)。 面试官:ok,理解,你们后盾权限治理是怎么设计的?用过xadmin吗? 面试者:后盾权限零碎是咱们是本人研发的,当然了,一开始技术选型的时候也思考过xadmin,然而它外面零碎设计您应该也理解过,就是它自身二开的时候,门槛比拟高,因为逻辑设计的比较复杂,如果说我想去改他的模板,或者说我想在他两头键里边做一些扩大,有点麻烦,所以我是独自把他独自抽出来本人做的。 面试官:能具体谈谈吗? 面试者:我是革新了xadmin的那个权限零碎就是用了一套位运算的零碎,我不晓得您理解没理解过位运算。 面试官:就是相似二进制的运算? 面试者:对,我是将不同的零碎节点的对应到每一个二进制位的位上,而后我针对用户带过去的权限节点,对相应的位做这个位与运算,来获取相干权限,进行受权操作则应用位或运算。其实对于权限零碎,无非就是权限模型的应用(acl/rbac/abac),然而如果你在权限设计的模式上做出一点翻新,那么就像黑火药时代里忽然诞生的核弹一样,肯定会给面试官留下深刻印象,比如说计算机最底层的根底:位运算。家喻户晓,运算速度快、效率高、节俭存储空间、对权限管制非常灵活。所有语言都提供了位运算符,包含Python,咱们能够在不同语言实现的零碎、甚至数据库中应用位运算实现对用户权限的治理。当然了,位运算也会带来一些局限性,随着权限码减少,数据长度也相应的增长。这就要求权限码不能超过计算自身运算长度,在数据库中存储权限码时,权限码长度也不能的超过所应用数据类型。如:在32位零碎中,权限节点数量不能多于32个。而如果基于mySQL数据库的BIGINT,其存储空间为8Byte,应用BIGINT存储存储码时,权限数不能多于64个。 面试官:好的,能说说到职起因吗? 面试者:我是这么思考的,我其实就是感觉人嘛,应该是往更高的谋求去倒退,更大的环境,更大的市场来锤炼本人,对吧? 面试官:嗯。 面试者:当然这是我集体认为啊,而且当初我感觉当初的情景是逆水行舟,逆水行舟,因为当初北京疫情还是挺重大的,然而我感觉这是我的真正的机会,我应该抓住。 面试官:好的,那你4号能来公司吗? 面试者:能够,我买好机票了曾经。面试到了这个阶段,基本上技面曾经完结,剩下就是人资问题了,对于到职起因很多敌人喜爱说诸如公司开张、搬迁、裁员等是由,但实际上,这些理由并不是面试官“想”听的,那么从人力资源管理的角度登程,面试官到底想听点什么呢?他想要一些被动而侧面的起因,而不是一些被动的起因,因为裁员、搬迁和开张这些都是被动的,你“被迫”来到原公司。所以说白了,他须要你给他一点企图心,企图心是指一个人做成某件事情,或达成既定目标的志愿。 企图心的强烈水平,取决于志愿的大小,如果志愿越强烈,阐明企图心越大,胜利的可能就越高,所以,天经地义的,你须要向他证实你是带着企图心来面试的。 面试官:好的,那回头见? 面试者:好的,十分感谢您给我这次面试的机会 面试官:别那么客气,88 面试者:好的,再见最初,咱们须要以一个感激来完结整个面试,无论面试胜利与否,一个真挚的致谢会给面试官留下好的印象,感激对方的同时,也感激本人的致力。对于整个面试流程的视频,请移步: 结语:就像《双城记》外面写的那样:这是最好的时代,这是最坏的时代;这是智慧的时代,这是愚昧的时代;这是信奉的期间,这是狐疑的期间;这是光明的节令,这是光明的节令;这是心愿之春,这是悲观之冬;人们背后有着各样事物,人们背后赤贫如洗;人们正在直登地狱,人们正在直下天堂。在这个疫情出尔反尔的年代,有时让人们感觉有有限期待,有时又让人陷入有限的失望,但无论如何,咱们总要直面艰难,开启新的征程,与其坐而论道,不如起而行之,在生活中学会生存,在面试中学会面试。 原文转载自「刘悦的技术博客」 https://v3u.cn/a_id_183

January 21, 2021 · 1 min · jiezi

关于面试:分享一个图书馆管理系统的java实战项目建议做java开发的都看看

前言该我的项目外围需要: 实现简略登录 管理员端实现下列性能①查找书籍②减少书籍③删除书籍④展现全副书籍⑤退出零碎 通用户实现下列性能①查问书籍②借阅书籍③偿还书籍④退出零碎 我的项目类的设计展现 图书相干的类Book:定义书籍的信息 BookList:示意书库,外面寄存书籍 package book;/** * Created with IntelliJ IDEA * Details about unstoppable_t: * User: Administrator * Date: 2021 -01-19 * Time: 16:54 */public class Book { //定义成员变量 private String name; private String author; private int price; private String type; private boolean isBorrowed = false; //示意书的借阅状态 public Book(String name, String author, int price, String type) { this.name = name; this.author = author; this.price = price; this.type = type;// this.isBorrowed = isBorrowed; } public String getName() { return name; } public String getAuthor() { return author; } public int getPrice() { return price; } public String getType() { return type; } public boolean isBorrowed() { return isBorrowed; } public void setName(String name) { this.name = name; } public void setAuthor(String author) { this.author = author; } public void setPrice(int price) { this.price = price; } public void setType(String type) { this.type = type; } public void setBorrowed(boolean borrowed) { isBorrowed = borrowed; }// @Override// public String toString() {// return "Book{" +// "name='" + name + '\'' +// ", author='" + author + '\'' +// ", price=" + price +// ", type='" + type + '\'' +// ", isBorrowed=" + isBorrowed +// '}';// } @Override public String toString() { return "Book{" + "name='" + name + '\'' + ", author='" + author + '\'' + ", price=" + price + ", type='" + type + '\'' + ((isBorrowed == true) ? " 借阅状态: 已借出" : " 借阅状态: 未借出") + '}'; }}package book;/** * Created with IntelliJ IDEA * Details about unstoppable_t: * User: Administrator * Date: 2021 -01-19 * Time: 16:54 */public class BookList { public int usedSize = 3; //书架 public Book[] books = new Book[10]; //书的类型为Book,用顺数组book去存储 public BookList() { books[0] = new Book("三国演义","罗贯中", 100, "小说"); books[1] = new Book("水浒传", "施耐庵", 100, "小说"); books[2] = new Book("西游记", "吴承恩", 100, "小说"); } //给指定地位放书 public void setBooks(int pos,Book book) { this.books[pos] = book; } //拿到指定地位的书 public Book getBooks(int pos){ return this.books[pos]; } public int getUsedSize() { return usedSize; } public void setUsedSize(int usedSize) { this.usedSize = usedSize; }}对书库(程序表)操作的类//新增public class AddOperation implements IOperation{ @Override public void work(BookList booklist) { System.out.println("增加书籍"); Scanner sc = new Scanner(System.in); System.out.println("请输出书名"); String name = sc.nextLine(); System.out.println("请输出书的作者"); String author = sc.nextLine(); System.out.println("请输出书的价格"); int price = sc.nextInt(); System.out.println("请输出书的类型"); String type = sc.next(); Book newBook = new Book(name,author,price,type); //构建新书(对象) int size = booklist.getUsedSize(); //通过bookList援用拜访以后程序表长度 booklist.setBooks(size,newBook); //将新书放在程序表最初面 booklist.setUsedSize(size+1); //程序表放了新书之后,长度加1 }}//借阅public class BorrowOperation implements IOperation{ @Override public void work(BookList booklist) { System.out.println("借阅书籍"); Scanner sc = new Scanner(System.in); System.out.println("请输出书名"); String name = sc.nextLine(); //name为所要借阅书名 for (int i = 0; i < booklist.getUsedSize(); i++) { //通过booklist下标遍历每一本书 Book book = booklist.getBooks(i); if(book.getName().equals(name)){ //如果为true,阐明要借阅的书存在,咱们须要做的是批改书的借阅状态 book.setBorrowed(true); //为true示意书曾经结出 return ; } } System.out.println("十分道歉,本馆没有您要借阅的书!"); // }}//删除public class DelOperation implements IOperation{ @Override public void work(BookList booklist) { System.out.println("删除书籍"); Scanner sc = new Scanner(System.in); System.out.println("请输出书名"); String name = sc.nextLine(); //name为所要删除的书名 int i = 0; for (; i < booklist.getUsedSize(); i++) { Book book = booklist.getBooks(i); if(book.getName().equals(name)){ break; } } if(i >= booklist.getUsedSize()){ System.out.println("没有要删除的这本书!"); return ; } //此时i为所要删除书的下标 for (int j = i; j < booklist.getUsedSize()-1; j++) { Book book = booklist.getBooks(j+1); //取得j+1地位的书 booklist.setBooks(j,book); //将j+1地位的书给j地位 } int size = booklist.getUsedSize(); //取得程序表长度 booklist.setUsedSize(size-1); //删除书后,长度减去1 System.out.println("书已被删除!"); }}//展现public class DisplayOperation implements IOperation{ @Override public void work(BookList booklist) { System.out.println("展现书籍"); for (int i = 0; i < booklist.getUsedSize(); i++) { Book book = booklist.getBooks(i); System.out.println(book); } }}//查找public class FindOperation implements IOperation{ @Override public void work(BookList booklist) { System.out.println("查找书籍"); Scanner sc = new Scanner(System.in); System.out.println("请输出书名"); String name = sc.nextLine(); //name为所要查找书名 for (int i = 0; i < booklist.getUsedSize(); i++) { //通过booklist下标遍历每一本书 Book book = booklist.getBooks(i); if(book.getName().equals(name)){ System.out.println("该书存在!"); System.out.println(book); //间接打印书的信息,toString办法已被重写 return ; } } System.out.println("没有这本书!"); }}//偿还public class ReturnOperation implements IOperation{ @Override public void work(BookList booklist) { System.out.println("偿还书籍"); Scanner sc = new Scanner(System.in); System.out.println("请输出书名"); String name = sc.nextLine(); //name为所要偿还的书名 for (int i = 0; i < booklist.getUsedSize(); i++) { Book book = booklist.getBooks(i); if(book.getName().equals(name)){ book.setBorrowed(false); System.out.println(book); //间接打印书的信息,toString办法已被重写 return ; } } System.out.println("没有你要偿还的这本书!"); }}//退出public class ExitOperation implements IOperation{ @Override public void work(BookList booklist) { System.out.println("退出零碎"); System.exit(1); //示意退出零碎 }}//总接口public interface IOperation { void work(BookList booklist);}用户相干类<mark style="box-sizing: border-box; outline: 0px; background-color: rgb(248, 248, 64); color: rgb(0, 0, 0); overflow-wrap: break-word;">用户类</mark> ...

January 21, 2021 · 5 min · jiezi

关于面试:淘宝一面说一下-Spring-Boot-自动装配原理呗

本文曾经收录进 Github 95k+ Star 的Java我的项目JavaGuide 。JavaGuide我的项目地址 : https://github.com/Snailclimb... 。作者:Miki-byte-1024 & Snailclimb 每次问到 Spring Boot, 面试官十分喜爱问这个问题:“讲述一下 SpringBoot 主动拆卸原理?”。 我感觉咱们能够从以下几个方面答复: 什么是 SpringBoot 主动拆卸?SpringBoot 是如何实现主动拆卸的?如何实现按需加载?如何实现一个 Starter?篇幅问题,这篇文章并没有深刻,小伙伴们也能够间接应用 debug 的形式去看看 SpringBoot 主动拆卸局部的源代码。 前言应用过 Spring 的小伙伴,肯定有被 XML 配置统治的恐怖。即便 Spring 前面引入了基于注解的配置,咱们在开启某些 Spring 个性或者引入第三方依赖的时候,还是须要用 XML 或 Java 进行显式配置。 举个例子。没有 Spring Boot 的时候,咱们写一个 RestFul Web 服务,还首先须要进行如下配置。 @Configurationpublic class RESTConfiguration{ @Bean public View jsonTemplate() { MappingJackson2JsonView view = new MappingJackson2JsonView(); view.setPrettyPrint(true); return view; } @Bean public ViewResolver viewResolver() { return new BeanNameViewResolver(); }}spring-servlet.xml ...

January 21, 2021 · 3 min · jiezi

关于面试:面试题记录1

这里记录一些常见的面试题 继续更新

January 20, 2021 · 1 min · jiezi

关于SegmentFault:对线面试官多线程基础

// 申请间接交给线程池来解决public void push(PushParam pushParam) { try { pushServiceThreadExecutor.submit(() -> { handler(pushParam); }); } catch (Exception e) { logger.error("pushServiceThreadExecutor error, exception{}:", e); }} public class UnsafeCountingServlet extends GenericServlet implements Servlet { private long count = 0; public long getCount() { return count; } public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { ++count; // To something else... }} ...

January 20, 2021 · 1 min · jiezi

关于SegmentFault:Kafka-探险-生产者源码分析-核心组件

这个 Kafka 的专题,我会从零碎整体架构,设计到代码落地。和大家一起杠源码,学技巧,涨常识。心愿大家继续关注一起见证成长!我置信:技术的路线,十年如一日!十年磨一剑! 往期文章Kafka 探险 - 架构简介 Kafka 探险 - 源码环境搭建 前言咱们说 Kafka 是一个音讯队列,其实更加确切的说:是 Broker 这个核心部件。为何这么说?你会发现咱们能够通过控制台、 Java 代码、 C++ 代码、甚至是 Socket 向 Broker 写入音讯,只有咱们听从了 Kafka 写入音讯的协定,就能够将音讯发送到 Kafka 队列中。 用业余一点的话术来说,Kafka 定义了一个应用层的网络协议,只有咱们基于传输层结构出合乎这个协定的数据,就是非法的 Kafka 音讯。 所以说咱们写入 Kafka 音讯的只是一个生产者的客户端,他的模式多种多样,有 Java ,Python,C++ 等多种实现,那么咱们每次发消息难道还须要本人去实现这套发送音讯的协定么?显然 Kafka 官网曾经思考到这个问题了,为了给咱们提供 开箱即用 的音讯队列,官网曾经帮咱们写好了各种语言的优质生产者实现,例如咱们明天要探讨的 Java 版本的实现。 思考后面提到 Kafka 帮咱们实现了各个版本的生产者代码,其实他也能够齐全不提供这份代码,因为外围的队列的性能曾经实现了,这些客户端的代码也能够齐全交由用户本人实现。 那么如果没有官网代码,咱们又该实现一些什么性能,有哪些接口,哪些办法,以及如何组织这些代码呢。带着这样的问题咱们一起来思考一下!个别对于这种带有数据流转的设计,我会从 由谁产生? 什么数据?    通往哪去?  如何保障通路牢靠? 这几个方面来思考。 音讯天然是通过应用程序结构进去并提供给生产者,生产者首先要晓得须要将音讯发送到哪个 Broker 的哪个 Topic,以及 Topic 的具体 Partition 。那么必然须要配置客户端的 Broker集群地址 ,须要发送的 Topic 名称 ,以及 音讯的分区策略 ,是指定到具体的分区还是通过某个 key hash 到不同的分区。 晓得了音讯要通往哪,还须要晓得发送的是什么格局的音讯,是字符串还是数字或是被序列化的二进制对象。 音讯序列化  将须要音讯序列化成字节数组才不便在网络上传输,所以要配置生产者的音讯序列化策略,最好是能够通过传递枚举或者类名的形式主动结构序列化器,便于后续序列化过程的扩大。 ...

January 20, 2021 · 1 min · jiezi

关于javascript:面试被吊打系列-事务隔离级别

小张灰溜溜去面试,后果被面试官吊打!小张:面试官,你好。我是来加入面试的。 面试官:你好,小张。我看了你的简历,精通MySQL数据库。那你必定晓得事务吧,你能说说 事务有哪些个性 吗? 小张:一个事务有4个个性,即ACID。 原子性(Atomicity): 事务开始后的所有操作,要么全副胜利要么全副失败。一致性(Consistency): 事务开始前后数据库的完整性束缚没有被毁坏,比方:A向B转钱,不可能呈现A扣了钱,B没收到钱。隔离性(Isolation):多个事务并发拜访时,事务之间是隔离的。持久性(Durability):事务实现后,事务对数据库的操作被保留在了数据库,不能回滚。面试官:嗯,答的很对。那你说说事务有哪几种隔离级别呢? 小张:事务隔离级别从高到低有四种隔离级别,别离是:串行化(SERIALIZABLE) 、可反复读(REPEATABLE READ)、读提交(READ COMMITTED)、读未提交(READ UNCOMMITTED)。 面试官:嗯嗯,那你能说说这四种隔离级别别离会造成什么问题吗? (小张窃喜,我就晓得你要这么问,还好我平时关注了 ‘ JAVA日知录 ’ 的公众号) 小张:好的,面试官。 如果数据库采纳 读未提交(READ UNCOMMITTED)这种隔离级别,会造成 脏读。事务还没提交他人就能看到,这样就不能保障你读取到的数据是最终的数据,万一他人把事务回滚了,那就呈现了脏数据问题。 读提交(READ COMMITTED)是指一个事务只能读取到其余事务曾经提交了的数据,这样就不会呈现脏读的问题,然而它会带来」不可反复读 的问题。比方 A事务 将一个人的姓名从张三改成李四,B事务在A事务提交之前读取到的是张三,然而在A事务提交之后就变成了李四。 可反复读(REPEATABLE READ):可反复读是为了解决READ COMMITTED带来的不可反复读问题,指的是事务不会读取到其余事务对已有数据的批改,即便数据曾经提交了。也就是说事务开始读取到的是什么,在事务提交之前的任意时刻,这些数据都一样。尽管解决了不可反复读问题,然而他又会带来 幻读 的问题。比方A事务将张三批改成李四,B事务再插入一个名叫李四的用户,此时事务A再查找名叫李四的用户会发现多了一条,呈现了2个李四,这就是幻读。 串行化(SERIALIZABLE):解决了下面呈现的所有问题,然而它效率最差,它将事务的执行变成程序执行了。 面试官:答复的不错,那你晓得 MySQL的默认隔离级别是什么吗? 小张:Mysql默认的隔离级别是REPEATABLE READ,Oracle则采纳的是READ COMMITTED。 面试官:然而咱们应用MySQL的时候并没有呈现幻读啊,怎么解决的? 小张擦了擦汗,开始有点缓和了:额,InnoDB次要是利用锁来解决幻读问题的。 面试官:对,是采纳了锁,那么具体怎么实现的呢? 小张:我...我忽然有点事,我先回去了。 面试官:要理解InnoDB怎么解决幻读得先晓得InnoDB有哪几种锁。 Record Lock:单个行记录上的锁Gap Lock:间隙锁,锁定一个范畴,而非记录自身,遵循左开右闭准则Next-Key Lock:联合Gap Lock和Record Lock,锁定一个范畴,并且锁定记录自身。次要解决的问题是REPEATABLE READ隔离级别下的幻读。留神,如果走惟一索引,那么Next-Key Lock会降级为Record Lock,即仅锁住索引自身,而不是范畴。也就是说Next-Key Lock前置条件为事务隔离级别为RR且查问的索引走的非惟一索引、主键索引。 上面咱们通过具体的例子来模仿下面呈现的幻读问题: `CREATE TABLE T (id int ,name varchar(50),f_id int,PRIMARY KEY (id), KEY(f_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8``insert into T SELECT 1,'张三',10;``insert into T SELECT 2,'李四',30;`InnoDB在数据库中会为索引保护一套B+树,用来疾速定位行记录。B+索引树是有序的,所以会把这张表的索引宰割成几个区间。 事务A执行如下语句,须要将张三批改成李四。 `select * from t;``update t set name = '李四' where f_id = 10;`这时SQL语句走非惟一索引,因而应用Next-Key Lock加锁,不仅会给f_10=10的行加上行锁,而且还会给这条记录的两边增加上间隙锁,即(-∞,10]、(10,30]这2个区间都加了间隙锁。 此时如果B事务要执行如下语句,都会报错[Err] 1205 - Lock wait timeout exceeded; try restarting transaction `INSERT INTO T SELECT 3,'王五',10;  -- 满足行锁,执行阻塞``INSERT INTO T SELECT 4,'赵六',8;   -- 满足间隙锁,执行阻塞``INSERT INTO T SELECT 5,'孙七',18;  -- 满足间隙锁,执行阻塞`不仅插入 f_id = 10 的记录须要期待事务A提交,f_id <10、10< f_id <30 的记录也无奈实现,而大于等于30的记录则不受影响,这足以解决幻读问题了。 ...

January 19, 2021 · 1 min · jiezi

关于面试:如果让你设计一个高并发的消息中间件你会怎么做

写在后面很多小伙伴去大厂面试,简直都会遇到一些开放式的题目,这些开放式的题目没有固定的答案,然而它可能实实在在的体现面试者较为实在的零碎设计能力和技术功底。如果你答复的比拟完满,那么,通过这种开放式题目,就可能让你从泛滥的面试者中怀才不遇。明天,咱们就一起来聊聊,去大厂面试时,一个较为常见的开放式题目:如果让你设计一个高并发的消息中间件,你会怎么做?消息中间件波及的知识点要想设计一个具备高并发的消息中间件,那么首先就要理解下消息中间件波及哪些具体的知识点。通常,设计一个良好的消息中间件起码须要满足如下条件: 生产者、消费者模型。反对分布式架构。数据的高可用。音讯数据不失落。接下来,咱们就针对消息中间件来别离谈谈这些技术点。 生产者消费者模型置信很多小伙伴对于生产者和消费者模型都比拟理解了,简略的说:就是消息中间件可能使其余利用来生产音讯,也可能使其余利用来生产相应的音讯。 对于生产者和消费者模型,咱们须要思考的问题点就比拟多了。接下来,我就一步步来疏导大家进行思考。 首先,咱们来思考这样一个问题: 如果生产者生产了音讯,那么消息中间件应该怎么存储相应的数据呢? 存储在内存? 存储在磁盘? 还是同时存储在内存和磁盘中呢? 如果是将音讯数据同时存储在内存和磁盘中,咱们又该如何解决这些数据呢? 是生产者将音讯投递到消息中间件之后,咱们就立即将数据写入磁盘?还是说数据先驻留到内存,而后每隔一段时间刷到磁盘上? 如果是每隔一段时间刷到磁盘上,那咱们又要思考磁盘文件的切分问题,也就是说,须要将音讯数据分成多少个磁盘文件?(总不能把所有的数据放到一个磁盘文件中吧)。如果是须要切分成多个磁盘文件,那切分的规定又是什么呢? 下面这些问题都是咱们在设计一个消息中间件时须要思考的问题。然而,这还只是一小部分问题。如果想在面试时怀才不遇,那就还须要持续往下看,还有一些重要的问题点须要留神。 如果文件依照肯定的规定切分到多个磁盘文件中了,那是不是还须要治理元数据来标识数据的具体音讯(就像是Hadoop中的NameNode节点中存储着DataNode的元数据信息,NameNode节点通过这些元数据信息就可能更好的治理DataNode节点)?这些元数据能够包含:音讯数据的偏移量、也能够是音讯数据的惟一ID。 思考完数据的存储问题,咱们还须要思考的是:消息中间件是如何将数据投递到对应的消费者的? 在设计生产者和消费者时,还一个很重要的问题须要咱们思考:咱们在设计消息中间件时,采纳的生产模式是什么?会不会将数据平均的调配给消费者?还是会通过一些其余的规定将数据投递到消费者? 反对分布式架构如果咱们设计的消息中间件,每天会承载TB级别的数据高并发和高吞吐量的写入操作。这里,咱们就须要思考将消息中间件设计成分布式架构。 在设计分布式架构时,咱们还须要思考将存储的比拟大的数据,做成分片存储,对数据进行分片等操作。 除了这些,咱们还须要思考另外一个外围问题:对于消息中间件来说,须要反对主动扩容操作。 还有就是是否反对数据分片,如何实现数据分片的扩容和主动数据负载平衡迁徙等。 数据的高可用个别互联网利用的高可用,是通过本地堆内存,分布式缓存,和一份数据在不同的服务器上都搞一个副原本实现的。此时,任何一个存储节点宕机,都不会影响整体的高可用。咱们在设计消息中间件时也能够参考这个思路。 音讯数据不失落此时,咱们就须要提供手动ACK的机制,也就是说:当消费者真正生产音讯结束后,向消息中间件返回“ 解决实现” 的标识,消息中间件删除相应的已解决的音讯。 然而,细化的话,这里,咱们就须要两套ACK机制: 一种ACK对应的是生产端。如果始终没有接管到ACK音讯,则须要通过生产者来从新发送一条音讯来保障生产音讯胜利。另一种ACK对应的是生产端。一旦一条音讯生产并解决胜利,必须返回一个ack给消息中间件,而后消息中间件能力删除这条音讯。否则一旦消费者宕机,就必须重发这条音讯给其余的消费者实例,保障音讯肯定会被解决胜利。明天,咱们没有聊具体的业务点,而是从整体上思考:如果实现一个消息中间件,须要咱们留神的各项知识点和专业技能!好了,明天就到这儿吧,我是冰河,咱们下期见~~

January 18, 2021 · 1 min · jiezi

关于面试:上岸算法-I-LeetCode-Weekly-Contest-224解题报告

No.1 能够造成最大正方形的矩形数目 解题思路 保护最大正方形的边长并计数即可。 代码展现 class Solution { public int countGoodRectangles(int[][] rectangles) { int maxLen = 0, count = 0; for (int[] rec : rectangles) { int len = Math.min(rec[0], rec[1]); if (len > maxLen) { maxLen = len; count = 0; } if (len == maxLen) { count++; } } return count; }}No.2 同积元组 解题思路 用 Map 记录每一种乘积的因数列表。 代码展现 class Solution { public int tupleSameProduct(int[] nums) { Arrays.sort(nums); // map[i] 示意乘积为 i 的较小的因数的列表 // 比方 a * b == i 则 map[i].add(min(a, b)) Map<Integer, List<Integer>> map = new HashMap<>(); for (int i = 0; i < nums.length; i++) { for (int j = i + 1; j < nums.length; j++) { int a = nums[i], b = nums[j]; int p = a * b; if (!map.containsKey(p)) { map.put(p, new ArrayList<>()); } map.get(p).add(a); // a < b } } // 有 len 对乘积为 i // 它们能形成 4 * len * (len - 1) 个元组 int count = 0; for (var entry : map.entrySet()) { int len = entry.getValue().size(); count += 4 * len * (len - 1); } return count; }}No.3 重新排列后的最大子矩阵 ...

January 18, 2021 · 5 min · jiezi

关于面试:面试说聊聊JavaScript中的数据类型

前言请讲下 JavaScript 中的数据类型?前端面试中,预计大家都被这么问过。 答:Javascript 中的数据类型包含原始类型和援用类型。其中原始类型包含 Null、Undefined、Boolean、String、Symbol、BigInt。援用类型指的是 Object。 没错,我也是这么答复的,只是这通常是第一个问题,由这个问题能够引出很多很多的问题,比方 Null 和 Undefined 有什么区别?前端的判空有哪些须要留神的?typeof null 为什么是 object?为什么 ES6 要提出 Symbol?BigInt 解决了什么问题?为什么 0.1 + 0.2 !== 0.3? 你如何解决这个问题?如何判断一个值是数组?...弱类型语言因为 JavaScript 是弱类型语言或者说是动静语言。这意味着你不须要提前申明变量的类型,在程序运行的过程中,类型会被主动确定,也就是说你能够应用同一个变量保留不同类型的值 var foo = 42; // foo is a Number nowfoo = "bar"; // foo is a String nowfoo = true; // foo is a Boolean now这一个性给咱们带来便当的同时,也给咱们带来了很多的类型谬误。试想一下,如果 JS 说是强类型语言,那么各个类型之间没法转换,也就有了一层隔膜或者说一层爱护,会不会更加好保护呢?——这或者就是 TypeScript 诞生的起因。 对 JavaScript 的数据类型把握,是一个前端最根本的知识点 null 还是 undefinded定义undefined 示意未定义的变量。null 值示意一个空对象指针。 寻根究底: 一开始的时候,JavaScript 设计者 Brendan Eich 其实只是定义了 null,null 像在 Java 里一样,被当成一个对象。然而因为 JavaScript 中有两种数据类型:原始数据类型和援用数据类型。Brendan Eich 感觉示意"无"的值最好不是对象。所以 Javascript 的设计是 null是一个示意"无"的对象,转为数值时为0;undefined是一个示意"无"的原始值,转为数值时为NaN。 ...

January 18, 2021 · 3 min · jiezi

关于面试:前端面试对一些问题的吐槽

面试的时候,碰到一些问题或者答案,给我的感觉不太好。有些可能是面试官太土,有些可能是我程度眼界不够。这里不讲对错,只讲我本人的观点。 技术相干工程师最重要的能力是什么?我:工程能力和基础知识齐备。面试官:错,是解决问题的能力。解决问题的能力,这个答案放到任何行业任何职业都通用。所以我不分明面试官问这个问题的用意。Joel Spolsky 说的好,面试时候看两个能力就好,一是能成事,一是聪慧。能把工程做好,示意能成事,能遍历大部分基础知识,示意聪慧。工程能力很重要。很多人示意本人能实现某某刁钻需要,然而产出的货色除了“能用”之外,没有任何长处。置信大家也接手过那样的代码,数据四通八达,函数乌七八糟。像一座微小的垃圾山,能住人,然而没人敢改,随时都有崩塌的可能,前期不得不化微小的人力去重构。如果重构的人设计能力差,很有可能下一任接手人,不得不面临同样的窘境。 治理相干你认为组员不服治理,是什么起因导致?

January 16, 2021 · 1 min · jiezi

关于面试:面试被吊打系列-Redis缓存雪崩

小张灰溜溜去面试,后果被面试官吊打!小张:面试官,你好。我是来加入面试的。 面试官:你好,小张。我看了你的简历,你们平时在我的项目中用了redis,能说一下你们应用redis的场景吗? 小张:redis的话咱们次要是用来存储一些罕用的配置类数据还有一些热点数据;还有存储一些到期生效的数据,比方登录用户颁发的token等。 面试官:那好,既然你们用来存储热点数据。那么我来问你个理论场景,查问热点数据的时候会先从缓存加载,如果缓存没有命中则会检索数据库获取数据。往往咱们还会给热点缓存数据设置一个过期工夫。那么我的问题是,假如在某一时间点热点缓存全副过期生效了,这样所有的申请都会间接进入数据库,一瞬间就会把数据库压垮,如果是你会怎么解决这个问题? 小张:emm...面试官,我肚子有点不难受,我先回去了。小张卒! 面试官:因为缓存同一时间大面积的生效,或者缓存服务临时不能提供服务等,从而导致所有申请都去查数据库,导致数据库CPU和内存负载过高,甚至宕机。这一景象被称之为 缓存雪崩。 缓存雪崩能够通过以下四个维度来解决: 缓存预热数据加热的含意就是在正式部署之前,先把可能的数据先事后拜访一遍,这样局部可能大量拜访的数据就会加载到缓存中。在行将产生大并发拜访前手动触发加载缓存不同的key。 加上互斥锁能够在第一个查问数据的申请上应用一个互斥锁来锁住它,其余的线程走到这一步拿不到锁就等着,等第一个线程查问到了数据,而后将数据放到redis缓存起来。前面的线程进来发现曾经有缓存了,就间接走缓存。 过期工夫均匀分布给缓存的时效工夫加上随机因子,即给缓存设置不同的过期工夫,让缓存生效的工夫点尽量平均。 构建高可用的缓存零碎把Redis设计成高可用的,即便个别节点、个别机器、甚至是机房宕掉,仍然能够提供服务,例如 Redis Sentinel 和 Redis Cluster 都实现了高可用。 面试官:各位看官敌人们,你们学会怎么解决缓存雪崩的问题了吗?心愿你们的面试不会被这个问题难倒哟~ 小张:学到了学到了,我下次再来。(早晓得不提什么热点数据了,不提面试官就不会问。) 面试官:小样,不问这个那么我不会问其余的了吗?你下次再来试试!

January 14, 2021 · 1 min · jiezi

关于面试:面试之后扼腕叹息

明天我面试了一位候选人。 他面试的这个岗位是一个外包岗位,所以简历应用的是外包公司的对立模板。 我曾经用这个模板看了很多份简历了。 所以习惯性的先看了技术栈,而后嫖了一眼学历。 忽然被抓住了眼球。 他的简历上写到 2015 年毕业于某高校计算机科学与技术业余。 而这个某高校的计科业余,在国内排名是 TOP 10。 也就是上面这几所学校其中一所: 一个快 6 年教训的,双一流大学王牌业余的本科毕业生来面试一个外包岗位。 这个背景曾经足够吸引起我的留神了。 然而面试下来,整体体现的十分个别。 答复问题很多技术问题浮于外表,甚至简历上写的技术点都答不上来。 而且,答复问题的时候,我察看了一下他的脸色,整个状态是游离的,给人一种不太自信的感觉。 技术方面的问题就不说了。 最初我问了一下他的经验,我好奇的是这么好的学历背景,为什么会始终在外包公司做了这么长时间呢? 他答复到: 当年大四的时候全心全意的筹备考研,然而最终没有考上。也因为考研而错过了校招的机会。毕业之后,只能走社招的形式,而且抉择了北上,后果误打误撞进了一家外包公司,一干就是 2 年半的工夫。当本人有三年教训之后,发现在外包公司外面始终待着也不太好,于是在抉择了来到北京,来到成都。因为本人的外包经验,来到成都之后,找了近 3 个月的工作,也没有找到适合的岗位。后果还是进了一家外包公司。这一干,又是在各个外包我的项目中兜兜转转,三年一晃而过。这一次跳槽的起因是因为我意识到本人的技术还差的很多,而在当初的这个环境下很难失去晋升。我问他:那你晓得你当初面试的这个岗位也是一个外包吗? 他说:我晓得,然而至多我感觉来你们公司当个外包,有这么大的交易量,总是能学到货色的。我当初就想把本人的技术水平提上去。 我最初的一个问题是:你还有什么想要问我的吗? 他答非所问的说:如果我有机会退出公司的话,肯定能学的很多货色。 学货色,学技术。 是他在和我交换的几分钟中提到的最多的几个字。 而在聊到这些的时候,我感觉的到他的那份渴望。 然而通过后面的技术面试,我也能感触到他这几年的确没有在技术提高上花很多工夫。 抛开技术面试,他前面体现的特地真挚。 让我想起以前在北京的时候遇到过的一个面试者。 那个面试者是当了几年兵,而后入伍回来了,进入了计算机行业。 技术十分个别,然而也体现的十分真挚。 我作为一面,我给他过了。 去给领导汇报的时候,我说:我拿不定主见了,要不你去看看吧。 领导面试实现之后,给我说:我感觉他很个别啊,你感觉他哪里好? 我说:我感觉他特地真挚。 领导听到后都笑了:技术不过关,真挚是没用的,我倒是感觉你心软了。面试别心软。 面试完这个哥们后,我长叹一口气,为他一阵可惜。 另一个面试者明天的这个面试者,又让我联想到了之前在北京的时候面试过的一个工作了 9 年的前辈。 那个时候我工作满打满算才 3 年。 刚拿到简历的时候,我一摸:这简历,好厚啊! 于是我去找了我的领导,我说:这人我应该没法面试,我工作教训都才3年,这哥们是我的 3 倍啊。咋面? 领导说:没事,你先去聊聊,怕什么,就当是技术交换,别当成面试。 面试的过程中咱们聊的技术问题,他都没有答复的很好,他的技能就像一块大平板,一眼望去,什么都会一点,然而略微一深入探讨,就两眼一抹黑了。 面试的最初,我间接给他说: 在整个面试的过程中,其实你有些问题答复的是不太好的,可能明天咱们的面试就到这里了,然而我还想请问你一个问题,你能够不答复。 你工作了9年了,应该有很多行业内的敌人呀,为什么没有内推呢?而且你的技术能力和你的工作年限有点不太匹配。 他答复了我,大略的意思是这样的: 我刚加入工作的时候,计算机行业还没那么火,大多数都是传统公司,所以我始终就在传统行业外面,属于比拟外向的人,也没有刻意的去积攒人脉。期间换了几家公司,没有一家是真正意义上的互联网科技公司,我也始终是做开发工作。最初的这家公司是把我解雇了,解雇之前,我还是一个底层的老员工。然而我致力想往治理岗倒退,然而最终不得人意。因为最近几年始终想往治理方向倒退,更多的是重视业务了,家庭方面的事件也越来越多,有时会影响工作。技术方面就有点停滞不前了。最终导致这样的场面。听了之后,我说: 你是我的前辈,我很尊重你,然而我从我从业三年的角度再加上你刚刚的面试体现来说,你说的这是一部分起因,而且不是次要起因。 我感觉次要起因是,对于技术你失去了追寻的态度。 在过来的这几年外面,你只有对于每次碰到的问题,略微深刻地钻研一下,思考一下,整顿一下,而后再找一项技能深挖上来,与日俱增下来,明天的后果应该会大不一样。 我了解你,兴许是在家庭和工作的双重压力下,迷失了方向。 起初,我把他送到公司门口,他曾经走进来了,又转过身来和我握了一下手,他握的很使劲,说: 谢谢! 我在面试后果形容那一栏写的是: ...

January 14, 2021 · 1 min · jiezi

关于面试:关于面试造火箭入职拧螺丝

随着疫情蔓延,越来越多的工作开始通过线上的平台近程解决。 程序员的面试也是这样。 其实 程序员的近程面试早曾经变成了一种风行趋势,很多互联网的头部企业很早就在应用近程在线的是形式面试程序员。这次疫情让更多的中小企业也体验到程序员在线面试的高效和便捷。 因为程序员的技术面试和其余岗位(经营,销售等)相比,最大不同须要一个能够写代码的中央。程序员面试如果面试不写代码,企业仅凭候选人口述开发教训和技术了解,筛选效率会大大降低。 过来一些公司,尤其是中小企业比较突出,他们因为对招聘需要的迫切,胆怯面试时候写代码会吓跑候选人,索性就不让程序员候选人写代码,见面聊聊感觉差不多就连忙让入职。这种形式外表上看起来入职更快,然而大部分这种形式入职的人往往素质不过硬,常有冒名顶替的状况。有一位客户就埋怨这种形式找到候选人,“面试的时候聊的很好,感觉什么都晓得,然而入职后发现不会写代码,我还是要持续给他招人。”这就是犯了经验主义的谬误,没有的确的考查过候选人的编码程度,面试的时候图省事,找到了冒名顶替的人,入职后的损失就大了。 当初还有一种声音,在知乎和一些网络论坛上比拟风行,就是很多候选人埋怨企业“面试造火箭,入职拧螺丝”,就是企业在面试的时候问了很多难题,然而入职后这些货色就用不上了,仿佛没有必要。这些候选人入职后也会变成面试官,这种声音也影响了企业判断,如果没有人纠正这种想法,企业也感觉仿佛有情理,没必要在面试的时候门槛这么高,反正入职后也用不上。这种声音是因为只看到了面试考核的表面现象,没有了解考试的实质。面试是一种能力筛选的过程,面试的目标就只是高效的筛选候选人,简略的问题只能用来判断候选人的上限,短少了区分度。所以好的面试问题,是能够层层递进的,能够无效的判断出候选人的能力下限。或者在规定工夫内写一段代码,通过写代码的过程判断候选人理解能力和思维敏捷性。 所以面试中的简略问题才是门槛,而那些业余的算法题,其实是在判断候选人的能力下限。是帮忙企业疾速高效的筛选程序员的必要形式。

January 14, 2021 · 1 min · jiezi

关于面试:深入浅出2020年春招秋招JVM面试题整理附答案

运行时数据区是什么?虚拟机在执行 Java 程序的过程中会把它所治理的内存划分为若干不同的数据区,这些区域有各自的用处、创立和销毁工夫。 线程公有:程序计数器、Java 虚拟机栈、本地办法栈。 线程共享:Java 堆、办法区。 程序计数器是什么?程序计数器是一块较小的内存空间,能够看作以后线程所执行字节码的行号指示器。字节码解释器工作时通过扭转计数器的值选取下一条执行指令。分支、循环、跳转、线程复原等性能都须要依赖计数器实现。是惟一在虚拟机标准中没有规定内存溢出状况的区域。 如果线程正在执行 Java 办法,计数器记录正在执行的虚拟机字节码指令地址。如果是本地办法,计数器值为 Undefined。 Java 虚拟机栈的作用?Java 虚拟机栈来形容 Java 办法的内存模型。每当有新线程创立时就会调配一个栈空间,线程完结后栈空间被回收,栈与线程领有雷同的生命周期。栈中元素用于反对虚拟机进行办法调用,每个办法在执行时都会创立一个栈帧存储办法的局部变量表、操作栈、动静链接和办法进口等信息。每个办法从调用到执行实现,就是栈帧从入栈到出栈的过程。 有两类异样:① 线程申请的栈深度大于虚拟机容许的深度抛出 StackOverflowError。② 如果 JVM 栈容量能够动静扩大,栈扩大无奈申请足够内存抛出 OutOfMemoryError(HotSpot 不可动静扩大,不存在此问题)。 本地办法栈的作用?本地办法栈与虚拟机栈作用类似,不同的是虚拟机栈为虚拟机执行 Java 办法服务,本地办法栈为虚本地办法服务。调用本地办法时虚拟机栈放弃不变,动静链接并间接调用指定本地办法。 虚拟机标准对本地办法栈中办法的语言与数据结构无强制规定,虚拟机可自在实现,例如 HotSpot 将虚拟机栈和本地办法栈合二为一。 本地办法栈在栈深度异样和栈扩大失败时别离抛出 StackOverflowError 和 OutOfMemoryError。 堆的作用是什么?堆是虚拟机所治理的内存中最大的一块,被所有线程共享的,在虚拟机启动时创立。堆用来寄存对象实例,Java 里简直所有对象实例都在堆分配内存。堆能够处于物理上不间断的内存空间,逻辑上应该间断,但对于例如数组这样的大对象,少数虚拟机实现出于简略、存储高效的思考会要求间断的内存空间。 堆既能够被实现成固定大小,也能够是可扩大的,可通过 -Xms 和 -Xmx 设置堆的最小和最大容量,以后支流 JVM 都依照可扩大实现。如果堆没有内存实现实例调配也无奈扩大,抛出 OutOfMemoryError。 办法区的作用是什么?办法区用于存储被虚拟机加载的类型信息、常量、动态变量、即时编译器编译后的代码缓存等数据。 JDK8 之前应用永恒代实现办法区,容易内存溢出,因为永恒代有 -XX:MaxPermSize 下限,即便不设置也有默认大小。JDK7 把放在永恒代的字符串常量池、动态变量等移出,JDK8 中永恒代齐全废除,改用在本地内存中实现的元空间代替,把 JDK 7 中永恒代残余内容(次要是类型信息)全副移到元空间。 虚拟机标准对办法区的束缚宽松,除和堆一样不须要间断内存和可抉择固定大小/可扩大外,还能够不实现垃圾回收。垃圾回收在办法区呈现较少,次要指标针对常量池和类型卸载。如果办法区无奈满足新的内存调配需要,将抛出 OutOfMemoryError。 运行时常量池的作用是什么?运行时常量池是办法区的一部分,Class 文件中除了有类的版本、字段、办法、接口等形容信息外,还有一项信息是常量池表,用于寄存编译器生成的各种字面量与符号援用,这部分内容在类加载后寄存到运行时常量池。个别除了保留 Class 文件中形容的符号援用外,还会把符号援用翻译的间接援用也存储在运行时常量池。 运行时常量池绝对于 Class 文件常量池的一个重要特色是动态性,Java 不要求常量只有编译期能力产生,运行期间也能够将新的常量放入池中,这种个性利用较多的是 String 的 intern 办法。 ...

January 13, 2021 · 4 min · jiezi

关于面试:新鲜出炉阿里内部开源SpringCloud-Alibaba全解全彩版全网首发

SpringCloud Aliababa简介SpringCloud Alibaba是阿里巴巴团体开源的一套微服务架构解决方案。 微服务架构是为了更好地分布式系统开发,将一个利用拆分成多个子利用,每一个服务都是能够独立运行的子工程。其中涵盖了十分多的内容,包含:服务治理、配置管理、限流降级以及对阿里开源生态(Dubbo、RocketMQ等)反对的N多组件。 明天开源的这份SpringCloud Alibaba全解是2021年全网首次开源,内容涵盖十分多,包含了:Nacos Discvery-服务治理、Sentinel--服务容错、Gateway--服务网关、Sleuth--链路追踪、Rocketm--音讯驱动、SMS--短信服务、Nacos Cnfig-服务配置、Seata--分布式事务等等。 因为文章的篇幅无限,小编只能为大家来展现局部内容,完整版曾经为大家整顿结束。收费获取形式在文末! 第一章微服务介绍 第二章微服务环境搭建 第三章Nacos Discovery--服务治理 自定义实现负载平衡 第四章Sentinel--服务容错 第五章Gateway--服务网关 Gateway外围架构 第六章Sleuth-链路追踪 第七章Rocketmq--音讯驱动 程序音讯 事务音讯 第八章SMS--短信服务 第九章Nacos Config--服务配置 第十章Seata--分布式事务 Seata实现分布式事务管制 总结**须要支付这份全网首发的阿里外部开源SpringCloud Alibaba全解(全彩版)的小伙伴麻烦帮忙点赞、转发一下文章,而后加小助理VX:wjj2632646收费支付!**

January 13, 2021 · 1 min · jiezi

关于面试:小红书面试官介绍一下-tree-shaking-及其工作原理

写在后面明天这道题目是在和小红书的一位面试官聊的时候: 我:如果要你抉择一道题目来考查面试者,你最有可能抉择哪一道? 面试官:那应该就是介绍一下tree shaking及其工作原理? 我:为什么? 面试官:是因为最近面了好多同学,大家都说相熟webpack,在我的项目中如何去应用、如何去优化,也都或多或少会提到tree shaking,然而每当我深刻去问其工作机制或者原理时,却少有人能答复上来。(小声 bb:并不是我想内卷,的确是工程师的根本素养啊,哈哈 ????) 面试官:那你来答复一下这个问题? 我:我也用过tree shaking,只是晓得它的别名叫树摇,最早是由Rollup实现,是一种采纳删除不须要的额定代码的形式优化代码体积的技术。然而对于它的原理,我还真的不晓得,额,,,, 咱们平时更多时候是停留在利用层面,这种只是能满足根底的业务诉求,对于前期的技术深挖以及集体的职业倒退都是受限的。还是那句老话:知其然,更要知其所以然~话不多说,上面我就带大家一起来深刻探索这个问题。 什么是Tree shakingTree shaking 是一种通过革除多余代码形式来优化我的项目打包体积的技术,专业术语叫 Dead code elimination这个概念,我置信大多数同学都是理解的。什么,你不懂? 不懂没关系,我能够教你啊(不过那是另外的价格,哈哈 ????) 走远了,兄弟,让咱们言归正传:tree shaking如何工作的呢? tree shaking如何工作的呢?尽管 tree shaking 的概念在 1990 就提出了,但直到 ES6 的 ES6-style 模块呈现后才真正被利用起来。 在ES6以前,咱们能够应用CommonJS引入模块:require(),这种引入是动静的,也意味着咱们能够基于条件来导入须要的代码: let dynamicModule;// 动静导入if (condition) { myDynamicModule = require("foo");} else { myDynamicModule = require("bar");}然而CommonJS标准无奈确定在理论运行前须要或者不须要某些模块,所以CommonJS不适宜tree-shaking机制。在 ES6 中,引入了齐全动态的导入语法:import。这也意味着上面的导入是不可行的: // 不可行,ES6 的import是齐全动态的if (condition) { myDynamicModule = require("foo");} else { myDynamicModule = require("bar");}咱们只能通过导入所有的包后再进行条件获取。如下: import foo from "foo";import bar from "bar";if (condition) { // foo.xxxx} else { // bar.xxx}ES6的import语法能够完满应用tree shaking,因为能够在代码不运行的状况下就能剖析出不须要的代码。 ...

January 13, 2021 · 1 min · jiezi

关于面试:面试Redis为什么快呢查询为何会变慢呢

越致力,越侥幸,本文已珍藏在GitHub中JavaCommunity, 外面有面试分享、源码剖析系列文章,欢送珍藏,点赞https://github.com/Ccww-lx/Ja...在理论开发,Redis应用会频繁,那么在应用过程中咱们该如何正确抉择数据类型呢?哪些场景下实用哪些数据类型。而且在面试中也很常会被面试官问到Redis数据结构方面的问题: Redis为什么快呢?为什么查问操作会变慢了?Redis Hash rehash过程为什么应用哈希表作为Redis的索引当咱们剖析了解了Redis数据结构,能够为了咱们在应用Redis的时候,正确抉择数据类型应用,晋升零碎性能。 Redis底层数据结构Redis 是一个内存键值key-value 数据库,且键值对数据保留在内存中,因而Redis基于内存的数据操作,其效率高,速度快; 其中,Key是String类型,Redis 反对的 value 类型包含了 String、List 、 Hash 、 Set 、 Sorted Set 、BitMap等。Redis 可能之所以可能宽泛地实用泛滥的业务场景,基于其多样化类型的value。 而Redis的Value的数据类型是基于为Redis自定义的对象零碎redisObject实现的, typedef struct redisObject{ //类型 unsigned type:4; //编码 unsigned encoding:4; //指向底层实现数据结构的指针 void *ptr; ….. } redisObject除了记录理论数据,还须要额定的内存空间记录数据长度、空间应用等元数据信息,其中蕴含了 8 字节的元数据和一个 8 字节指针,指针指向具体数据类型的理论数据所在位置: 其中,指针指向的就是基于Redis的底层数据结构存储数据的地位,Redis的底层数据结构:SDS,双向链表、跳表,哈希表,压缩列表、整数汇合实现的。 那么Redis底层数据结构是怎么实现的呢? Redis底层数据结构实现咱们先来看看Redis比较简单的SDS,双向链表,整数汇合。 SDS、双向链表和整数汇合SDS,应用len字段记录已应用的字节数,将获取字符串长度复杂度升高为O(1),而且SDS是惰性开释空间的,你free了空间,零碎把数据记录下来下次想用时候可间接应用。不必新申请空间。 整数汇合,在内存中调配一块地址间断的空间,数据元素会挨着寄存,不须要额定指针带来空间开销,其特点为内存紧凑节俭内存空间,查问复杂度为O(1)效率高,其余操作复杂度为O(N); 双向链表, 在内存上能够为非间断、非程序空间,通过额定的指针开销前驱/后驱指针串联元素之间的程序。 其特点为节插入/更新数据复杂度为O(1)效率高,查问复杂度为O(N); Hash哈希表哈希表,其实相似是一个数组,数组的每个元素称为一个哈希桶,每个哈希桶中保留了键值对数据,且哈希桶中的元素应用dictEntry构造, 因而,哈希桶元素保留的并不是键值对值自身,而是指向具体值的指针,所以在保留每个键值对的时候会额定空间开销,至多有减少24个字节,特地是Value为String的键值对,每一个键值对就须要额定开销24个字节空间。当保留数据小,额定开销比数据还大时,这时为了节俭空间,思考换数据结构。 那来看看全局哈希表全图:尽管哈希表操作很快,但Redis数据变大后,就会呈现一个潜在的危险:哈希表的抵触问题和 rehash开销问题,这能够解释为什么哈希表操作变慢了? 当往哈希表中写入更多数据时,哈希抵触是不可避免的问题 , Redis 解决哈希抵触的形式,就是链式哈希,同一个哈希桶中的多个元素用一个链表来保留,它们之间顺次用指针连贯,如图所示: 当哈希抵触也会越来越多,这就会导致某些哈希抵触链过长,进而导致这个链上的元素查找耗时长,效率升高。 为了解决哈希抵触带了的链过长的问题,进行rehash操作,减少现有的哈希桶数量,扩散单桶元素数量。那么rehash过程怎么样执行的呢? Rehash为了使rehash 操作更高效,应用两个全局哈希表:哈希表 1 和哈希表 2,具体如下: 将哈希表 2 调配更大的空间,把哈希表 1 中的数据从新映射并拷贝到哈希表 2 中;开释哈希表 1 的空间但因为表1和表2在从新映射复制时数据大,如果一次性把哈希表 1 中的数据都迁徙完,会造成 Redis 线程阻塞,无奈服务其余申请。 ...

January 12, 2021 · 2 min · jiezi

关于面试:对线面试官Java-NIO

服务端: public class NoBlockServer { public static void main(String[] args) throws IOException { // 1.获取通道 ServerSocketChannel server = ServerSocketChannel.open(); // 2.切换成非阻塞模式 server.configureBlocking(false); // 3. 绑定连贯 server.bind(new InetSocketAddress(6666)); // 4. 获取选择器 Selector selector = Selector.open(); // 4.1将通道注册到选择器上,指定接管“监听通道”事件 server.register(selector, SelectionKey.OP_ACCEPT); // 5. 轮训地获取选择器上已“就绪”的事件--->只有select()>0,阐明已就绪 while (selector.select() > 0) { // 6. 获取以后选择器所有注册的“选择键”(已就绪的监听事件) Iterator<SelectionKey> iterator = selector.selectedKeys().iterator(); // 7. 获取已“就绪”的事件,(不同的事件做不同的事) while (iterator.hasNext()) { SelectionKey selectionKey = iterator.next(); // 接管事件就绪 if (selectionKey.isAcceptable()) { // 8. 获取客户端的链接 SocketChannel client = server.accept(); // 8.1 切换成非阻塞状态 client.configureBlocking(false); // 8.2 注册到选择器上-->拿到客户端的连贯为了读取通道的数据(监听读就绪事件) client.register(selector, SelectionKey.OP_READ); } else if (selectionKey.isReadable()) { // 读事件就绪 // 9. 获取以后选择器读就绪状态的通道 SocketChannel client = (SocketChannel) selectionKey.channel(); // 9.1读取数据 ByteBuffer buffer = ByteBuffer.allocate(1024); // 9.2失去文件通道,将客户端传递过去的图片写到本地我的项目下(写模式、没有则创立) FileChannel outChannel = FileChannel.open(Paths.get("2.png"), StandardOpenOption.WRITE, StandardOpenOption.CREATE); while (client.read(buffer) > 0) { // 在读之前都要切换成读模式 buffer.flip(); outChannel.write(buffer); // 读完切换成写模式,能让管道持续读取文件的数据 buffer.clear(); } } // 10. 勾销选择键(曾经解决过的事件,就应该勾销掉了) iterator.remove(); } } }}客户端: ...

January 11, 2021 · 2 min · jiezi

关于面试:SpringMVC常见面试题总结超详细回答

1、什么是Spring MVC ?简略介绍下你对springMVC的了解? Spring MVC是一个基于Java的实现了MVC设计模式的申请驱动类型的轻量级Web框架,通过把Model,View,Controller拆散,将web层进行职责解耦,把简单的web利用分成逻辑清晰的几局部,简化开发,缩小出错,不便组内开发人员之间的配合。 2、SpringMVC的流程? (1)用户发送申请至前端控制器DispatcherServlet;(2)DispatcherServlet收到申请后,调用HandlerMapping处理器映射器,申请获取Handler;(3)处理器映射器依据申请url找到具体的处理器Handler,生成处理器对象及处理器拦截器(如果有则生成),一并返回给DispatcherServlet;(4)DispatcherServlet 调用 HandlerAdapter处理器适配器,申请执行Handler;(5)HandlerAdapter 通过适配调用 具体处理器进行解决业务逻辑;(6)Handler执行实现返回ModelAndView;(7)HandlerAdapter将Handler执行后果ModelAndView返回给DispatcherServlet;(8)DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;(9)ViewResolver解析后返回具体View;(10)DispatcherServlet对View进行渲染视图(行将模型数据填充至视图中)(11)DispatcherServlet响应用户。 前端控制器 DispatcherServlet:接管申请、响应后果,相当于转发器,有了DispatcherServlet 就缩小了其它组件之间的耦合度。处理器映射器 HandlerMapping:依据申请的URL来查找Handler处理器适配器 HandlerAdapter:负责执行Handler处理器 Handler:处理器,须要程序员开发视图解析器 ViewResolver:进行视图的解析,依据视图逻辑名将ModelAndView解析成真正的视图(view)视图View:View是一个接口, 它的实现类反对不同的视图类型,如jsp,freemarker,pdf等等3、Springmvc的长处: (1)能够反对各种视图技术,而不仅仅局限于JSP; (2)与Spring框架集成(如IoC容器、AOP等); (3)清晰的角色调配:前端控制器(dispatcherServlet) ,申请到处理器映射(handlerMapping),处理器适配器(HandlerAdapter),视图解析器(ViewResolver)。 (4) 反对各种申请资源的映射策略。 4、SpringMVC怎么样设定重定向和转发的? (1)转发:在返回值后面加"forward:",譬如"forward:user.do?name=method4" (2)重定向:在返回值后面加"redirect:",譬如"redirect:http://www.baidu.com" 5、 SpringMVC罕用的注解有哪些? @RequestMapping:用于解决申请 url 映射的注解,可用于类或办法上。用于类上,则示意类中的所有响应申请的办法都是以该地址作为父门路。 @RequestBody:注解实现接管http申请的json数据,将json转换为java对象。 @ResponseBody:注解实现将conreoller办法返回对象转化为json对象响应给客户。 6、SpingMvc中的控制器的注解个别用哪个?有没有别的注解能够代替? 答:个别用@Controller注解,也能够应用@RestController,@RestController注解相当于@ResponseBody + @Controller,示意是体现层,除此之外,个别不必别的注解代替。 7、springMVC和struts2的区别有哪些? (1)springmvc的入口是一个servlet即前端控制器(DispatchServlet),而struts2入口是一个filter过虑器(StrutsPrepareAndExecuteFilter)。 (2)springmvc是基于办法开发(一个url对应一个办法),申请参数传递到办法的形参,能够设计为单例或多例(倡议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。 (3)Struts采纳值栈存储申请和响应的数据,通过OGNL存取数据,springmvc通过参数解析器是将request申请内容解析,并给办法形参赋值,将数据和视图封装成ModelAndView对象,最初又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认应用jstl。 8、如何解决POST申请中文乱码问题,GET的又如何解决呢? (1)解决post申请乱码问题:在web.xml中配置一个CharacterEncodingFilter过滤器,设置成utf-8; 1. <filter> 2.     <filter-name>CharacterEncodingFilter</filter-name> 3.     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 4.     <init-param> 5.         <param-name>encoding</param-name> 6.         <param-value>utf-8</param-value> 7.     </init-param> 8. </filter> 10. <filter-mapping> 11.     <filter-name>CharacterEncodingFilter</filter-name> 12.     <url-pattern>/*</url-pattern> 13. </filter-mapping> (2)get申请中文参数呈现乱码解决办法有两个: ①批改tomcat配置文件增加编码与工程编码统一,如下: ...

January 11, 2021 · 1 min · jiezi

关于面试:脱发篇多线程基础下-朋友-来看看你知道多少

看完了,发现对你有用的话点个赞吧! 继续致力更新学习中!!多线程其余的局部点击我的头像查看更多哦! 知识点 标注:在学习中须要批改的内容以及笔记全在这里 www.javanode.cn,谢谢!有任何不妥的中央望纠正 线程创立1. 创立形式持续Thread类实现Runable接口实现Callable接口,并与Future、线程池联合应用,1. 继承Thread Thread thread = new Thread(){ @Override public void run() { System.out.println("this is new thread"); } }; thread.start();2. 实现runable接口 Thread thread1 = new Thread(new Runnable() { public void run() { System.out.println("impl runnable thread"); } }); thread1.start();3. 实现Callable接口 /** * 3.实现callable接口,提交给ExecutorService返回的是异步执行的后果 */ ExecutorService executorService = Executors.newSingleThreadExecutor(); Future<String> submit = executorService.submit(new Callable<String>() { public String call() throws Exception { return "three new callable thread"; } }); String returnString = submit.get(); System.out.println(returnString);2. 总结实现Runnable接口比继承Thread类所具备的劣势:1):适宜多个雷同的程序代码的线程去解决同一个资源 ...

January 11, 2021 · 4 min · jiezi

关于面试:吐血整理超全golang面试题合集学习指南知识图谱-涵盖大部分golang程序员所需要掌握的核心知识

因为外链问题,完整版可【点击】浏览原文或到 github我的项目 中,欢送关注。 目录(善用Ctrl+F)根底入门老手Golang开发老手常犯的50个谬误数据类型连nil切片和空切片一不一样都不分明?那BAT面试官只好让你回去等告诉了。golang面试题:字符串转成byte数组,会产生内存拷贝吗?golang面试题:翻转含有中文、数字、英文字母的字符串golang面试题:拷贝大切片肯定比小切片代价大吗?map不初始化应用会怎么样map不初始化长度和初始化长度的区别map承载多大,大了怎么办map的iterator是否平安?能不能一边delete一边遍历?字符串不能改,那转成数组能改吗,怎么改怎么判断一个数组是否曾经排序一般map如何不必锁解决协程平安问题array和slice的区别golang面试题:json包变量不加tag会怎么样?零切片、空切片、nil切片是什么slice深拷贝和浅拷贝map触发扩容的机会,满足什么条件时扩容?map扩容策略是什么自定义类型切片转字节切片和字节切片转回主动以类型切片make和new什么区别slice ,map,chanel创立的时候的几个参数什么含意线程平安的map怎么实现 流程管制昨天那个在for循环里append元素的共事,明天还在么?golang面试官:for select时,如果通道曾经敞开会怎么样?如果只有一个case呢?进阶包治理学go mod就够了!优化golang面试题:怎么防止内存逃逸?golang面试题:简略聊聊内存逃逸?给大家争脸了,用了三年golang,我还是没答对这道内存透露题内存碎片化问题chan相干的goroutine泄露的问题string相干的goroutine泄露的问题你肯定会遇到的内存回收策略导致的疑似内存透露的问题sync.Pool的实用场景go1.13sync.Pool比照go1.12版本优化点并发编程golang面试题:对曾经敞开的的chan进行读写,会怎么样?为什么?golang面试题:对未初始化的的chan进行读写,会怎么样?为什么?sync.map 的优缺点和应用场景sync.Map的优化点包罕用官网包阐明罕用第三方包阐明罕用框架残缺规范库列表优良的第三方库 音频和音乐数据结构:Go中的通用数据结构和算法分布式系统:Go中的通用数据结构和算法电子邮件:实现电子邮件创立和发送的库和工具嵌入式脚本语言:在go代码中嵌入其余语言错误处理解决文件和文件系统的库金融:会计和财务软件包游戏开发:游戏开发相干库地理位置:天文相干的地位信息和工具库编译器相干:转到其余语言Goroutines:用于治理和应用Goroutines的工具图形界面:用于构建GUI应用程序的库图片:用于解决图像的库物联网:物联网设施编程库JSON格局:用于解决JSON的库机器学习:罕用机器学习库微软办公软件自然语言解决网络:与网络各层配合应用的库视频:用于解决视频的库高级个性golang面试题:能说说uintptr和unsafe.Pointer的区别吗?golang 面试题:reflect(反射包)如何获取字段 tag?为什么 json 包不能导出公有变量的 tag?协程和线程的差异垃圾回收的过程是怎么样的?什么是写屏障、混合写屏障,如何实现?开源库里会有一些相似上面这种奇怪的用法:var _ io.Writer = (*myWriter)(nil),是为什么?GMP模型协程之间是怎么调度的gc的stw是怎么回事利用golang个性,设计一个QPS为500的服务器为什么gc会让程序变慢开多个线程和开多个协程会有什么区别两个interface{} 能不能比拟必须要手动对齐内存的状况go栈扩容和栈缩容,间断栈的毛病golang怎么做代码优化golang暗藏技能:怎么拜访公有成员问题排查tracepprof源码浏览sync.mapnet/httpmutexchannelcontextselect实现原理main函数背地的启动过程内存治理GC垃圾回收timer汇编汇编入门举荐书籍视频教程实际常用工具mysql建表语句转golang structjson转golang structtoml转golang structyaml转golang struct 其余罕用官网包fmt - 实现格式化的输入输出操作,其中的fmt.Printf()和fmt.Println()是开发者应用最为频繁的函数。  io - 实现了一系列非平台相干的IO相干接口和实现,比方提供了对os中零碎相干的IO性能的封装。咱们在进行流式读写(比方读写文件)时,通常会用到该包。  bufio - 它在io的根底上提供了缓存性能。在具备了缓存性能后, bufio能够比拟不便地提供ReadLine之类的操作。  strconv - 提供字符串与根本数据类型互转的能力。  os - 本包提供了对操作系统性能的非平台相干拜访接口。接口为Unix格调。提供的性能包含文件操作、过程治理、信号和用户账号等。  sync - 它提供了根本的同步原语。在多个goroutine访问共享资源的时候,须要应用sync中提供的锁机制。  flag - 它提供命令行参数的规定定义和传入参数解析的性能。绝大部分的命令行程序都须要用到这个包。  encoding/json - JSON目前宽泛用做网络程序中的通信格局。本包提供了对JSON的根本反对,比方从一个对象序列化为JSON字符串,或者从JSON字符串反序列化出一个具体的对象等。  http - 通过http包,只须要数行代码,即可实现一个爬虫或者一个Web服务器,这在传统语言中是无奈设想的。  罕用第三方包数据库操作 - github.com/jinzhu/gorm github.com/go-xorm/xorm搜寻es - github.com/olivere/elasticrocketmq操作 - github.com/apache/rocketmq-client-go/v2rabbitmq 操作 - github.com/streadway/amqpredis 操作 - github.com/go-redis/redisetcd 操作 - github.com/coreos/etcd/clientv3kafka - https://github.com/Shopify/sarama https://github.com/bsm/sarama-clusterexcel 操作 - github.com/360EntSecGroup-Skylar/excelizeppt 操作 - golang.org/x/tools/cmd/presentgo-svg 操作 - https://github.com/ajstarks/svgogo 布隆过滤器实现 - https://github.com/AndreasBriese/bbloomjson相干 - https://github.com/bitly/go-simplejsonLRU Cache实现 - https://github.com/bluele/gcache https://github.com/hashicorp/golang-lru go运行时函数替换 - https://github.com/bouk/monkey toml - https://github.com/toml-lang/toml https://github.com/naoina/toml yaml - https://github.com/go-yaml/yaml viper - https://github.com/spf13/viper go key/value存储 - https://github.com/etcd-io/bbolt 基于ringbuffer的无锁golang workpool - https://github.com/Dai0522/workpool 轻量级的协程池 - https://github.com/ivpusic/grpool 打印go的具体数据结构 - https://github.com/davecgh/go-spew 基于ringbuffer实现的队列 - https://github.com/eapache/queue 拼音 - https://github.com/go-ego/gpy 分词 - https://github.com/go-ego/gse 搜寻 - https://github.com/go-ego/riot windows COM - https://github.com/go-ego/cedar session - https://github.com/gorilla/sessions 路由 - https://github.com/gorilla/mux websocket - https://github.com/gorilla/websocket Action handler - https://github.com/gorilla/handlers csrf - https://github.com/gorilla/csrf context - https://github.com/gorilla/context 过滤html标签 - https://github.com/grokify/html-strip-tags-go 可配置的HTML标签过滤 - https://github.com/microcosm-cc/bluemonday 依据IP获取地理位置信息 - https://github.com/ipipdotnet/ipdb-go html转markdown - https://github.com/jaytaylor/html2text goroutine 本地存储 - https://github.com/jtolds/gls 黑白输入 - https://github.com/mgutz/ansi表格打印 - https://github.com/olekukonko/tablewriterreflect 更高效的反射API - https://github.com/modern-go/reflect2msgfmt (格式化字符串,将%更换为变量名) - https://github.com/modern-go/msgfmt可勾销的goroutine - https://github.com/modern-go/concurrent深度拷贝 - https://github.com/mohae/deepcopy平安的类型转换包 - https://github.com/spf13/cast从文本中提取链接 - https://github.com/mvdan/xurls字符串格局解决(驼峰转换) - https://godoc.org/github.com/naoina/go-stringutil文本diff实现 - https://github.com/pmezard/go-difflibuuid相干 - https://github.com/satori/go.uuid https://github.com/snluu/uuid去除UTF编码中的BOM - https://github.com/ssor/bom图片缩放 - https://github.com/nfnt/resize生成 mock server - https://github.com/otokaze/mockgo 性能上报到influxdb - https://github.com/rcrowley/go-metricsgo zookeeper客户端 - https://github.com/samuel/go-zookeepergo thrift - https://github.com/samuel/go-thriftMQTT 客户端 - https://github.com/shirou/mqttclihbase - https://github.com/tsuna/gohbasego 性能上报到influxdb - https://github.com/rcrowley/go-metricsgo 性能上报到prometheus - https://github.com/deathowl/go-metrics-prometheusps utils - https://github.com/shirou/gopsutil小数解决 - https://github.com/shopspring/decimal结构化日志解决(json) - https://github.com/sirupsen/logrus命令行程序框架 cli - https://github.com/urfave/cli命令行程序框架 cobra - https://github.com/spf13/cobra必看我的项目gin - github.com/olivere/elastic - 轻量级web框架,很多公司都是基于它进行魔改beego - github.com/beego/beego - 也是web框架,比拟全能kratos - github.com/go-kratos/kratos - bilibili开源的微服务框架,b站出品必属于精- 品TiDB - github.com/pingcap/tidb - 见识过mysql性能瓶颈之后你会想要抉择的一款数据库 ...

January 11, 2021 · 7 min · jiezi

关于面试:吐血整理超全golang面试题合集学习指南知识图谱-涵盖大部分golang程序员所需要掌握的核心知识

因为外链问题,完整版可【点击】浏览原文或到 github我的项目 中,欢送关注。 目录(善用Ctrl+F)根底入门老手Golang开发老手常犯的50个谬误数据类型连nil切片和空切片一不一样都不分明?那BAT面试官只好让你回去等告诉了。golang面试题:字符串转成byte数组,会产生内存拷贝吗?golang面试题:翻转含有中文、数字、英文字母的字符串golang面试题:拷贝大切片肯定比小切片代价大吗?map不初始化应用会怎么样map不初始化长度和初始化长度的区别map承载多大,大了怎么办map的iterator是否平安?能不能一边delete一边遍历?字符串不能改,那转成数组能改吗,怎么改怎么判断一个数组是否曾经排序一般map如何不必锁解决协程平安问题array和slice的区别golang面试题:json包变量不加tag会怎么样?零切片、空切片、nil切片是什么slice深拷贝和浅拷贝map触发扩容的机会,满足什么条件时扩容?map扩容策略是什么自定义类型切片转字节切片和字节切片转回主动以类型切片make和new什么区别slice ,map,chanel创立的时候的几个参数什么含意线程平安的map怎么实现 流程管制昨天那个在for循环里append元素的共事,明天还在么?golang面试官:for select时,如果通道曾经敞开会怎么样?如果只有一个case呢?进阶包治理学go mod就够了!优化golang面试题:怎么防止内存逃逸?golang面试题:简略聊聊内存逃逸?给大家争脸了,用了三年golang,我还是没答对这道内存透露题内存碎片化问题chan相干的goroutine泄露的问题string相干的goroutine泄露的问题你肯定会遇到的内存回收策略导致的疑似内存透露的问题sync.Pool的实用场景go1.13sync.Pool比照go1.12版本优化点并发编程golang面试题:对曾经敞开的的chan进行读写,会怎么样?为什么?golang面试题:对未初始化的的chan进行读写,会怎么样?为什么?sync.map 的优缺点和应用场景sync.Map的优化点包罕用官网包阐明罕用第三方包阐明罕用框架残缺规范库列表优良的第三方库 音频和音乐数据结构:Go中的通用数据结构和算法分布式系统:Go中的通用数据结构和算法电子邮件:实现电子邮件创立和发送的库和工具嵌入式脚本语言:在go代码中嵌入其余语言错误处理解决文件和文件系统的库金融:会计和财务软件包游戏开发:游戏开发相干库地理位置:天文相干的地位信息和工具库编译器相干:转到其余语言Goroutines:用于治理和应用Goroutines的工具图形界面:用于构建GUI应用程序的库图片:用于解决图像的库物联网:物联网设施编程库JSON格局:用于解决JSON的库机器学习:罕用机器学习库微软办公软件自然语言解决网络:与网络各层配合应用的库视频:用于解决视频的库高级个性golang面试题:能说说uintptr和unsafe.Pointer的区别吗?golang 面试题:reflect(反射包)如何获取字段 tag?为什么 json 包不能导出公有变量的 tag?协程和线程的差异垃圾回收的过程是怎么样的?什么是写屏障、混合写屏障,如何实现?开源库里会有一些相似上面这种奇怪的用法:var _ io.Writer = (*myWriter)(nil),是为什么?GMP模型协程之间是怎么调度的gc的stw是怎么回事利用golang个性,设计一个QPS为500的服务器为什么gc会让程序变慢开多个线程和开多个协程会有什么区别两个interface{} 能不能比拟必须要手动对齐内存的状况go栈扩容和栈缩容,间断栈的毛病golang怎么做代码优化golang暗藏技能:怎么拜访公有成员问题排查tracepprof源码浏览sync.mapnet/httpmutexchannelcontextselect实现原理main函数背地的启动过程内存治理GC垃圾回收timer汇编汇编入门举荐书籍视频教程实际常用工具mysql建表语句转golang structjson转golang structtoml转golang structyaml转golang struct 其余罕用官网包fmt - 实现格式化的输入输出操作,其中的fmt.Printf()和fmt.Println()是开发者应用最为频繁的函数。  io - 实现了一系列非平台相干的IO相干接口和实现,比方提供了对os中零碎相干的IO性能的封装。咱们在进行流式读写(比方读写文件)时,通常会用到该包。  bufio - 它在io的根底上提供了缓存性能。在具备了缓存性能后, bufio能够比拟不便地提供ReadLine之类的操作。  strconv - 提供字符串与根本数据类型互转的能力。  os - 本包提供了对操作系统性能的非平台相干拜访接口。接口为Unix格调。提供的性能包含文件操作、过程治理、信号和用户账号等。  sync - 它提供了根本的同步原语。在多个goroutine访问共享资源的时候,须要应用sync中提供的锁机制。  flag - 它提供命令行参数的规定定义和传入参数解析的性能。绝大部分的命令行程序都须要用到这个包。  encoding/json - JSON目前宽泛用做网络程序中的通信格局。本包提供了对JSON的根本反对,比方从一个对象序列化为JSON字符串,或者从JSON字符串反序列化出一个具体的对象等。  http - 通过http包,只须要数行代码,即可实现一个爬虫或者一个Web服务器,这在传统语言中是无奈设想的。  罕用第三方包数据库操作 - github.com/jinzhu/gorm github.com/go-xorm/xorm搜寻es - github.com/olivere/elasticrocketmq操作 - github.com/apache/rocketmq-client-go/v2rabbitmq 操作 - github.com/streadway/amqpredis 操作 - github.com/go-redis/redisetcd 操作 - github.com/coreos/etcd/clientv3kafka - https://github.com/Shopify/sarama https://github.com/bsm/sarama-clusterexcel 操作 - github.com/360EntSecGroup-Skylar/excelizeppt 操作 - golang.org/x/tools/cmd/presentgo-svg 操作 - https://github.com/ajstarks/svgogo 布隆过滤器实现 - https://github.com/AndreasBriese/bbloomjson相干 - https://github.com/bitly/go-simplejsonLRU Cache实现 - https://github.com/bluele/gcache https://github.com/hashicorp/golang-lru go运行时函数替换 - https://github.com/bouk/monkey toml - https://github.com/toml-lang/toml https://github.com/naoina/toml yaml - https://github.com/go-yaml/yaml viper - https://github.com/spf13/viper go key/value存储 - https://github.com/etcd-io/bbolt 基于ringbuffer的无锁golang workpool - https://github.com/Dai0522/workpool 轻量级的协程池 - https://github.com/ivpusic/grpool 打印go的具体数据结构 - https://github.com/davecgh/go-spew 基于ringbuffer实现的队列 - https://github.com/eapache/queue 拼音 - https://github.com/go-ego/gpy 分词 - https://github.com/go-ego/gse 搜寻 - https://github.com/go-ego/riot windows COM - https://github.com/go-ego/cedar session - https://github.com/gorilla/sessions 路由 - https://github.com/gorilla/mux websocket - https://github.com/gorilla/websocket Action handler - https://github.com/gorilla/handlers csrf - https://github.com/gorilla/csrf context - https://github.com/gorilla/context 过滤html标签 - https://github.com/grokify/html-strip-tags-go 可配置的HTML标签过滤 - https://github.com/microcosm-cc/bluemonday 依据IP获取地理位置信息 - https://github.com/ipipdotnet/ipdb-go html转markdown - https://github.com/jaytaylor/html2text goroutine 本地存储 - https://github.com/jtolds/gls 黑白输入 - https://github.com/mgutz/ansi表格打印 - https://github.com/olekukonko/tablewriterreflect 更高效的反射API - https://github.com/modern-go/reflect2msgfmt (格式化字符串,将%更换为变量名) - https://github.com/modern-go/msgfmt可勾销的goroutine - https://github.com/modern-go/concurrent深度拷贝 - https://github.com/mohae/deepcopy平安的类型转换包 - https://github.com/spf13/cast从文本中提取链接 - https://github.com/mvdan/xurls字符串格局解决(驼峰转换) - https://godoc.org/github.com/naoina/go-stringutil文本diff实现 - https://github.com/pmezard/go-difflibuuid相干 - https://github.com/satori/go.uuid https://github.com/snluu/uuid去除UTF编码中的BOM - https://github.com/ssor/bom图片缩放 - https://github.com/nfnt/resize生成 mock server - https://github.com/otokaze/mockgo 性能上报到influxdb - https://github.com/rcrowley/go-metricsgo zookeeper客户端 - https://github.com/samuel/go-zookeepergo thrift - https://github.com/samuel/go-thriftMQTT 客户端 - https://github.com/shirou/mqttclihbase - https://github.com/tsuna/gohbasego 性能上报到influxdb - https://github.com/rcrowley/go-metricsgo 性能上报到prometheus - https://github.com/deathowl/go-metrics-prometheusps utils - https://github.com/shirou/gopsutil小数解决 - https://github.com/shopspring/decimal结构化日志解决(json) - https://github.com/sirupsen/logrus命令行程序框架 cli - https://github.com/urfave/cli命令行程序框架 cobra - https://github.com/spf13/cobra必看我的项目gin - github.com/olivere/elastic - 轻量级web框架,很多公司都是基于它进行魔改beego - github.com/beego/beego - 也是web框架,比拟全能kratos - github.com/go-kratos/kratos - bilibili开源的微服务框架,b站出品必属于精- 品TiDB - github.com/pingcap/tidb - 见识过mysql性能瓶颈之后你会想要抉择的一款数据库 ...

January 11, 2021 · 7 min · jiezi

关于面试:阿里面试官MySQL如何设计索引更高效

有情怀,有干货,微信搜寻【三太子敖丙】关注这个不一样的程序员。本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试残缺考点、材料以及我的系列文章。 前言数据库系列更新到当初我想大家对所有的概念都已有个大略意识了,这周我在看评论的时候我发现有个网友的发问我觉得很有意思:帅丙如何设计一个索引?你们都是怎么设计索引的?怎么设计更高效? 我一想索引我写过很多了呀,没道理读者还不会啊,然而我一回头看完,那的确,我就写了索引的概念,优劣势,没提到怎么设计,那这篇文章又这样应运而生了。 本文还是会有很多之前写过的反复概念,然而也是为了大家能更好的了解MySQL中几种索引设计的原理。 注释咱们晓得,索引是一个基于链表实现的树状Tree构造,可能疾速的检索数据,目前简直所RDBMS数据库都实现了索引个性,比方MySQL的B+Tree索引,MongoDB的BTree索引等。 在业务开发过程中,索引设计高效与否决定了接口对应SQL的执行效率,高效的索引能够升高接口的Response Time,同时还能够降低成本,咱们要事实的指标是:索引设计->升高接口响应工夫->升高服务器配置->降低成本,最终要落实到老本上来,因为老板最关怀的是老本。 明天就跟大家聊聊MySQL中的索引以及如何设计索引,应用索引能力提升高接口的RT,进步用户体检。 MySQL中的索引MySQL中的InnoDB引擎应用B+Tree构造来存储索引,能够尽量减少数据查问时磁盘IO次数,同时树的高度间接影响了查问的性能,个别树的高度维持在 3~4 层。 B+Tree由三局部组成:根root、枝branch以及Leaf叶子,其中root和branch不存储数据,只存储指针地址,数据全副存储在Leaf Node,同时Leaf Node之间用双向链表链接,构造如下: 从下面能够看到,每个Leaf Node是三局部组成的,即前驱指针p_prev,数据data以及后继指针p_next,同时数据data是有序的,默认是升序ASC,散布在B+tree左边的键值总是大于右边的,同时从root到每个Leaf的间隔是相等的,也就是拜访任何一个Leaf Node须要的IO是一样的,即索引树的高度Level + 1次IO操作。 咱们能够将MySQL中的索引能够看成一张小表,占用磁盘空间,创立索引的过程其实就是依照索引列排序的过程,先在sort_buffer_size进行排序,如果排序的数据量大,sort_buffer_size容量不下,就须要通过临时文件来排序,最重要的是通过索引能够防止排序操作(distinct,group by,order by)。 汇集索引MySQL中的表是IOT(Index Organization Table,索引组织表),数据依照主键id顺序存储(逻辑上是间断,物理上不间断),而且主键id是汇集索引(clustered index),存储着整行数据,如果没有显示的指定主键,MySQL会将所有的列组合起来结构一个row_id作为primary key,例如表users(id, user_id, user_name, phone, primary key(id)),id是汇集索引,存储了id, user_id, user_name, phone整行的数据。 辅助索引 辅助索引也称为二级索引,索引中除了存储索引列外,还存储了主键id,对于user_name的索引idx_user_name(user_name)而言,其实等价于idx_user_name(user_name, id),MySQL会主动在辅助索引的最初增加上主键id,相熟Oracle数据库的都晓得,索引里除了索引列还存储了row_id(代表数据的物理地位,由四局部组成:对象编号+数据文件号+数据块号+数据行号),咱们在创立辅助索引也能够显示增加主键id。 -- 创立user_name列上的索引mysql> create index idx_user_name on users(user_name);-- 显示增加主键id创立索引mysql> create index idx_user_name_id on users(user_name,id);-- 比照两个索引的统计数据mysql> select a.space as tbl_spaceid, a.table_id, a.name as table_name, row_format, space_type, b.index_id , b.name as index_name, n_fields, page_no, b.type as index_type from information_schema.INNODB_TABLES a left join information_schema.INNODB_INDEXES b on a.table_id =b.table_id where a.name = 'test/users';+-------------+----------+------------+------------+------------+----------+------------------+----------+------| tbl_spaceid | table_id | table_name | row_format | space_type | index_id | index_name | n_fields | page_no | index_type |+-------------+----------+------------+------------+------------+----------+------------------+----------+------| 518 | 1586 | test/users | Dynamic | Single | 1254 | PRIMARY | 9 | 4 | 3 || 518 | 1586 | test/users | Dynamic | Single | 4003 | idx_user_name | 2 | 5 | 0 || 518 | 1586 | test/users | Dynamic | Single | 4004 | idx_user_name_id | 2 | 45 | 0 |mysql> select index_name, last_update, stat_name, stat_value, stat_description from mysql.innodb_index_stats where index_name in ('idx_user_name','idx_user_name_id');+------------------+---------------------+--------------+------------+-----------------------------------+| index_name | last_update | stat_name | stat_value | stat_description |+------------------+---------------------+--------------+------------+-----------------------------------+ | idx_user_name | 2021-01-02 17:14:48 | n_leaf_pages | 1358 | Number of leaf pages in the index || idx_user_name | 2021-01-02 17:14:48 | size | 1572 | Number of pages in the index || idx_user_name_id | 2021-01-02 17:14:48 | n_leaf_pages | 1358 | Number of leaf pages in the index || idx_user_name_id | 2021-01-02 17:14:48 | size | 1572 | Number of pages in the index |比照一下两个索引的后果,n_fields示意索引中的列数,n_leaf_pages示意索引中的叶子页数,size示意索引中的总页数,通过数据比对就能够看到,辅助索引中的确蕴含了主键id,也阐明了这两个索引时完全一致。 ...

January 11, 2021 · 6 min · jiezi

关于面试:阿里面试官MySQL如何设计索引更高效

有情怀,有干货,微信搜寻【三太子敖丙】关注这个不一样的程序员。本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试残缺考点、材料以及我的系列文章。 前言数据库系列更新到当初我想大家对所有的概念都已有个大略意识了,这周我在看评论的时候我发现有个网友的发问我觉得很有意思:帅丙如何设计一个索引?你们都是怎么设计索引的?怎么设计更高效? 我一想索引我写过很多了呀,没道理读者还不会啊,然而我一回头看完,那的确,我就写了索引的概念,优劣势,没提到怎么设计,那这篇文章又这样应运而生了。 本文还是会有很多之前写过的反复概念,然而也是为了大家能更好的了解MySQL中几种索引设计的原理。 注释咱们晓得,索引是一个基于链表实现的树状Tree构造,可能疾速的检索数据,目前简直所RDBMS数据库都实现了索引个性,比方MySQL的B+Tree索引,MongoDB的BTree索引等。 在业务开发过程中,索引设计高效与否决定了接口对应SQL的执行效率,高效的索引能够升高接口的Response Time,同时还能够降低成本,咱们要事实的指标是:索引设计->升高接口响应工夫->升高服务器配置->降低成本,最终要落实到老本上来,因为老板最关怀的是老本。 明天就跟大家聊聊MySQL中的索引以及如何设计索引,应用索引能力提升高接口的RT,进步用户体检。 MySQL中的索引MySQL中的InnoDB引擎应用B+Tree构造来存储索引,能够尽量减少数据查问时磁盘IO次数,同时树的高度间接影响了查问的性能,个别树的高度维持在 3~4 层。 B+Tree由三局部组成:根root、枝branch以及Leaf叶子,其中root和branch不存储数据,只存储指针地址,数据全副存储在Leaf Node,同时Leaf Node之间用双向链表链接,构造如下: 从下面能够看到,每个Leaf Node是三局部组成的,即前驱指针p_prev,数据data以及后继指针p_next,同时数据data是有序的,默认是升序ASC,散布在B+tree左边的键值总是大于右边的,同时从root到每个Leaf的间隔是相等的,也就是拜访任何一个Leaf Node须要的IO是一样的,即索引树的高度Level + 1次IO操作。 咱们能够将MySQL中的索引能够看成一张小表,占用磁盘空间,创立索引的过程其实就是依照索引列排序的过程,先在sort_buffer_size进行排序,如果排序的数据量大,sort_buffer_size容量不下,就须要通过临时文件来排序,最重要的是通过索引能够防止排序操作(distinct,group by,order by)。 汇集索引MySQL中的表是IOT(Index Organization Table,索引组织表),数据依照主键id顺序存储(逻辑上是间断,物理上不间断),而且主键id是汇集索引(clustered index),存储着整行数据,如果没有显示的指定主键,MySQL会将所有的列组合起来结构一个row_id作为primary key,例如表users(id, user_id, user_name, phone, primary key(id)),id是汇集索引,存储了id, user_id, user_name, phone整行的数据。 辅助索引 辅助索引也称为二级索引,索引中除了存储索引列外,还存储了主键id,对于user_name的索引idx_user_name(user_name)而言,其实等价于idx_user_name(user_name, id),MySQL会主动在辅助索引的最初增加上主键id,相熟Oracle数据库的都晓得,索引里除了索引列还存储了row_id(代表数据的物理地位,由四局部组成:对象编号+数据文件号+数据块号+数据行号),咱们在创立辅助索引也能够显示增加主键id。 -- 创立user_name列上的索引mysql> create index idx_user_name on users(user_name);-- 显示增加主键id创立索引mysql> create index idx_user_name_id on users(user_name,id);-- 比照两个索引的统计数据mysql> select a.space as tbl_spaceid, a.table_id, a.name as table_name, row_format, space_type, b.index_id , b.name as index_name, n_fields, page_no, b.type as index_type from information_schema.INNODB_TABLES a left join information_schema.INNODB_INDEXES b on a.table_id =b.table_id where a.name = 'test/users';+-------------+----------+------------+------------+------------+----------+------------------+----------+------| tbl_spaceid | table_id | table_name | row_format | space_type | index_id | index_name | n_fields | page_no | index_type |+-------------+----------+------------+------------+------------+----------+------------------+----------+------| 518 | 1586 | test/users | Dynamic | Single | 1254 | PRIMARY | 9 | 4 | 3 || 518 | 1586 | test/users | Dynamic | Single | 4003 | idx_user_name | 2 | 5 | 0 || 518 | 1586 | test/users | Dynamic | Single | 4004 | idx_user_name_id | 2 | 45 | 0 |mysql> select index_name, last_update, stat_name, stat_value, stat_description from mysql.innodb_index_stats where index_name in ('idx_user_name','idx_user_name_id');+------------------+---------------------+--------------+------------+-----------------------------------+| index_name | last_update | stat_name | stat_value | stat_description |+------------------+---------------------+--------------+------------+-----------------------------------+ | idx_user_name | 2021-01-02 17:14:48 | n_leaf_pages | 1358 | Number of leaf pages in the index || idx_user_name | 2021-01-02 17:14:48 | size | 1572 | Number of pages in the index || idx_user_name_id | 2021-01-02 17:14:48 | n_leaf_pages | 1358 | Number of leaf pages in the index || idx_user_name_id | 2021-01-02 17:14:48 | size | 1572 | Number of pages in the index |比照一下两个索引的后果,n_fields示意索引中的列数,n_leaf_pages示意索引中的叶子页数,size示意索引中的总页数,通过数据比对就能够看到,辅助索引中的确蕴含了主键id,也阐明了这两个索引时完全一致。 ...

January 11, 2021 · 6 min · jiezi

关于面试:2020年裸辞后面试记录笔记

在裸辞了四个月后,山月在除夕前找工作,面试了几个大小公司,记录上面试题。 本文地址: https://q.shanyue.tech/interv... 01 如何实现选中复制的性能<blockquote> 更多形容: 在一些博客零碎,如掘金的博客中,能够复制代码,它是如何实现的 </blockquote> 在 Issue 或者我的网站中交换与探讨: 01 如何实现选中复制的性能它个别能够应用第三方库 clipboard.js 来实现,源码很简略,能够读一读 次要有两个要点 选中: Selection API复制: document.execCommand选中: Selection API选中次要利用了 Selection API 选中的代码如下 const selection = window.getSelection();const range = document.createRange();range.selectNodeContents(element);selection.removeAllRanges();selection.addRange(range);selectedText = selection.toString();勾销选中的代码如下 window.getSelection().removeAllRanges();它有现成的第三方库能够应用: select.js 复制: execCommand复制就比较简单了,execCommand document.exec('copy')02 随着 http2 的倒退,前端性能优化中的哪些传统计划能够被代替在 Issue 或者我的网站中交换与探讨: 02 随着 http2 的倒退,前端性能优化中的哪些传统计划能够被代替雪碧图资源文件合并03 既然 http 是无状态协定,那它是如何放弃登录状态在 Issue 或者我的网站中交换与探讨: 03 既然 http 是无状态协定,那它是如何放弃登录状态通过 cookie 或者 Authorization header 来传递凭证,在服务端进行认证 04 http 响应头中的 Date 与 Last-Modified 有什么不同,网站部署时须要留神什么在 Issue 或者我的网站中交换与探讨: 04 http 响应头中的 Date 与 Last-Modified 有什么不同,网站部署时须要留神什么Date: 报文在源服务器的产生工夫,由此可查看报文已缓存了多久工夫Last-Modified: 源服务器上资源的上次批改工夫LM-Factor 与它俩无关。 ...

January 4, 2021 · 5 min · jiezi

关于面试:上岸算法-I-LeetCode-Weekly-Contest-222解题报告

No.1 卡车上的最大单元数 解题思路 优先应用容量大的箱子即可。 代码展现 class Solution { public int maximumUnits(int[][] boxTypes, int truckSize) { Arrays.sort(boxTypes, (a, b) -> (b[1] - a[1])); int res = 0; for (var box : boxTypes) { int cnt = Math.min(truckSize, box[0]); res += cnt * box[1]; truckSize -= cnt; } return res; }}No.2 大餐计数 解题思路 枚举即可。应用一个 Map 记录每种美味度对应的菜品数量。 代码展现 class Solution { public int countPairs(int[] deliciousness) { int res = 0, mod = 1000000007, max = 2 * (1 << 20); Map<Integer, Integer> map = new HashMap<>(); for (int d : deliciousness) { for (int sum = 1; sum <= max; sum *= 2) { res = (res + map.getOrDefault(sum - d, 0)) % mod; } map.put(d, map.getOrDefault(d, 0) + 1); } return res; }}No.3 将数组分成三个子数组的计划数 ...

January 4, 2021 · 3 min · jiezi

关于面试:剑指Offer名企面试官精讲典型编程题第2版-分享下载

书籍信息书名: 剑指Offer:名企面试官精讲典型编程题(第2版)豆瓣评分: 8.9分(254人评估)标签: 面试,算法,计算机,编程,数据结构,找工作,offer,计算机科学,剑指Offer:名企面试官精讲典型编程题(第2版),收费,程序员书籍,编程,pdf,电子书内容简介《剑指Offer:名企面试官精讲典型编程题(第2版)》分析了80个典型的编程面试题,零碎整顿基础知识、代码品质、解题思路、优化效率和综合能力这5个面试要点。《剑指Offer:名企面试官精讲典型编程题(第2版)》共分7章,次要包含面试的流程,探讨面试每一环节须要留神的问题;面试须要的基础知识,从编程语言、数据结构及算法三方面总结程序员面试知识点;高质量的代码,探讨影响代码品质的3个因素(规范性、完整性和鲁棒性),强调高质量代码除实现基本功能外,还能思考非凡状况并对非法输出进行正当解决;解决面试题的思路,总结编程面试中解决难题的无效思考模式,如在面试中遇到简单难题,应聘者可利用画图、举例和合成这3种办法将其化繁为简,先造成清晰思路,再入手编程;优化工夫和空间效率,读者将学会优化工夫效率及用空间换工夫的罕用算法,从而在面试中找到最优解;面试中的各项能力,总结应聘者如何充沛体现学习和沟通能力,并通过具体面试题探讨如何造就常识迁徙、形象建模和发散思维能力;两个面试案例,总结哪些面试行动是不良行为,而哪些体现又是面试官所期待的行为。作者简介何海涛,现美国微软总部资深软件工程师,先后在Autodesk、思科、微软中国等跨国企业任职。著有《剑指Offer——名企面试官精讲典型编程题》、《Coding Interviews: Questions, Analysis and Solutions》(本书英文版)等书。多年来从事软件开发工作,对软件设计、开发、调试等均有较深的功底,对 C/C++、C#以及.NET等语言及平台都较为相熟,对图形图像、CAD、设计模式、项目管理等畛域均有业余教训。下载地址https://590m.com/file/1876512...

December 24, 2020 · 1 min · jiezi

关于面试:三年Java开发每天增删改查终于靠着这份面试题成功上岸京东

前言敌人本科毕业,做了3年外包,每天就是增删改查,坐吃等死状态,心里总感觉这样上来要丸,于是下定决心辞职,在家爆肝三个月,面试了10余家公司,最初拿到了京东Java岗的offer。小编厚着脸皮要敌人总结了他面试过程中常遇到的问题,这里分享给大家,心愿能帮忙到想要面试的小伙伴们。 java根底1、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?2、“static”关键字是什么意思?Java中是否能够笼罩(override)一个private或者是static的办法? 3、是否能够在static环境中拜访非static变量? 4、Java反对的数据类型有哪些?什么是主动拆装箱? 5、Overload和Override的区别。Overloaded的办法是否能够扭转返回值的类型? 6、Java反对多继承么? 7、接口和抽象类的区别是什么? 8、什么是值传递和援用传递? 9、创立线程有几种不同的形式?你喜爱哪一种?为什么? 10、同步办法和同步代码块的区别是什么? 11、什么是死锁(deadlock)? 12、如何确保N个线程能够拜访N个资源同时又不导致死锁? 13、Java汇合类框架的根本接口有哪些? 14、什么是迭代器(Iterator)? 15、Iterator和ListIterator的区别是什么? 16、Java中的HashMap的工作原理是什么? 17、HashMap和Hashtable有什么区别? 18.数组(Array)和列表(ArrayList)有什么区别?什么时候应该应用Array而不是ArrayList? 19.ArrayList和LinkedList有什么区别? 20.如何衡量是应用无序的数组还是有序的数组? 21.HashSet和TreeSet有什么区别? 22.Java中垃圾回收有什么目标?什么时候进行垃圾回收? 23.如果对象的援用被置为null,垃圾收集器是否会立刻开释对象占用的内存? 24.String是最根本的数据类型吗? 框架框架范畴就很大了,个别也会挑你相熟的框架问,比方最常问的就是Spring了,因为这个根本是标配了。Spring最常问的无非就是IoC、AOP、Bean相干的一些货色,比方生命周期,循环依赖解决等。 当然除了Spring,倡议你还要筹备一两个本人相熟的框架。 1、Spring 在ssm中起什么作用?2、Spring的事务? 3、IOC 在我的项目中的作用? 4、Spring的配置文件中的内容? 5、Spring下的注解? 6、Spring DI 的三种形式? 7、Spring次要应用了什么模式? 8、IOC,AOP的实现原理? 一、Spring面试题 1、Spring 在ssm中起什么作用? 2、Spring的事务? 3、IOC 在我的项目中的作用? 4、Spring的配置文件中的内容? 5、Spring下的注解? 6、Spring DI 的三种形式? 7、Spring次要应用了什么模式? 8、IOC,AOP的实现原理? SpringMvc面试题1、SpringMvc 的控制器是不是单例模式,如果是,有什么问题,怎么解决?2、SpringMvc 中控制器的注解? 3、@RequestMapping 注解用在类上的作用? 4、前台多个参数,这些参数都是一个对象,疾速失去对象? 5、SpringMvc中函数的返回值? 6、SpringMvc中的转发和重定向? 7、SpringMvc和Ajax之间的互相调用? 8、Struts2 和 SpringMvc的区别? Mybatis面试题1、Ibatis和Mybatis?2、什么是Mybatis的接口绑定,有什么益处? 3、什么状况用注解,什么状况用xml绑定? 4、Mybatis在外围解决类叫什么? 5、查问表名和返回实体Bean对象不统一,如何解决? ...

December 18, 2020 · 1 min · jiezi

关于面试:17张思维导图2021年作为一名前端开发者需要掌握这些前端面试复习资料参考大纲

本文首发于17张思维导图,2021年作为一名前端开发者须要把握这些,前端面试复习资料参考纲要,转载请分割作者前言2020年最初一个月了,熬夜多天整顿出17张思维导图,对前端面试温习知识点进行了最全的总结,分享给大家。每个知识点都尽量找到最好的文章来解释,通过思维导图的模式进行展现。 给大家筹备了高清的思维导图和食用更加不便的PDF文档,全副聚合思维导图一张,分类思维导图17张,波及前端开发的方方面面面,JS根底,工程化,性能优化,平安,框架等。如果您是筹备面试,或者享扩大前端常识,都能够通过这个目录进行学习。 废话不多说,上面分类开展来说,珍藏起来吧 残缺思维导图切实太大,可关注公众号「前端温习课」回复“思维导图”获取高清大图,总共18张。1-Javascript 内置类型介绍一下JS内置类型有哪些 JavaScript 数据类型和数据结构介绍一下typeof辨别类型的原理 JavaScript中typeof原理探索?介绍一下类型转换 深刻了解JS的类型、值、类型转换作用域说说你对javascript的作用域的了解 JavaScript深刻之词法作用域和动静作用域什么是作用域链 JavaScript深刻之作用域链解释下 let 和 const 的块级作用域 ES6块级作用域执行上下文说说你对执行上下文的了解 JavaScript深刻之执行上下文栈深刻了解JavaScript执行上下文和执行栈闭包对闭包的认识,为什么要用闭包?说一下闭包原理以及利用场景 JavaScript闭包的底层运行机制对闭包的认识,为什么要用闭包?说一下闭包原理以及利用场景发现 JavaScript 中闭包的弱小威力闭包问题及优化 闭包问题及解决为什么闭包不会被垃圾回收革除this指向如何确定this指向 彻底搞懂js this指向问题扭转 this 指向的形式都有哪些介绍箭头函数的 this 什么时候你不能应用箭头函数?原型/继承说一下对原型链的了解,画一个经典的原型链图示 进阶必读:深刻了解 JavaScript 原型最详尽的 JS 原型与原型链终极详解,没有「可能是」。(一)最详尽的 JS 原型与原型链终极详解,没有「可能是」。(二)最详尽的 JS 原型与原型链终极详解,没有「可能是」。(三)举例说明js如何实现继承 做完这48道题彻底弄懂JS继承ES5/ES6 的继承除了写法以外还有什么区别 ES5/ES6 的继承除了写法以外还有什么区别?事件循环你对事件循环有理解吗?说说看! Event Loop的标准和实现彻底吃透 JavaScript 执行机制前端中的事件循环eventloop机制微工作和宏工作有什么区别浏览器和Node 事件循环的区别 浏览器与Node的事件循环(Event Loop)有何区别异步编程异步解决方案有哪些 还在找什么,JavaScript的异步编程解决方案全在这里了Promise 实现一个Promise实现Promise.all,race,allSeleted等async/await2-DOM 事件事件冒泡、捕捉等了解 你真的了解 事件冒泡 和 事件捕捉 吗?介绍下浏览器事件委托 事件委托实现一个自定义事件 创立自定义事件dom操作原生JS DOM操作方法汇总地位与大小JavaScript获取DOM元素地位和尺寸大小 JavaScript获取DOM元素地位和尺寸大小3-CSS BFCBFC 是什么?触发 BFC 的条件是什么?有哪些利用场景? 前端面试之BFC怎么答复当面试官问你什么是BFC1px如何解决挪动端 Retina 屏 1px 像素问题 ...

December 9, 2020 · 3 min · jiezi

关于面试:iOS-面试题汇总

1. 简略介绍下NSURLConnection类及+ sendSynchronousRequest:returningResponse:error:与– initWithRequest:delegate:两个办法的区别? 答: NSURLConnection次要用于网络拜访,其中+ sendSynchronousRequest:returningResponse:error:是同步拜访数据,即以后线程会阻塞,并期待request的返回的response,而– initWithRequest:delegate:应用的是异步加载,当其实现网络拜访后,会通过delegate回到主线程,并其委托的对象。2. 在我的项目什么时候抉择应用GCD,什么时候抉择NSOperation 答: 我的项目中应用NSOperation的长处是NSOperation是对线程的高度形象,在我的项目中应用它,会使我的项目的程序结构更好,子类化NSOperation的设计思路,是具备面向对象的长处(复用、封装),使得实现是多线程反对,而接口简略,倡议在简单我的项目中应用。我的项目中应用GCD的长处是GCD自身非常简单、易用,对于不简单的多线程操作,会节俭代码量,而Block参数的应用,会是代码更为易读,倡议在简略我的项目中应用。3. ViewController的didReceiveMemoryWarning怎么被调用 答:[supper didReceiveMemoryWarning];4. 写一个setter办法用于实现@property(nonatomic, retain) NSString *name,写一个setter办法用于实现@property(nonatomic, copy) NSString *name - (void)setName:(NSString *)str{ [str retain]; [_name release]; _name = str;}- (void)setName:(NSString *)str{ id t = [str copy]; [_name release]; _name = t;}5. 对于语句NSString *obj = [[NSData alloc] init]; obj在编译时和运行时别离时什么类型的对象? 答: 编译时是NSString的类型;运行时是NSData类型的对象作为一个ios开发者,遇到问题的时候,有一个学习的气氛跟一个交换圈子特地重要对本身有很大帮忙,众人拾柴火焰高 这是一个我的iOS交换群:711315161,分享BAT,阿里面试题、面试教训,探讨技术, 大家一起交流学习成长!心愿帮忙开发者少走弯路。 6. Object C中创立线程的办法是什么?如果在主线程中执行代码,办法是什么?如果想延时执行代码、办法又是什么? 答:线程创立有三种办法:应用NSThread创立、应用GCD的dispatch、应用子类化的NSOperation,而后将其退出NSOperationQueue;在主线程执行代码,办法是performSelectorOnMainThread,如果想延时执行代码能够用performSelector:onThread:withObject:waitUntilDone:7. 浅复制和深复制的区别? 答:浅层复制:只复制指向对象的指针,而不复制援用对象自身。深层复制:复制援用对象自身。8. PerformSelecter 当调用 NSObject 的performSelecter:afterDelay:后,实际上其外部会创立一个 Timer 并增加到以后线程的 RunLoop 中。所以如果以后线程没有 RunLoop,则这个办法会生效。当调用performSelector:onThread:时,实际上其会创立一个 Timer 加到对应的线程去,同样的,如果对应线程没有 RunLoop 该办法也会生效。9. 优化你是从哪几方面着手? ...

December 8, 2020 · 3 min · jiezi

关于面试:System-design

grooking the system design interview

December 8, 2020 · 1 min · jiezi

关于面试:去年秋招整理了这份后端开发的核心面试题偏Java献给正在校招的你

前言2019年为了秋招,精挑细学了这一份面试题,并且只挑重点和难点,此次整顿包含 Java、数据结构与算法、计算机网络、操作系统、数据库等。如果你能把这些面试题都把握了,那么,我置信你必定能拿到一个不错的 offer,楼主就凭这份面试题拿了腾讯的 offer,尽管有点是面试Java后端开发的,不过对于数据结构与算法,操作系统,数据库,计算机网络这些,无论什么岗位都是通用滴 1. Java 篇(1). Java基础知识 java中==和equals和hashCode的区别int与integer的区别抽象类的意义接口和抽象类的区别是否创立一个蕴含可变对象的不可变对象?谈谈对java多态的了解String、StringBuffer、StringBuilder区别泛型中extends和super的区别过程和线程的区别final,finally,finalize的区别序列化的形式string 转换成 integer的形式及原理动态属性和静态方法是否能够被继承?是否能够被重写?以及起因?成员外部类、动态外部类、部分外部类和匿名外部类的了解,以及我的项目中的利用讲一下常见编码方式?如何格式化日期?Java的异样体系什么是异样链throw和throws的区别反射的原理,反射创立类实例的三种形式是什么。java当中的四种援用深拷贝和浅拷贝的区别是什么?什么是编译器常量?应用它有什么危险?你对String对象的intern()相熟么?a=a+b与a+=b有什么区别吗?动态代理和动静代理的区别,什么场景应用?Java中实现多态的机制是什么?如何将一个Java对象序列化到文件里?说说你对Java反射的了解说说你对Java注解的了解说说你对依赖注入的了解说一下泛型原理,并举例说明Java中String的理解String为什么要设计成不可变的?Object类的equal和hashCode办法重写,为什么?(2).多线程 开启线程的三种形式?说说过程,线程,协程之间的区别线程之间是如何通信的?什么是Daemon线程?它有什么意义?在java中守护线程和本地线程区别?为什么要有线程,而不是仅仅用过程?什么是可重入锁(ReentrantLock)?什么是线程组,为什么在Java中不举荐应用?乐观锁和乐观锁的了解及如何实现,有哪些实现形式?Java中用到的线程调度算法是什么?同步办法和同步块,哪个是更好的抉择?run()和start()办法区别如何管制某个办法容许并发拜访线程的个数?在Java中wait和seelp办法的不同;Thread类中的yield办法有什么作用?什么是不可变对象,它对写并发利用有什么帮忙?谈谈wait/notify关键字的了解为什么wait, notify 和 notifyAll这些办法不在thread类外面?什么导致线程阻塞?讲一下java中的同步的办法谈谈对Synchronized关键字,类锁,办法锁,重入锁的了解static synchronized 办法的多线程拜访和作用同一个类外面两个synchronized办法,两个线程同时拜访的问题你如何确保main()办法所在的线程是Java程序最初完结的线程?谈谈volatile关键字的作用谈谈ThreadLocal关键字的作用谈谈NIO的了解什么是Callable和Future?ThreadLocal、synchronized 和volatile 关键字的区别synchronized与Lock的区别ReentrantLock 、synchronized和volatile比拟在Java中CycliBarriar和CountdownLatch有什么区别?CopyOnWriteArrayList能够用于什么利用场景?ReentrantLock的外部实现lock原理Java中Semaphore是什么?Java中invokeAndWait 和 invokeLater有什么区别?多线程中的忙循环是什么?怎么检测一个线程是否领有锁?死锁的四个必要条件?对象锁和类锁是否会相互影响?什么是线程池,如何应用?Java线程池中submit() 和 execute()办法有什么区别?Java中interrupted 和 isInterruptedd办法的区别?用Java实现阻塞队列BlockingQueue介绍:多线程有什么要留神的问题?如何保障多线程读写文件的平安?多线程断点续传原理断点续传的实现实现生产者消费者模式Java中的ReadWriteLock是什么?用Java写一个会导致死锁的程序,你将怎么解决?SimpleDateFormat是线程平安的吗?Java中的同步汇合与并发汇合有什么区别?Java中ConcurrentHashMap的并发度是什么?什么是Java Timer类?如何创立一个有特定工夫距离的工作?(3).汇合 Collection 和Collections 的区别?批改对象A的equals办法的签名,那么应用HashMap寄存这个对象实例的时候,会调用哪个equals办法?List,Set,Map的区别List和Map的实现形式以及存储形式HashMap的实现原理HashMap如何put数据(从HashMap源码角度解说)?HashMap的扩容操作是怎么实现的?HashMap在JDK1.7和JDK1.8中有哪些不同?ConcurrentHashMap的实现原理HashTable实现原理ArrayMap和HashMap的比照HashMap和HashTable的区别HashMap与HashSet的区别汇合Set实现Hash怎么避免碰撞数组和链表的区别Array和ArrayList有何区别?什么时候更适宜用Array.EnumSet是什么?Comparable和Comparator接口有何区别?Java汇合的疾速失败机制 “fail-fast”?fail-fast 与 fail-safe 之间的区别?BlockingQueue是什么?Iterator类有什么作用poll()办法和remove()办法区别?JAVA8的ConcurrentHashMap为什么放弃了分段锁,有什么问题吗,如果你来设计,你如何设计。(4).JVM 什么状况下会触发类的初始化?谈谈你对解析与分派的意识。你晓得哪些或者你们线上使⽤什么GC策略?它有什么劣势,适⽤于什么场景?Ja0v00a类加载器包00括⼏种0?它们之间的⽗⼦关系是怎么样的?双亲委派机制是什么意思?有什么益处?如何⾃定义⼀个类加载器?你使⽤过哪些或者你在什么场景下须要⼀个⾃定义的类加载器吗?堆内存设置的参数是什么?Perm Space中保留什么数据?会引起OutOfMemory吗?做GC时,⼀个对象在内存各个Space中被挪动的程序是什么?你有没有遇到过OutOfMemory问题?你是怎么来解决这个问题的?解决 过程中有哪些播种?StackOverflow异样有没有遇到过?⼀般你猜想会在什么状况下被触发?如何指定⼀个线程的堆栈⼤⼩?⼀般你们写多少?内存模型以及分区,须要具体到每个区放什么。分派:动态分派与动静分派。虚拟机在运行时有哪些优化策略请解释StackOverflowError和OutOfMemeryError的区别?.在JVM中,如何判断一个对象是否死亡?计算机网络从网络加载一个10M的图片,说下注意事项OSI网络体系结构与TCP/IP协定模型TCP的3次握手和四次挥手为什么TCP链接须要三次握手,两次不能够么,为什么?TCP协定如何来保障传输的可靠性TCP与UDP的区别TCP与UDP的有哪些利用HTTP1.0与2.0的区别HTTP报文构造HTTP的长连贯和短连贯?HTTP与HTTPS的区别以及如何实现安全性如何验证证书的合法性Get与POST的区别TCP的拥塞解决TCP是如何进行流量管制TCP和UDP别离对应的常见应用层协定IP地址的分类有了惟一的Mac地址为啥还须要IP地址?交换机、集线器与路由器有什么区别?网桥的作用ARP是地址解析协定,简略语言解释一下工作原理。网络接口卡(网卡)的性能?IO中同步与异步,阻塞与非阻塞区别URI和URL的区别GET申请中URL编码的意义常见状态码及起因短语说说Session、Cookie 与 Application如何防止浏览器缓存什么是分块传送。谈谈SQL 注入DDos 攻打DDos攻打有那些预防办法?什么是XSS 攻打从输出网址到取得页面的过程数据结构与算法这部分要会手动实现一些数据结构,我总结了以下一些重要的数据结构 数据结构 链表(增删查操作) 单向链表双向链表队列(增删查操作) 一般队列优先队友树 二叉树(前序、中序、后序)均衡树(尽量会实现代码)堆红黑树(理解性质、利用场景)B树(理解性质、利用场景)图 深度优先搜寻广度优先搜寻最短门路最小生成树 Prim算法Kruskal算法拓扑字符串 Knuth-Morris-Pratt算法Boyer-Moore算法散列几种算法思维 递归递推贪婪枚举动静布局回溯法分治必学十大排序算法 抉择排序插入排序冒泡排序希尔排序归并排序疾速排序堆排序计数排序桶排序基数排序刷题 牛客网剑指offer六七十到题 leetcode 数据库请简洁形容Mysql中InnoDB反对的四种事务隔离级别名称,以及逐级之间的区别?在Mysql中ENUM的用法是什么?CHAR和VARCHAR的区别?事务是如何通过日志来实现的,说得越深刻越好drop,delete与truncate的区别局部性原理与磁盘预读数据库范式存储过程与触发器的区别锁的优化策略什么状况下设置了索引但无奈应用什么状况下不宜建设索引?解释MySQL外连贯、内连贯与自连贯的区别完整性束缚包含哪些?Mysql 的存储引擎,myisam和innodb的区别。如何进行SQL优化乐观锁和乐观锁是什么,INNODB的规范行级锁有哪2种,解释其含意。MVCC的含意,如何实现的MYSQL的主从提早怎么解决。spring1. spring概述 应用Spring框架的益处是什么?Spring由哪些模块组成?解释AOP模块解释WEB 模块外围容器(利用上下文) 模块。什么是Spring IOC 容器?IOC的长处是什么?ApplicationContext通常的实现是什么?Bean 工厂和 Application contexts 有什么区别?Bean 工厂和 Application contexts 有什么区别?2. spring依赖注入 ...

December 5, 2020 · 1 min · jiezi

关于面试:一名开发三年的Java程序员陈述进大公司拿30K到底有多难

目前一线城市的薪资程度在13到40k之间,然而找工作的时候并不仅仅有工作教训就行了,还须要肯定的专业知识。如果你野心更大,想要进阿里美团头条等等这些大厂的话,那就须要更多的专业知识。那么,一个三年工作教训的Java程序员应该要具备哪些常识呢? 我整顿了之后发现,程序员须要懂好多的常识。 一、我的项目教训我的项目教训是程序员们最重要的财产,也是面试中必问的问题。个别面试官都会借着我的项目教训来考查应聘者的沟通能力和思考能力。三年工作教训的程序员个别都会有两个以上的我的项目教训,但理论咱们大部分的状况都是做产品的一个性能或一个模块。尽管咱们能很好的实现工作上的要求,然而对于面试这必定是不够的。对于面试来说,咱们还要实现以下四点。 · 晓得你的我的项目到底是做什么的,有哪些性能。 · 晓得你做的我的项目在整个我的项目中所处的地位及作用,并能清晰地论述模块间的调用关系。 · 晓得你我的项目的整体架构和应用到的中间件,并对中间件的原理有肯定的理解。 · 能流畅地论述本人在我的项目中解决过的比较复杂的问题。 二、Java的基础知识技术常识这块面试还是蛮常见的。不过大多问的比较简单。这是我列举的一些我曾被问到的问题,大家私下参考一下。 · 栈和队列的区别 · 接口和抽象类的区别 · Int和Integer的区别和主动拆箱/装箱的相干问题 · 常量池相干问题 三、汇合框架汇合框架的底层原理,是面试很常见的问题。无论去大公司面试,还是去小公司面试都会问。只不过问深问浅的区别。 · ArrayList,LinkedList,HashMap,LinkedHashMap,ConcurrentHashMap的底层实现原理 · 1.7版本和1.8版本的HashMap的区别 · HashMap能不能排序?HashMap的长度为什么要是2的幂次方? 不过不论怎么样,大家去面试的话,都要把上述的问题都尽量弄懂。最低的要求就是把hashmap的底层原理弄懂。 四、多线程· 创立线程的几种形式?Wait,sleep别离是谁的办法,区别?线程间的通信形式? · 介绍下什么是死锁,遇见过死锁吗?你是怎么排查的。(能够通过jps排查) · 创立线程池的几种形式,线程池有什么益处。 · 线程继承和接口的区别,接口有什么益处。 · Synchronized、Lock、ReentrantLock的区别,用法及原理。 · ThreadLocal的用法和原理 · Volatile关键字的作用和原理 · 乐观锁和乐观锁 · 对偏心锁,非偏心锁,可重入锁,自旋锁,读写锁的了解 · CAS是什么及底层原理 · ArrayBlockingQueue,LinkedBlockingQueue,SynchronousQueue等等梗塞队列的了解 · ThreadPoolExecutor的传入参数及外部工作原理 · 给你一个具体的业务场景,让你应用ThreadPoolExecutor创立一个适宜的线程池 · 分布式环境下,怎么保障线程平安 多线程个别是高级程序员面试中的重点。当初的我的项目高并发很多,所以面试多线程这块还是挺多的。个别大厂会问得很深。从第十点开始就蛮难的了,大家能够依据本人的状况酌情学习。 五、JVM相干问题· JVM内存机制 · 介绍下垃圾收集机制,垃圾收集有哪些算法,各自的特点 · 聊聊GC,谈谈Major GC,FullGe区别,垃圾收集器有哪些,他们的区别? · OutOfMemeryError这个谬误你遇到过吗?你是怎么解决解决的? ...

December 5, 2020 · 1 min · jiezi

关于面试:嗯好不容易得到面试机会面试官问的全回答了但心痒一看状态进了人才库了

大家好,明天次要和大家聊一聊本人过后的面试筹备以及一些面试心得。 特么口试/面试机会也不给?记得去年的这个时候,根本每天都在做各大公司的口试题,很多口试题,是真的难。 有些人,手里曾经好几个 offer 了,而有些人,口试受挫,面试受挫,本人明明温习了那么久,学习了那么多,特么在口试就被刷了,有些甚至连口试都不给,好不容易进入面试环节,本人明明每个问题都答复进去了,但一查状态,才发现自己进了人才库… 有人可能忍不住会问,双非本科还有机会拿到大厂 offer 吗? 我的答复是,齐全有机会。 说到卡学历,我感觉一些中厂比大厂更喜爱卡学历,对于很多大公司来说,根本都会给你口试的机会,而能不能取得面试的机会,口试的问题真的很重要,如果你学历不好,简历也没取得什么大奖,那么这个时候,你的口试问题,就尤为重要了。 个别很多大公司,在提前批根本都是 3 ~ 5 道编程题,如果你能做出 60% 的口试题,那么被发动面试的概率还是挺大的。当然有人可能会说,我特么全 A 了,但还是没收到面试的机会,这又是怎么回事? 说实话,的确,有些公司真的会卡学历,我记得我有次做贝壳找房的口试题,全 A 了,但还是没有给面试的机会,爱奇艺口试机会都没给。 然而,因为我口试做的还不错,大部分公司还是给了我面试的机会,我的简历其实也个别,所以我感觉,如果你口试做的还不错,就算你是普通本科,还是会有很多大公司违心给你面试的机会的,毕竟,很多大公司,都不想错过才人。但一些中公司,可能反而不给你面试的机会,间接卡你学历,因为,面试的老本,也挺高。 口试始终被虐怎么办? 这没方法,当初很多公司处于提前批状态,提前批就是神仙打架,口试/面试的难度,都会比正式批难,而且提前批大佬贼多,所以就算口试/面试受挫,大家也不要太灰心,因为,提前批是真的难,反正我是领会过提前批的口试题了。 提前批被虐了之后,到了正式批就积攒了不少教训了,而且很多大佬也曾经拿到 offer 了,这个时候 offer 的数量尽管少了挺多,然而,我感觉反而比提前批更加容易拿到 offer 了。记得过后,我的很多同学,根本也是在八九月份,一个 offer 也没有,好些人都想放弃秋招等春招了,但到了十月份,offer 就莫名着陆续来了,好多同学,熬到了十月份,最初也都在十月份拿到了 offer。 所以,我心愿,大家不要灰心,应该要一直总结,一直补救本人的盲点。对于还没有加入校招的同学,也要好好筹备下口试,致力把算法题刷一刷。 面试官问的全答复了,但一看状态进了人才库了作为一个应届生,从春招到秋招,体验了 n 场面试,但说实话,问来问去,每次面试都会问那十几个问题,有些问题,我都答复腻了,例如讲一讲索引,过程与线程的区别…,这些问题,都我答复了几十遍了… 我置信很多人也都会提前早早筹备这些问题,例如三次握手,四次挥手,过程通信,垃圾回收,链表反转,等等。 我想,面试官,应该也都晓得你们可能都会背诵/默写了吧,可是,他们仍然还是会问你:过程的通信形式有哪些? 可是,这些相熟到可能背诵的问题,当面试官问你的时候,你能让这些问题胜利你的加分项吗? 说实话,我认为很多人不能,这些简略/百问不厌的问题,我花了很长时间去钻研,因为这些问题被问的概率太大了,我不能和大家一样:当面试官问我过程有哪些通信形式的时候,我纯熟着跟面试官说: 1、管道 2、音讯队列 3、共享内存 4、信号量 5、Socket … 间接说出了着五六种,松了一口气,心想:幸好没忘。而后就没了。 说实话,这样的答复,我感觉,很多人都可能答复进去吧,我猜应该也有挺多人是死记硬背的,这种答复,很难成为加分项。 我就意识一些人,跟我说,面试官问的,根本都有答复了,但过了几天,收到了简历进入人才库了。 尽管面试官问的,都能答复进去,但不见得你真的答复好了,这些根底的问题,在不同的人手里,答复进去的,真的会很不同。 我的我的项目教训比拟不好,学历也个别,简历也一般,我的劣势就是扎实的根底 + 算法,所以,我对这些常见/高频面试题,根本都会去钻研一下,相对不会和绝大多数人答复的一样,我肯定要想方法让我的答复成为加分项。 例如,当面试官问我过程通信的时候,我不会间接答复出这五种通信形式,一个会尽量把这五种过程形式给串联起来。 当面试官让我说一说MySQL 索引的时候,我可能会由浅入深,从索引的数据结构选型,到索引生效的实质起因,把这些逻辑连贯起来,一层推一层着跟面试官讲一讲… 如果你之前看过我的原创技术文章的话,可能会发现我的文章,并不会硬巴巴着抛出一个概念,而后跟你解说这个概念是什么意思,而是会从最简略的说起,一步步推出下一个知识点。 是的,我面试的时候也是这样,根本面试官问我这些常见的问题,例如数据库索引啊,锁啊,事务啊,计算机网络的 https,三次挥手四次握手,icmp等啊,还是数据结构等调表,B/B+ 树啊,我根本都会依照本人的了解,从 0 到 1,一层层推理进去跟面试官讲。 ...

December 3, 2020 · 1 min · jiezi

关于面试:非科班学员斩获京东校招-28woffer

https://www.bilibili.com/vide...

December 2, 2020 · 1 min · jiezi

关于面试:java-如何实现-binary-search-二分查找法

程序查找如果让你在一堆书架上找到本人想要的书,你会怎么找呢? 实际上最简略最粗犷的形式就是一本一本的看过来。 这个用计算机实现就对应着程序查找。 概念程序查找适宜于存储构造为顺序存储或链接存储的线性表。 根本思维:程序查找也称为线形查找,属于无序查找算法。从数据结构线形表的一端开始,程序扫描,顺次将扫描到的结点关键字与给定值k相比拟,若相等则示意查找胜利;若扫描完结仍没有找到关键字等于k的结点,示意查找失败。 复杂度剖析: 查找胜利时的均匀查找长度为:(假如每个数据元素的概率相等) ASL = 1/n(1+2+3+…+n) = (n+1)/2 ; 当查找不胜利时,须要n+1次比拟,工夫复杂度为O(n); 所以,程序查找的工夫复杂度为O(n)。 java 代码实现以 java 代码为例: /*** 程序查问算法** @param arr 数组信息** @param target 目标值** @param arrLength 数组长度*/int foreachSearch(int arr[], int target, int arrLength) { int i; for(i = 0; i < arrLength; i++) { if(target == arr[i]) { return i; } } return -1;}java 改良版本咱们这个实现版本次要是为了补救大部分网上实现的有余,很多实现就是一个 int 类型,适用范围不够宽泛。 接口定义为了后续的拓展性,咱们定义查问接口及形象实现。 package com.github.houbb.search.api;import java.util.List;/** * @author 老马啸东风 * @since 0.0.1 */public interface ISearch<T> { /** * 执行元素的查问 * @param list 列表 * @param key 指标对象 * @return 后果对应的下标 * @since 0.0.1 */ int search(List<? extends Comparable<? super T>> list, T key);}形象实现: ...

November 28, 2020 · 3 min · jiezi

关于面试:java面试题

java面试题一些常见的面试题,汇总一下便于查阅蕴含知识点(1)java根底 1、面向对象的特色?2、java中四种拜访修饰符的区别?public、private、protected和缺省3、根本数据类型有哪些?4、float f = 3.4;是否正确?5、short s1=1;s1=s1+1;是否正确?short s1 =1;s1 +=1;是否正确?6、java中有哪些保留字?goto是否能够应用?7、int和integer有什么区别?8、&和&&的区别?9、解释一下内存中的栈(stack)、堆(heap)和办法区(thread area)的不同用法10、Math.round(11.5),Math.round(-11.5)的值等于多少?11、switch分支构造语句,是否能作用在byte上,是否作用在long上,是否能够作用在String上?12、计算2乘以8的最有效率形式?参考java位移运算13、string有没有length()办法?数组有没有length()办法?14、在java中,如何跳出多重嵌套循环?比拟return、break、continue的区别?15、结构器constructor是否能够被重写?16、两个对象的值相等,然而HashCode值能够不等?17、String类是否能够作为父类被继承?18、当一个对象被当做参数传递到一个办法后,该办法能够扭转对象的属性,并返回变动后的后果。那么这里是值传递还是援用传递?19、string和StringBuilder、StringBuffer的比拟?20、重载和重写的区别?重载办法能够依据返回值类型不同作为辨别吗?21、JVM虚拟机时如何加载class文件的?22、字符类型char能够存储单个汉字吗?23、抽象类和接口的比拟?24、动态嵌套类和外部类的区别?

November 25, 2020 · 1 min · jiezi

关于面试:7-天时间我整理并实现了这-9-种最经典的排序算法

回顾咱们后面曾经介绍了 3 种最常见的排序算法: java 实现冒泡排序解说 QuickSort 疾速排序到底快在哪里? SelectionSort 抉择排序算法详解(java 实现) 然而天下排序千千万,明天老马就和大家一起把最常见的几种都学习一遍。 堆排序堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。 堆是一个近似齐全二叉树的构造,并同时满足堆的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。 基础知识 JCIP-11-二叉堆最大堆若以升序排序阐明,把数组转换成最大堆(Max-Heap Heap),这是一种满足最大堆性质(Max-Heap Property)的二叉树:对于除了根之外的每个节点i, A[parent(i)] ≥ A[i]。 堆是具备以下性质的齐全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如下图: 反复从最大堆取出数值最大的结点(把根结点和最初一个结点替换,把替换后的最初一个结点移出堆),并让残余的堆维持最大堆性质。 同时,咱们对堆中的结点按层进行编号,将这种逻辑构造映射到数组中就是上面这个样子: 堆节点的拜访通常堆是通过一维数组来实现的。 在数组起始地位为0的情景中: 则父节点和子节点的地位关系如下: (01) 索引为i的左孩子的索引是 (2*i+1); (02) 索引为i的左孩子的索引是 (2*i+2); (03) 索引为i的父结点的索引是 floor((i-1)/2); 堆的操作在堆的数据结构中,堆中的最大值总是位于根节点(在优先队列中应用堆的话堆中的最小值位于根节点)。 堆中定义以下几种操作: 最大堆调整(Max Heapify):将堆的末端子节点作调整,使得子节点永远小于父节点 创立最大堆(Build Max Heap):将堆中的所有数据从新排序 堆排序(HeapSort):移除位在第一个数据的根节点,并做最大堆调整的递归运算 堆排序算法图解这个图解来自 图解排序算法(三)之堆排序,画的十分丑陋。 根本思维将待排序序列结构成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。 将其与开端元素进行替换,此时开端就为最大值。 而后将残余n-1个元素从新结构成一个堆,这样会失去n个元素的次小值。如此重复执行,便能失去一个有序序列了。 步骤步骤一 结构初始堆将给定无序序列结构成一个大顶堆(个别升序采纳大顶堆,降序采纳小顶堆)。 a. 假如给定无序序列构造如下 b. 此时咱们从最初一个非叶子结点开始(叶子结点天然不必调整,第一个非叶子结点 arr.length/2-1=5/2-1=1,也就是上面的6结点),从左至右,从下至上进行调整。 c. 找到第二个非叶节点4,因为[4,9,8]中9元素最大,4和9替换。 d. 这时,替换导致了子根[4,5,6]构造凌乱,持续调整,[4,5,6]中6最大,替换4和6。 ...

November 23, 2020 · 9 min · jiezi

关于面试:面试servlet

0.什么是servlet1.servlet的生命周期2.对于Servlet初始化阶段:在什么时候Servlet容器会装载Servlet:3.简述一下Servlet工作原理,Servlet接管和响应客户申请的过程4.Servlet响应申请阶段:5.Servlet与JSP的比拟:6.申请对象和响应对象的生命周期7.多个Servlet之间调用规定:8.转发和重定向转:https://blog.csdn.net/w132492...转:https://www.cnblogs.com/chenf... 0.什么是servlet宏观地讲,Servlet 是连贯 Web服务器与 服务端Java程序的协定,是一种通信标准。这个标准是以一套接口的模式体现的。通常来说,Servlet 是宏观上 Servlet标准中的一个具体的接口,Servlet标准中蕴含一套接口。而 Servlet 接口仅仅是其中之一。宏观地讲,Servlet 是 Servlet接口实现类的一个实例对象,是运行在服务器上的一段 Java小程序,即 Server Applet,也就是 Servlet 这个单词的来历。Servlet 的次要性能是依据客户端提交的申请,调用服务器端相干 Java代码,实现对申请的解决与运算。 1.servlet的生命周期Servlet生命周期分为三个阶段: (1)初始化阶段 调用init()办法 (2)响应客户申请阶段 调用service()办法 (3)终止阶段 调用destroy()办法 web容器加载servlet,生命周期开始。通过调用servlet的init()办法进行servlet的初始化。通过调用service()办法对申请进行响应,依据不同的申请调用不同的doXxx()办法。 当WEB利用被终止,或Servlet容器终止运行,或Servlet容器从新装载Servlet新实例时,Servlet容器会先调用Servlet的destroy()办法,在destroy()办法中能够开释掉Servlet所占用的资源。 2.对于Servlet初始化阶段:在什么时候Servlet容器会装载Servlet: (1)Servlet容器启动时主动装载某些Servlet,实现它只须要在web.XML文件中的<Servlet></Servlet>之间增加如下代码: <loadon-startup>1</loadon-startup> (2)在Servlet容器启动后,当WEB客户第一次申请拜访某个Servlet的时候,WEB容器将创立这个Servlet的实例 (3)Servlet类文件被更新后,从新装载Servlet Servlet被装载后,Servlet容器创立一个Servlet实例并且调用Servlet的init()办法进行初始化。在Servlet的整个生命周期内,init()办法只被调用一次。 3.简述一下Servlet工作原理,Servlet接管和响应客户申请的过程 首先简略解释一下Servlet接管和响应客户申请的过程,首先客户发送一个申请,Servlet是调用service()办法对申请进行响应,service办法主动差遣运行与申请对应的doXXX办法(doGet,doPost)等,而后再进入对应的办法中调用逻辑层的办法,实现对客户的响应。咱们每次定义一个Servlet的时候,都必须实现doGet或doPost等这些办法。 每一个自定义的Servlet都必须实现Servlet的接口,Servlet接口中定义了五个办法,其中比拟重要的三个办法波及到Servlet的生命周期,别离是上文提到的init(),service(),destroy()办法。GenericServlet是一个通用的,不特定于任何协定的Servlet,它实现了Servlet接口。而HttpServlet继承于GenericServlet,因而HttpServlet也实现了Servlet接口。所以咱们定义Servlet的时候只须要继承HttpServlet即可。 Servlet接口和GenericServlet是不特定于任何协定的,而HttpServlet是特定于HTTP协定的类,所以HttpServlet中实现了service()办法,并将申请ServletRequest,ServletResponse强转为HttpRequest和HttpResponse。咱们须要在自定义的Servlet中override这些办法! 4.Servlet响应申请阶段: 对于用户达到Servlet的申请,Servlet容器会创立特定于这个申请的ServletRequest对象和ServletResponse对象,而后调用Servlet的service办法。service办法从ServletRequest对象取得客户申请信息,解决该申请,并通过ServletResponse对象向客户返回响应信息。 对于Tomcat来说,它会将传递过去的参数放在一个Hashtable中,该Hashtable的定义是: private Hashtable<String String[]> paramHashStringArray = new Hashtable<String String[]>(); 这是一个String-->String[]的键值映射。 HashMap线程不平安的,Hashtable线程平安。 5.Servlet与JSP的比拟: 有许多相似之处,都能够生成动静网页。 JSP的长处是擅长于网页制作,生成动静页面比拟直观,毛病是不容易跟踪与排错。 Servlet是纯Java语言,擅长于解决流程和业务逻辑,毛病是生成动静网页不直观。 ...

November 18, 2020 · 1 min · jiezi

关于面试:面试JVM

194. 说一下 jvm 的次要组成部分?及其作用?195. 说一下 jvm 运行时数据区?196. 说一下堆栈的区别?197. 队列和栈是什么?有什么区别?198. 什么是双亲委派模型?199. 说一下类加载的执行过程?(5步)200. 怎么判断对象是否能够被回收?201. java 中都有哪些援用类型?202. 说一下 jvm 有哪些垃圾回收算法?203. 说一下 jvm 有哪些垃圾回收器?204. 具体介绍一下 CMS 垃圾回收器?205.新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?206. 简述分代垃圾回收器是怎么工作的?207. 说一下 jvm 调优的工具?208. 罕用的 jvm 调优的参数都有哪些?JVM 194. 说一下 jvm 的次要组成部分?及其作用? 类加载器(ClassLoader)把 .Java 代码转换成字节码 .class运行时数据区(Runtime Data Area)把字节码加载到内存中执行引擎(Execution Engine)将字节码翻译成底层零碎指令,再交由 CPU 去执行本地库接口(Native Interface)中介组件的作用: 首先通过类加载器(ClassLoader)会把 Java 代码转换成字节码,运行时数据区(Runtime Data Area)再把字节码加载到内存中,而字节码文件只是 JVM 的一套指令集标准,并不能间接交个底层操作系统去执行,因而须要特定的命令解析器执行引擎(Execution Engine),将字节码翻译成底层零碎指令,再交由 CPU 去执行,而这个过程中须要调用其余语言的本地库接口(Native Interface)来实现整个程序的性能。 195. 说一下 jvm 运行时数据区? 程序计数器解释:指向以后线程所执行的字节码的行号,其实就是一小块内存,记录着以后程序运行到哪了,字节码解释器的工作就是通过扭转这个计数器的值来选取下一条须要执行的字节码指令。分支,循环,跳转,异样解决,线程回复等都须要依赖这个计数器来实现。虚拟机栈Java虚拟机栈与程序计数器一样,Java的虚拟机栈也是线程公有的,虚拟机栈形容的是Java的办法执行的内存模型,每个办法在执行同时的都会创立一个栈桢用于存储局部变量表,操作数栈,动静链接,办法进口等信息本地办法栈本地办法栈和虚拟机栈类似,区别就是虚拟机为虚拟机栈执行Java服务(字节码服务),而本地办法栈为虚拟机应用到的Native办法服务堆堆是JVM里最大的一块内存区域,被所有线程共享,在虚拟机启动时创立,此区域的目标就是寄存对象实例和数组,简直所有的对象实例都在这调配办法区办法区也是一个线程共享的区域,存储已被虚拟机加载的类信息,常量(final),动态变量(static),JIT(即时编译器)编译后的代码等数据。运行时常量池是办法区的一部分,运行时常量池绝对于类常量池的另外一个个性就是具备动态性,运行期间可能将新的常量放入池中 有的区域随着虚拟机过程的启动而存在,有的区域则依赖用户过程的启动和完结而创立和销毁。 196. 说一下堆栈的区别? 栈内存存储的是局部变量而堆内存存储的是实体;栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;栈内存寄存的变量生命周期一旦完结就会被开释,而堆内存寄存的实体会被垃圾回收机制不定时的回收。197. 队列和栈是什么?有什么区别? 队列和栈都是被用来预存储数据的。队列容许先进先出检索元素,但也有例外的状况,Deque 接口容许从两端检索元素。栈和队列很类似,但它运行对元素进行后进先出进行检索。198. 什么是双亲委派模型? 在介绍双亲委派模型之前先说下类加载器。对于任意一个类,都须要由加载它的类加载器和这个类自身一起确立在 JVM 中的唯一性,每一个类加载器,都有一个独立的类名称空间。类加载器就是依据指定全限定名称将 class 文件加载到 JVM 内存,而后再转化为 class 对象。 类加载器分类: 启动类加载器(Bootstrap ClassLoader),是虚拟机本身的一部分,用来加载Java_HOME/lib/目录中的,或者被 -Xbootclasspath 参数所指定的门路中并且被虚拟机辨认的类库;其余类加载器:扩大类加载器(Extension ClassLoader):负责加载<java_home >libext目录或Java. ext. dirs零碎变量指定的门路中的所有类库;</java_home>应用程序类加载器(Application ClassLoader)。负责加载用户类门路(classpath)上的指定类库,咱们能够间接应用这个类加载器。个别状况,如果咱们没有自定义类加载器默认就是用这个加载器。双亲委派模型:如果一个类加载器收到了类加载的申请,它首先不会本人去加载这个类,而是把这个申请委派给父类加载器去实现,每一层的类加载器都是如此,这样所有的加载申请都会被传送到顶层的启动类加载器中,只有当父加载无奈实现加载申请(它的搜寻范畴中没找到所需的类)时,子加载器才会尝试去加载类。 199. 说一下类加载的执行过程? 类加载分为以下 5 个步骤: 加载:依据查找门路找到相应的 class 文件而后导入;查看:查看加载的 class 文件的正确性;筹备:给类中的动态变量分配内存空间;解析:虚拟机将常量池中的符号援用替换成间接援用的过程。符号援用就了解为一个标示,而在间接援用间接指向内存中的地址;初始化:对动态变量和动态代码块执行初始化工作。200. 怎么判断对象是否能够被回收? 个别有两种办法来判断: 援用计数器:为每个对象创立一个援用计数,有对象援用时计数器 +1,援用被开释时计数 -1,当计数器为 0 时就能够被回收。它有一个毛病不能解决循环援用的问题;可达性剖析:从 GC Roots 开始向下搜寻,搜寻所走过的门路称为援用链。当一个对象到 GC Roots 没有任何援用链相连时,则证实此对象是能够被回收的。201. java 中都有哪些援用类型? 强援用软援用弱援用虚援用(幽灵援用/幻影援用)202. 说一下 jvm 有哪些垃圾回收算法? 标记-革除算法标记-整顿算法复制算法分代算法203. 说一下 jvm 有哪些垃圾回收器? Serial:最早的单线程串行垃圾回收器。Serial Old:Serial 垃圾回收器的老年版本,同样也是单线程的,能够作为 CMS 垃圾回收器的备选预案。ParNew:是 Serial 的多线程版本。Parallel 和 ParNew 收集器相似是多线程的,但 Parallel 是吞吐量优先的收集器,能够就义等待时间换取零碎的吞吐量。Parallel Old 是 Parallel 老生代版本,Parallel 应用的是复制的内存回收算法,Parallel Old 应用的是标记-整顿的内存回收算法。CMS:一种以取得最短进展工夫为指标的收集器,十分实用 B/S 零碎。G1:一种兼顾吞吐量和进展工夫的 GC 实现,是 JDK 9 当前的默认 GC 选项。204. 具体介绍一下 CMS 垃圾回收器? CMS 是英文 Concurrent Mark-Sweep 的简称,是以就义吞吐量为代价来取得最短回收进展工夫的垃圾回收器。对于要求服务器响应速度的利用上,这种垃圾回收器非常适合。在启动 JVM 的参数加上“-XX:+UseConcMarkSweepGC”来指定应用 CMS 垃圾回收器。 CMS 应用的是标记-革除的算法实现的,所以在 gc 的时候回产生大量的内存碎片,当残余内存不能满足程序运行要求时,零碎将会呈现 Concurrent Mode Failure,长期 CMS 会采纳 Serial Old 回收器进行垃圾革除,此时的性能将会被升高。 205.新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别? 新生代回收器:Serial、ParNew、Parallel Scavenge老年代回收器:Serial Old、Parallel Old、CMS整堆回收器:G1新生代垃圾回收器个别采纳的是复制算法,复制算法的长处是效率高,毛病是内存利用率低;老年代回收器个别采纳的是标记-整顿的算法进行垃圾回收。 206. 简述分代垃圾回收器是怎么工作的? 分代回收器有两个分区:老生代和新生代,新生代默认的空间占比总空间的 1/3,老生代的默认占比是 2/3。 新生代应用的是复制算法,新生代里有 3 个分区:Eden、To Survivor、From Survivor,它们的默认占比是 8:1:1,它的执行流程如下: 把 Eden + From Survivor 存活的对象放入 To Survivor 区;清空 Eden 和 From Survivor 分区;From Survivor 和 To Survivor 分区替换,From Survivor 变 To Survivor,To Survivor 变 From Survivor。每次在 From Survivor 到 To Survivor 挪动时都存活的对象,年龄就 +1,当年龄达到 15(默认配置是 15)时,降级为老生代。大对象也会间接进入老生代。 ...

November 17, 2020 · 1 min · jiezi

关于面试:面试Redis

179. redis 是什么?都有哪些应用场景?180. redis 有哪些性能?181. redis 和 memecache 有什么区别?182. redis 为什么是单线程的?183. 什么是缓存穿透?怎么解决?184. redis 反对的数据类型有哪些?185. redis 反对的 java 客户端都有哪些?186. jedis 和 redisson 有哪些区别?187. 怎么保障缓存和数据库数据的一致性?188. redis 长久化有几种形式?189. redis 怎么实现分布式锁?190. redis 分布式锁有什么缺点?191. redis 如何做内存优化?192. redis 淘汰策略有哪些?193. redis 常见的性能问题有哪些?该如何解决?Redis 179. redis 是什么?都有哪些应用场景? Redis是当初最受欢迎的NoSQL数据库之一Redis是一个应用ANSI C编写的开源、蕴含多种数据结构、反对网络、基于内存、可选持久性的键值对存储数据库,其具备如下个性: 基于内存运行,性能高效反对分布式,实践上能够有限扩大key-value存储系统开源的应用ANSI C语言编写、恪守BSD协定、反对网络、可基于内存亦可长久化的日志型、Key-Value数据库,并提供多种语言的APIRedis 应用场景: 数据高并发的读写海量数据的读写对扩展性要求高的数据Redis 的利用场景包含:缓存零碎(“热点”数据:高频读、低频写)、计数器、音讯队列零碎、排行榜、社交网络和实时零碎。 180. redis 有哪些性能? 数据缓存性能分布式锁的性能反对数据长久化反对事务反对音讯队列181. redis 和 memecache 有什么区别? memcached所有的值均是简略的字符串,redis作为其替代者,反对更为丰盛的数据类型redis的速度比memcached快很多redis能够长久化其数据182. redis 为什么是单线程的? 因为 cpu 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器内存或者网络带宽。既然单线程容易实现,而且 cpu 又不会成为瓶颈,那就牵强附会地采纳单线程的计划了。 对于 Redis 的性能,官方网站也有,一般笔记本轻松解决每秒几十万的申请。 而且单线程并不代表就慢 nginx 和 nodejs 也都是高性能单线程的代表。 183. 什么是缓存穿透?怎么解决? 缓存穿透:**指查问一个肯定不存在的数据导致这个不存在的数据每次申请都要到数据库去查问,因为缓存是不命中时须要从数据库查问,查不到数据则不写入缓存,这将指查问一个肯定不存在的数据导致这个不存在的数据每次申请都要到数据库去查问**,造成缓存穿透。 解决方案:最简略粗犷的办法如果一个查问返回的数据为空(不论是数据不存在,还是系统故障),咱们就把这个空后果进行缓存,但它的过期工夫会很短,最长不超过五分钟。 184. redis 反对的数据类型有哪些? Redis提供的数据类型次要分为5种自有类型和一种自定义类型,这5种自有类型包含:String类型、Hash哈希类型、List列表类型、Set汇合类型和ZSet程序汇合类型。 String类型: 它是一个二进制平安的字符串,意味着它不仅可能存储字符串、还能存储图片、视频等多种类型, 最大长度反对512M。 对每种数据类型,Redis都提供了丰盛的操作命令,如: GET/MGETSET/SETEX/MSET/MSETNXINCR/DECRGETSETDEL哈希类型: 该类型是由field和关联的value组成的map。其中,field和value都是字符串类型的。 Hash的操作命令如下: HGET/HMGET/HGETALLHSET/HMSET/HSETNXHEXISTS/HLENHKEYS/HDELHVALS列表类型: 该类型是一个插入程序排序的字符串元素汇合, 基于双链表实现。 List的操作命令如下: LPUSH/LPUSHX/LPOP/RPUSH/RPUSHX/RPOP/LINSERT/LSETLINDEX/LRANGELLEN/LTRIM汇合类型: Set类型是一种无程序汇合, 它和List类型最大的区别是:汇合中的元素没有程序, 且元素是惟一的。 ...

November 17, 2020 · 1 min · jiezi

关于面试:面试MySql

164. 数据库的三范式是什么?165. 一张自增表外面总共有 7 条数据,删除了最初 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?166. 如何获取以后数据库版本?167. 说一下 ACID 是什么?168. char 和 varchar 的区别是什么?169. float 和 double 的区别是什么?170. mysql 的内连贯、左连贯、右连贯有什么区别?171. mysql 索引是怎么实现的?172. 怎么验证 mysql 的索引是否满足需要?173. 说一下数据库的事务隔离?174. 说一下 mysql 罕用的引擎?175. 说一下 mysql 的行锁和表锁?176. 说一下乐观锁和乐观锁?177. mysql 问题排查都有哪些伎俩?178. 如何做 mysql 的性能优化?MySql 164. 数据库的三范式是什么? 范式是“合乎某一种级别的关系模式的汇合,示意一个关系外部各属性之间的分割的合理化水平” 第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项。两列的属性相近或类似或一样,尽量合并属性一样的列,确保不产生冗余数据。第二范式:要求实体的属性齐全依赖于主关键字。所谓齐全依赖是指不能存在仅依赖主关键字一部分的属性。每一行的数据只能与其中一列相干,即一行数据只做一件事。只有数据列中呈现数据反复,就要把表拆分开来。一个人同时订几个房间,就会呈现一个订单号多条数据,这样子联系人都是反复的,就会造成数据冗余。咱们应该把他拆开来第三范式:任何非主属性不依赖于其它非主属性。数据不能存在传递关系,即每个属性都跟主键有间接关系而不是间接关系。比方这样一个表构造Student表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话)这样的表构造,咱们应该拆开来,如下。(学号,姓名,年龄,所在院校)--(所在院校,院校地址,院校电话) 165. 一张自增表外面总共有 7 条数据,删除了最初 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几? 表类型如果是 MyISAM ,那 id 就是 8。表类型如果是 InnoDB,那 id 就是 5。InnoDB 表只会把自增主键的最大 id 记录在内存中,所以重启之后会导致最大 id 失落。 ...

November 17, 2020 · 2 min · jiezi

关于面试:面试Spring-Spring-MVC

十、Spring / Spring MVC 90. 为什么要应用 spring? 1.简介 目标:解决企业应用开发的复杂性性能:应用根本的JavaBean代替EJB,并提供了更多的企业应用性能范畴:任何Java利用简略来说,Spring是一个轻量级的管制反转(IoC)和面向切面(AOP)的容器框架。 2.轻量 从大小与开销两方面而言Spring都是轻量的。残缺的Spring框架能够在一个大小只有1MB多的JAR文件里公布。并且Spring所需的解决开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring利用中的对象不依赖于Spring的特定类。 3.管制反转 Spring通过一种称作管制反转(IoC)的技术促成了松耦合。当利用了IoC,一个对象依赖的其它对象会通过被动的形式传递进来,而不是这个对象本人创立或者查找依赖对象。你能够认为IoC与JNDI相同——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象申请就被动将依赖传递给它。 4.面向切面 Spring提供了面向切面编程的丰盛反对,容许通过拆散利用的业务逻辑与零碎级服务(例如审计(auditing)和事务(transaction)治理)进行内聚性的开发。利用对象只实现它们应该做的——实现业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的零碎级关注点,例如日志或事务反对。 5.容器 Spring蕴含并治理利用对象的配置和生命周期,在这个意义上它是一种容器,你能够配置你的每个bean如何被创立——基于一个可配置原型(prototype),你的bean能够创立一个独自的实例或者每次须要时都生成一个新的实例——以及它们是如何互相关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们常常是宏大与轻便的,难以使用。 6.框架 Spring能够将简略的组件配置、组合成为简单的利用。在Spring中,利用对象被申明式地组合,典型地是在一个XML文件里。Spring也提供了很多根底性能(事务管理、长久化框架集成等等),将应用逻辑的开发留给了你。 所有Spring的这些特色使你可能编写更洁净、更可治理、并且更易于测试的代码。它们也为Spring中的各种模块提供了根底反对。 91. 解释一下什么是 aop? AOP(Aspect-Oriented Programming,面向方面编程),能够说是OOP(Object-Oriented Programing,面向对象编程)的补充和欠缺。OOP引入封装、继承和多态性等概念来建设一种对象层次结构,用以模仿公共行为的一个汇合。当咱们须要为扩散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP容许你定义从上到下的关系,但并不适宜定义从左到右的关系。例如日志性能。日志代码往往程度地分布在所有对象档次中,而与它所分布到的对象的外围性能毫无关系。对于其余类型的代码,如安全性、异样解决和通明的持续性也是如此。这种分布在各处的无关的代码被称为横切(cross-cutting)代码,在OOP设计中,它导致了大量代码的反复,而不利于各个模块的重用。 而AOP技术则恰恰相反,它利用一种称为“横切”的技术,剖解开封装的对象外部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简略地说,就是将那些与业务无关,却为业务模块所独特调用的逻辑或责任封装起来,便于缩小零碎的反复代码,升高模块间的耦合度,并有利于将来的可操作性和可维护性。AOP代表的是一个横向的关系,如果说“对象”是一个空心的圆柱体,其中封装的是对象的属性和行为;那么面向方面编程的办法,就好像一把利刃,将这些空心圆柱体剖开,以取得其外部的音讯。而剖开的切面,也就是所谓的“方面”了。而后它又以巧夺天功的妙手将这些剖开的切面还原,不留痕迹。 应用“横切”技术,AOP把软件系统分为两个局部:外围关注点和横切关注点。业务解决的次要流程是外围关注点,与之关系不大的局部是横切关注点。横切关注点的一个特点是,他们常常产生在外围关注点的多处,而各处都根本类似。比方权限认证、日志、事务处理。Aop 的作用在于拆散零碎中的各种关注点,将外围关注点和横切关注点拆散开来。正如Avanade公司的高级计划构架师Adam Magee所说,AOP的核心思想就是“将应用程序中的商业逻辑同对其提供反对的通用服务进行拆散。” 92. 解释一下什么是 ioc? IOC是Inversion of Control的缩写,少数书籍翻译成“管制反转”。 1996年,Michael Mattson在一篇无关探讨面向对象框架的文章中,首先提出了IOC 这个概念。对于面向对象设计及编程的根本思维,后面咱们曾经讲了很多了,不再赘述,简略来说就是把简单零碎分解成相互合作的对象,这些对象类通过封装当前,外部实现对外部是通明的,从而升高了解决问题的复杂度,而且能够灵便地被重用和扩大。 IOC实践提出的观点大体是这样的:借助于“第三方”实现具备依赖关系的对象之间的解耦。如下图: 图 IOC解耦过程 大家看到了吧,因为引进了两头地位的“第三方”,也就是IOC容器,使得A、B、C、D这4个对象没有了耦合关系,齿轮之间的传动全副依附“第三方”了,全副对象的控制权全副上缴给“第三方”IOC容器,所以,IOC容器成了整个零碎的要害外围,它起到了一种相似“粘合剂”的作用,把零碎中的所有对象粘合在一起发挥作用,如果没有这个“粘合剂”,对象与对象之间会彼此失去分割,这就是有人把IOC容器比喻成“粘合剂”的由来。 咱们再来做个试验:把上图两头的IOC容器拿掉,而后再来看看这套零碎: 图 拿掉IOC容器后的零碎 咱们当初看到的画面,就是咱们要实现整个零碎所须要实现的全部内容。这时候,A、B、C、D这4个对象之间曾经没有了耦合关系,彼此毫无分割,这样的话,当你在实现A的时候,基本无须再去思考B、C和D了,对象之间的依赖关系曾经升高到了最低水平。所以,如果真能实现IOC容器,对于零碎开发而言,这将是一件如许美妙的事件,参加开发的每一成员只有实现本人的类就能够了,跟他人没有任何关系! 咱们再来看看,管制反转(IOC)到底为什么要起这么个名字?咱们来比照一下: 软件系统在没有引入IOC容器之前,如图1所示,对象A依赖于对象B,那么对象A在初始化或者运行到某一点的时候,本人必须被动去创建对象B或者应用曾经创立的对象B。无论是创立还是应用对象B,控制权都在本人手上。 软件系统在引入IOC容器之后,这种情景就齐全扭转了,如图3所示,因为IOC容器的退出,对象A与对象B之间失去了间接分割,所以,当对象A运行到须要对象B的时候,IOC容器会被动创立一个对象B注入到对象A须要的中央。 通过前后的比照,咱们不难看出来:对象A取得依赖对象B的过程,由被动行为变为了被动行为,控制权颠倒过去了,这就是“管制反转”这个名称的由来。 93. spring 有哪些次要模块? Spring框架至今已集成了20多个模块。这些模块次要被分如下图所示的外围容器、数据拜访/集成,、Web、AOP(面向切面编程)、工具、音讯和测试模块。 更多信息:howtodoinjava.com/java-spring-framework-tutorials/ 94. spring 罕用的注入形式有哪些? Spring通过DI(依赖注入)实现IOC(管制反转),罕用的注入形式次要有三种: 构造方法注入setter注入基于注解的注入95. spring 中的 bean 是线程平安的吗? ...

November 16, 2020 · 1 min · jiezi

关于面试:面试设计模式

九、设计模式 88. 说一下你相熟的设计模式? 参考:罕用的设计模式汇总,超具体! 89. 简略工厂和形象工厂有什么区别? 简略工厂模式: 这个模式自身很简略而且应用在业务较简略的状况下。个别用于小我的项目或者具体产品很少扩大的状况(这样工厂类才不必常常更改)。 它由三种角色组成: 工厂类角色:这是本模式的外围,含有肯定的商业逻辑和判断逻辑,依据逻辑不同,产生具体的工厂产品。如例子中的Driver类。形象产品角色:它个别是具体产品继承的父类或者实现的接口。由接口或者抽象类来实现。如例中的Car接口。具体产品角色:工厂类所创立的对象就是此角色的实例。在java中由一个具体类实现,如例子中的Benz、Bmw类。来用类图来清晰的示意下的它们之间的关系: 形象工厂模式: 先来意识下什么是产品族: 位于不同产品等级构造中,性能相关联的产品组成的家族。 图中的BmwCar和BenzCar就是两个产品树(产品层次结构);而如图所示的BenzSportsCar和BmwSportsCar就是一个产品族。他们都能够放到跑车家族中,因而性能有所关联。同理BmwBussinessCar和BenzBusinessCar也是一个产品族。 能够这么说,它和工厂办法模式的区别就在于须要创建对象的复杂程度上。而且形象工厂模式是三个外面最为形象、最具一般性的。形象工厂模式的用意为:给客户端提供一个接口,能够创立多个产品族中的产品对象。 而且应用形象工厂模式还要满足一下条件: 零碎中有多个产品族,而零碎一次只可能生产其中一族产品同属于同一个产品族的产品以其应用。来看看形象工厂模式的各个角色(和工厂办法的一模一样): 形象工厂角色: 这是工厂办法模式的外围,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。具体工厂角色:它含有和具体业务逻辑无关的代码。由应用程序调用以创立对应的具体产品的对象。在java中它由具体的类来实现。形象产品角色:它是具体产品继承的父类或者是实现的接口。在java中个别有抽象类或者接口来实现。具体产品角色:具体工厂角色所创立的对象就是此角色的实例。在java中由具体的类来实现。

November 16, 2020 · 1 min · jiezi