- 博客(226)
- 收藏
- 关注
原创 说一下HashMap的实现原理?
在讨论哈希表之前,我们先大概了解下其他数据结构在新增,查找等基础操作执行性能采用一段连续的存储单元来存储数据。对于指定下标的查找,时间复杂度为O(1);通过给定值进行查找,需要遍历数组,逐一比对给定关键字和数组元素,时间复杂度为O(n),当然,对于有序数组,则可采用二分查找,插值查找,斐波那契查找等方式,可将查找复杂度提高为O(logn);对于一般的插入删除操作,涉及到数组元素的移动,其平均复杂度也为O(n)
2022-09-07 15:05:30
449
原创 关于Java中的异常,面试可以问的都在这里了!
Java异常是Java提供的一种识别及响应错误的一致性机制。Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。在有效使用异常的情况下,异常能清晰的回答what, where, why这3个问题:异常类型回答了“什么”被抛出,异常堆栈跟踪回答了“在哪”抛出,异常信息回答了“为什么”会抛出。
2022-09-06 20:39:16
486
原创 30个 Java 集合面试必备的问题和答案
很多人的求职面试的过程中都会遇到这个问题:“请做个自我介绍。”有的人,可以口若悬河、妙语连珠讲3分钟,有的人,可能磕磕巴巴,讲了30秒,前者一定能胜过后者,然则未必。通常说来,大大小小的面试,都会被问到这个问题,甚至有些面试技术还有些生硬的面试官,屁股还没坐稳,就把这个问题抛给应聘人员了,那么作为求职者,要首先明白,面试官为什么要让你做自我介绍?简单说来,包括以下几个原因:1、面试官的技巧还不是很娴熟,使用面试的惯常流程;2、通过自我介绍,判断求职者的基本素质(比如口头语言表达能力、逻辑能力等)
2022-09-06 20:13:36
470
原创 吃透Java IO:字节流、字符流、缓冲流
IO流是Java中的一个重要构成部分,也是我们经常打交道的。这篇关于Java IO的博文干货满满,堪称全网前三(请轻喷!)Java IO流有什么特点?Java IO流分为几种类型?字节流和字符流的关系与区别?字符流是否使用了缓冲?缓冲流的效率一定高吗?为什么?缓冲流体现了Java中的哪种设计模式思想?为什么要实现序列化?如何实现序列化?序列化数据后,再次修改类文件,读取数据会出问题,如何解决呢?
2022-09-06 19:52:07
913
1
原创 单例模式有几种写法?
上面的分析都忽略了反射和序列化的问题。通过反射或序列化,我们仍然能够访问到私有构造器,创建新的实例破坏单例模式。此时,只有枚举模式能天然防范这一问题。反射和序列化笔者还不太了解,但基本原理并不难,可以在其他模式上手动实现。下面继续忽略反射和序列化的问题,做个总结回味一下:单例模式是面试中的常考点,写起来非常简单。学习更多JAVA知识与技巧,关注与私信博主(555)!热爱学习和渴望进阶的小伙伴,各种JAVA学习路线、笔记、面试题,免费分享!
2022-09-06 19:45:56
130
原创 谈谈Java面向对象设计的六大原则,中高级面试常问!
到这里,面向对象的六大原则,就写完了。我们看出来,这些原则其实都是应对不断改变的需求。每当需求变化的时候,我们利用这些原则来使我们的代码改动量最小,而且所造成的影响也是最小的。但是我们在看这些原则的时候,我们会发现很多原则并没有提供一种公式化的结论,而即使提供了公式化的结论的原则也只是建议去这样做。这是因为,这些设计原则本来就是从很多实际的代码中提取出来的,他是一个经验化的结论。怎么去用它,用好他,就要依靠设计者的经验。否则一味者去使用设计原则可能会使代码出现过度设计的情况。
2022-09-06 15:47:25
133
原创 别找了,Java集合面试问题这里帮你总结好了!
它不支持add和addAll操作。集合是受map支持的,map的变化会在集合中反映出来,反之亦然。1)ArrayList是由Array所支持的基于一个索引的数据结构,所以它提供对元素的随机访问,复杂度为O(1),但LinkedList存储一系列的节点数据,每个节点都与前一个和下一个节点相连接。(3)在Java1.4中引入了LinkedHashMap,HashMap的一个子类,假如你想要遍历顺序,你很容易从HashMap转向LinkedHashMap,但是HashTable不是这样的,它的顺序是不可预知的。
2022-09-06 15:45:35
153
原创 记一道简单的Java面试题,但答错率很高!
我承认我的要求比较低,但是来面试的人能直接写出这样的真的不太多,粗略地估计的话,大概占一到两成吧。总之,无论如何,能在第三关的各种引导之后,能写出下面这个结果来的人,真的不多。能一开始没有任何引导的就写出来的人,至今只见过两个,一个我去哪儿都带着,一个拒了我的offer。好吧,我承认我在筛选简历的能力可能有一些问题,不过不管你信不信,好多大厂工作了几年的程序员,都会写出如上风格的代码。我:“但是我们实际代码测试过,发现上面的按位与操作和取模操作,实际运行的时间是差不多的,为什么呢?
2022-09-06 15:38:04
160
2
原创 Java序列化三连问,是什么?为什么需要?如何实现?
遇到这个 Java Serializable 序列化这个接口,我们可能会有如下的问题什么叫序列化和反序列化作用,为啥要实现这个 Serializable 接口,也就是为啥要序列化serialVersionUID 这个的值到底是在怎么设置的,有什么用。有的是1L,有的是一长串数字,迷惑ing。我刚刚见到这个关键字 Serializable 的时候,就有如上的这么些问题。在处理这个问题之前,你要先知道一个问题,这个比较重要。
2022-09-06 15:35:56
230
原创 谈谈你对Java线程之间通信方式的理解
本文总结我对于JAVA多线程中线程之间的通信方式的理解,主要以代码结合文字的方式来讨论线程间的通信,故摘抄了书中的一些示例代码。
2022-09-06 15:33:13
107
原创 Java序列化为什么必须实现 Serializable 接口???
最近公司的在做服务化, 需要把所有model包里的类都实现接口, 同时还要显示指定的值. 听到这个需求, 我脑海里就突然出现了好几个问题, 比如说:序列化和反序列化是什么?实现序列化和反序列化为什么要实现接口?实现接口就算了, 为什么还要显示指定的值?我要为指定个什么值?下面我们来一一解答这几个问题.序列化和反序列化:把对象转换为字节序列的过程称为对象的序列化.:把字节序列恢复为对象的过程称为对象的反序列化.
2022-09-05 15:59:37
163
原创 Java静态调用效率高,为什么不全部采用静态调用呢?
而在调用非静态方法时,为了保证运行安全,CLR会对我们的源代码进行验证并额外的生成一些IL中间代码来确保运行安全,所以在调用一个非静态方法时,CLR首先是判定被调用对象是否为NULL,如果为NULL,则引发一个异常,反之,则根据对象推荐出其类型,最后实现调用。所谓面向过程的编程方式,指的是以事件为中心的编程方式,编程的时候把解决问题的步骤分析出来,然后用函数把这些步骤实现,在一步一步的具体步骤中再按顺序调用函数。举个简单的例子,我们有一个汽车相关的程序,每种不同的汽车的喇叭声音不一样。
2022-09-05 15:30:25
340
原创 如何写出一手让同事膜拜的漂亮代码?
函数的命名函数的命名尽量保证一个函数只做一件事的原则,不要参杂过多的其他业务操作。函数的参数个数通常参数的个数建议最多设置在3个左右,如果参数过多容易让人看了有误解,此时可以尝试用一些类去进行封装。函数的参数命名对于有共同含义的参数,我们可以将它命名到同一个变量中,这样能够通过业务领域去定义他们,方便识别。对于参数的命名可以结合一些工作术语,例如当我们需要定义一个队列参数的时候可以定义JobQueue。//用于表示地址信息//居住全地址//楼房号//街道名称//城市名称}
2022-09-05 13:54:06
216
原创 面试官:GET 和 POST 有什么区别?
GET 和 POST 是 HTTP 请求中最常用的两种请求方法,它们的底层都是基于 TCP/IP 实现的。它们的区别主要体现在 5 个方面:缓存不同、参数长度限制不同、回退和刷新不同、历史记录不同、能否保存为书签不同,但它们最大的区别是规范和约定上的不同,规范中定义 GET 是用来获取信息的,而 POST 是用来传递实体的,并且 GET 请求的参数要放在 URL 上,而 POST 请求的参数要放在请求正文中。学习更多JAVA知识与技巧,关注与私信博主(555)!
2022-09-05 13:48:06
201
原创 Redis 要被替代了?
我们使用 Redis 7.0.0,直接通过源码构建Dragonfly 使用的则是构建自 https://github.com/Dragonfly/dragonfly#building-from-source 的 6 月 3 日版源码(hash=e806e6ccd8c79e002f721a1a5ecb847bd7a06489)验证 Dragonfly 公布的结果是否可重现,并确定检索结果的完整条件(鉴于 memtier_benchmark、操作系统版本等信息有所缺失)
2022-09-04 19:44:04
3584
原创 对线面试官:一口气说出分布式事务的七种解决方案
本文介绍了分布式事务的一些基础理论,并对常用的分布式事务方案进行了讲解;在文章的后半部分还给出了事务异常的原因、分类以及优雅的解决方案;最后以一个可运行的分布式事务例子,将前面介绍的内容以简短的程序进行演示。支持了TCC、XA、SAGA、事务消息、最大努力通知(使用事务消息实现),提供了HTTP、gRPC协议支持,非常容易接入。已支持了Python、Java、PHP、C#、Node等语言的客户端,参见:各语言SDK。学习更多JAVA知识与技巧,关注与私信博主(555)!
2022-09-04 19:38:20
196
原创 Java多线程优化都不会,怎么拿Offer?
CPU 密集型任务应配置尽可能小的线程,如配置 CPU 个数 +1 的线程数,IO 密集型任务应配置尽可能多的线程,因为 IO 操作不占用 CPU,不要让 CPU 闲下来,应加大线程数量,如配置两倍 CPU 个数 +1。在一个线程访问其中任意一个方法的时候,将锁住 ServerStatus,此时其他线程都无法访问另外三个方法,从而进入等待。为了降低这种开销,通常可以从几个方面入手,例如:减少线程申请锁的频率(减少临界区)和减少线程持有锁的时间长度(减小锁颗粒)以及多线程的设计模式。
2022-09-04 15:58:37
119
原创 10问10答:你真的了解线程池吗?
通过查看这里execute的实现,我们不难发现,它就是ThreadPoolExecutor中的实现,所以,造成submit和execute的差异化的代码,不在这。【建议】CPU密集型任务(N+1):这种任务消耗的主要是CPU资源,可以将线程数设置为N(CPU核心数)+1,比CPU核心数多出来的一个线程是为了防止线程偶发的缺页中断,或者其它原因导致的任务暂停而带来的影响。一般来讲,线程池的生命周期跟随服务的生命周期。如果提交任务的时候,线程池不为空,则先在等待队列中排队,只有队列满了才会创建新线程。
2022-09-04 15:55:40
195
原创 【测试】 Java如何优雅的生成测试数据
在日常的测试中,我们经常需要提前准备一大堆测试数据,用来验证业务逻辑。当然对于简单的数据类型完全可以通过 JDK 自带的Random类来实现。但是对于一个比较复杂的类,或者参数的格式有特殊要求的时候,Random就不适用了,这个时候就需要借助一些能够生成测试数据的框架。个人感觉它是 plus 版的 Random 类,方便简单的按类型生成数据,也可以自己给定配置与规则去生成,缺点,上文也说了,生成的数据没有太多实际意义,简单数据还好,如果像姓名、地址等有现实意义的数据,就不太合适了。
2022-09-04 15:52:56
1845
1
原创 让jwt来保护你的接口服务
比如,用户注册后发一封邮件让其激活账户,通常邮件中需要有一个链接,这个链接需要具备以下的特性:能够标识用户,该链接具有时效性(通常只允许几小时之内激活),不能被篡改以激活其他可能的账户,一次性的。部分只是经过base64编码,这样我们的信息其实就完全暴露了,一般不要将敏感信息存放在。生成带有用户标识的token响应给用户,在接下来的请求中,头部携带。作为一个轻量级的鉴权框架,使用起来非常方便,但是也会存在一些问题,验签通过,客户端下单成功,返回下单结果,然后客户端带着。的前面两部分进行加密后的字符串,将。
2022-09-04 15:21:59
150
原创 优化if-else代码的八种方案!
代码中如果if-else比较多,阅读起来比较困难,维护起来也比较困难,很容易出bug,接下来,本文将介绍优化if-else代码的八种方案。
2022-09-04 15:20:32
296
原创 面试官:Spring框架内置了哪些可扩展接口,咱们一个一个聊
再来说说FactoryBean,一般情况下,Spring通过反射机制利用bean的class属性实例化Bean,然而在某些情况下,实例化Bean过程比较复杂,如果按照传统的方式,则需要在bean的定义中提供大量的配置信息,而配置这种方式的灵活性是受限的,这时采用编码的方式可能会是一个比较合适的方案,Spring为此提供了FactoryBean的工厂类接口,用户可以通过实现该接口定制实例化Bean的逻辑。实现了该接口的类,可以在Bean被创建之前,获取容器中Bean的定义信息,并且可以进行修改。
2022-09-04 15:18:54
244
原创 Java程序员应该学习的10大技术
如果大家有关注Java 13的新特性的话,一定知道推出了字符串文本块的功能,这个功能其实是借鉴的Kotlin,除此之外,最近几年,Java有很多特性都在借鉴Kotlin,相比较于Java,Kotlin更加简洁,而且Kotlin编出来的代码也可以直接通过JVM运行。在2019年初,我认为Java 10还是比较新的,但是,在我学习完所有Java 10的特性之前,Java 11、Java 12、Java 12 已经接踵而至,对于工作繁忙的程序员们来说,大多数人都根本没有时间看这些。这两年很火,火的一塌糊涂。
2022-09-04 13:52:28
4680
原创 如何写出同事看不懂的Java代码?
好了,没用的知识介绍环节就此结束,相信大家在掌握了这些技巧后,都能自带代码混淆光环,写出不一样的拉轰代码。最后建议大家,在项目中这样写代码的时候,搭配红花油、跌打损伤酒一起使用,可能效果更佳。学习更多JAVA知识与技巧,关注与私信博主(555)!热爱学习和渴望进阶的小伙伴,各种JAVA学习路线、笔记、面试题,免费分享!
2022-09-02 16:03:25
505
1
原创 剖析 SPI 在 Spring 中的应用
为满足不同场景分库分表要求,将其中分库分表的相关逻辑以策略模式进行抽取分离,每种分库分表的实现对应一条策略,支持使用方对分库分表策略的动态扩展,而这里的动态扩展就利用了spring.factories。相比于Java SPI,基于spring.handlers实现的SPI更加的灵活,无需遍历,直接映射,更类似于Dubbo SPI的实现思想,每个类指定一个名称(只是spring.handlers中是以namespaceUri作为key,Dubbo配置中是指定的名称作为key)。
2022-09-02 14:56:51
220
原创 ping 命令还能这么玩?
默认情况下,Linux 系统的 TTL 值为 64 或 255,WindowsNT/2000/XP 系统的 TTL 值为 128,Windows98 系统的 TTL 值为 32,UNIX 主机的 TTL 值为 255。如果对于一些不好的网络,比如监控系统中非常卡顿,这样测试,返回的结果可能会显示出丢失出一部分,如果丢失的比较多的话,那么就说明网络不好,可以很直观的判断出网络的情况。下面按按住键盘的 Ctrl+c 终止它继续 ping 下去,就会停止了,会总结出运行的数据包有多少,通断的有多少了。
2022-09-02 14:46:02
1131
原创 Redis 7.0 Multi Part AOF的设计和实现
顾名思义,MP-AOF就是将原来的单个AOF文件拆分成多个AOF文件。在MP-AOF中,我们将AOF分为三种类型,分别为:BASE:表示基础AOF,它一般由子进程通过重写产生,该文件最多只有一个。INCR:表示增量AOF,它一般会在AOFRW开始执行时被创建,该文件可能存在多个。HISTORY:表示历史AOF,它由BASE和INCR AOF变化而来,每次AOFRW成功完成时,本次AOFRW之前对应的BASE和INCR AOF都将变为HISTORY,HISTORY类型的AOF会被Redis自动删除。
2022-09-01 20:27:43
202
原创 Redis消息队列发展历程
优势模型简单,和使用本地list基本相同,适配容易通过brpop做到消息处理的实时性通过rpoplpush来联动2个list,可以做到消息先消费后确认,避免消费者应用异常情况下消息丢失不足消息只能被消费一次,缺乏广播机制二 Redis 2.0 pubsublist作为消息队列应用场景受到限制很重要的原因在于没有广播,所以Redis 2.0中引入了一个新的数据结构pubsub。pubsub虽然不能算作是list的替代品,但它确实能解决一些list不能解决的问题。优势消息具备广播能力。
2022-09-01 19:52:00
190
原创 java应用提速(速度与激情)
速度与效率与激情什么是速度?速度就是快,快有很多种。有小李飞刀的快,也有闪电侠的快,当然还有周星星的快:(船家)"我是出了名够快"。(周星星)“这船好像在下沉?” (船家)“是呀!沉得快嘛”。并不是任何事情越快越好,而是那些有价值有意义的事才越快越好。对于这些越快越好的事来说,快的表现是速度,而实质上是提效。今天我们要讲的java应用的研发效率,即如何加快我们的java研发速度,提高我们的研发效率。提效的方式也有很多种。但可以分成二大类。我们使用一些工具与平台进行应用研发与交付。
2022-09-01 19:45:10
1183
原创 Java 线程池原理及最佳实践(1.5W字,面试必问)
线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。创建线程本身开销大,反复创建并销毁,过多的占用内存。所以有大量线程创建考虑使用线程池。线程池不用反复创建线程达到线程的复用,更具配置合理利用cpu和内存减少了开销,性能会得到提高,还能统一管理任务比如服务器收到大量请求,每个请求都分配线程去处理,对服务器性能考验就比较大,如果创建5个以上线程考虑使用线程池。...
2022-09-01 16:08:11
168
原创 Java 线程池配置的常见误区
由于线程的创建和销毁对操作系统来说都是比较重量级的操作,所以线程的池化在各种语言内都有实践,当然在 Java 语言中线程池是也非常重要的一部分,有 Doug Lea 大神对线程池的封装,我们使用的时候是非常方便,但也可能会因为不了解其具体实现,对线程池的配置参数存在误解。总结线程池的配置时,我最大的感受是一定要读源码!线程池内线程数量小于等于 coreSize 的部分我称为核心池,核心池是线程池的常驻部分,内部的线程一般不会被销毁,我们提交的任务也应该绝大部分都由核心池内的线程来执行。...
2022-09-01 15:59:49
113
原创 MySQL 的 timestamp 会存在时区问题?
这时,数据库保存的时间是东 9 区的 2020-02-23 08:00:00,也就是东 8 区的 2020-02-23 07:00:00,保存的时间就偏差了 1 个小时。而日本的时区是东 9 区,表示为 +9:00,或 GMT+9,当中国是早上 8 点时,日本是早上 9 点,即东 8 区的 8 点与东 9 区的 9 点,这两个时间是相等的。对于 UNIX 时间戳,就不会有此问题,因为它是绝对时间。所以本地时间都是与某一时区相关的,脱离时区看本地时间,是没有意义的,因为你并不知道这具体是指的什么时间点。...
2022-08-31 15:44:48
2887
原创 面试官:RocketMQ 如何保证消息不丢失,如何保证消息不被重复消费?
Kafka 实际上有个 offset 的概念,就是每个消息写进去,都有一个 offset,代表消息的序号,然后 consumer 消费了数据之后,每隔一段时间(定时定期),会把自己消费过的消息的 offset 提交一下,表示“我已经消费过了,下次我要是重启啥的,你就让我继续从上次消费到的 offset 来继续消费吧”。但是凡事总有意外,比如我们之前生产经常遇到的,就是你有时候重启系统,看你怎么重启了,如果碰到点着急的,直接 kill 进程了,再重启。重启之后,少数消息会再次消费一次。......
2022-08-31 15:34:12
1181
原创 Java面试题 JVM 篇 Redis篇 Spring篇
什么情况下会发生栈内存溢出?JVM 的内存结构,Eden 和Survivor 比例?JVM 内存为什么要分成新生代、老年代和持久代。新生代中为什么要分Eden 和Survivor?JVM 中一次完整的GC 流程是什么样子的,对象如何晋升到老年代,说说你知道的几种主要的JVM 参数?...
2022-08-30 17:13:55
1240
原创 聊聊 13 种锁的实现方式
如果线程的竞争很激励,线程的自旋超过了一定次数(默认循环10次,可以通过虚拟机参数更改),将轻量级锁升级为重量级锁(依然是 CAS 修改锁标志位,但不修改持有锁的线程ID),当后续线程尝试获取锁时,发现被占用的锁是重量级锁,则直接将自己挂起(而不是忙等),等待将来被唤醒。tryLock(long timeout,TimeUnit unit), 如果获取了锁定立即返回true,如果别的线程正持有锁,会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回true,如果等待超时,返回false;...
2022-08-30 16:05:59
146
原创 大厂基本功 | MySQL 三大日志 ( binlog、redo log 和 undo log ) 的作用?
MySQL日志 主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。其中,比较重要的还要属二进制日志binlog(归档日志)和事务日志redo log(重做日志)和undo log(回滚日志)。今天就来聊聊redo log(重做日志)、binlog(归档日志)、两阶段提交、undo log(回滚日志)。MySQL InnoDB 引擎使用redo log(重做日志)保证事务的持久性,使用undo log(回滚日志)来保证事务的原子性。MySQL数据库的数据备份、主备、主主、主从都离不开。...
2022-08-30 14:59:56
154
原创 Java 日期处理易踩的十个坑
因为 YYYY 是基于周来计算年的,它指向当天所在周属于的年份,一周从周日开始算起,周六结束,只要本周跨年,那么这一周就算下一年的了。一般在天亮早的夏季人为将时间调快一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。因为 Calendar.HOUR 默认是按 12 小时制处理的,需要使用 Calendar.HOUR_OF_DAY,因为它才是按 24 小时处理的。DD 和 dd 表示的不一样,DD 表示的是一年中的第几天,而 dd 表示的是一月中的第几天,所以应该用的是 dd。...
2022-08-29 20:04:41
459
原创 聊聊大厂更加看重哪些能力?(建议收藏)
而作为技术人员,如果想进大厂,就需要在平时的工作过程中,注意积累和总结,培养自己的各项能力(本文中提到的个人学习能力,快速定位问题和解决问题的能力,场景分析能力,业务理解能力,潜在问题的分析能力等,系统抽象能力,系统分析能力,系统架构能力等)。只要在平时的工作中总结到位,进大厂,是水到渠成的事情。我一直觉得,工作年限并不等同于工作经验,工作年限充其量只是工作经历而已,有些人工作了近10年,项目倒是做了不少,但基本都是CRUD,没啥含金量,工作经验充其量也就1年,说1年的工作经验,本质上已经不少了。...
2022-08-29 17:03:50
194
原创 是如何通过阿里面试的?
从阿里面试说起,阿里的面试一般采用电话面试的形式。笔者一共参加五轮面试,一面电话面试+在线编程,二面视频面试+在线编程,三面部门boss面试,四面交叉面,五面HR。在此分享五轮面试的大概问题吧,笔者是android岗开发,所问题型会更偏android。一面阿里的面试官都很和蔼。一面面试官听声音感觉应该是入职两三年的感觉。上来自我介绍后直接开始问android相关问题。大概问题如下:android中的dp、px、dip相关概念handler机制,四个组成部分及源码解析布局相关的控件作用及实现原理androi
2022-08-29 16:57:24
797
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人