
java基础知识
文章平均质量分 92
分享java基础知等
首席架构师专栏
本人担任大厂架构师,具有多年的架构经验,专注于研究高并发,高性能,高可用的架构设计解决方案,把自己从小白晋升架构师的技术和经验分享给大家,教大家如何成为合格的架构师!
展开
-
这么回答Java对象创建过程, 面试官给我一个赞
当支持克隆时,通过重写Object类的clone方法,并把方法的修饰符改为public,就可以直接调用该类的实例对象的clone方法实现克隆。为了反序列化一个对象,我们需要让我们的类实现Serializable接口。JDK1.6以后的版本在处理同步锁时存在锁升级的概念,JVM对于同步锁的处理是从偏向锁开始的,随着竞争越来越激烈,处理方式从偏向锁升级到轻量级锁,最终升级到重量级锁。对这个将要创建出来的对象,进行信息标记,包括是否为新生代/老年代,对象的哈希码,元数据信息,这些标记存放在对象头信息中。原创 2024-12-10 09:55:02 · 727 阅读 · 0 评论 -
阿里二面:双亲委派机制?原理?能打破吗?
双亲委派机制(Parent Delegation Mechanism)是Java中的一种类加载机制。在Java中,类加载器负责加载类的字节码并创建对应的Class对象。双亲委派机制是指当一个类加载器收到类加载请求时,它会先将该请求委派给它的父类加载器去尝试加载。只有当父类加载器无法加载该类时,子类加载器才会尝试加载。这种机制的设计目的是为了保证类的加载是有序的,避免重复加载同一个类。原创 2024-12-06 15:29:20 · 3293 阅读 · 0 评论 -
腾讯面试:如何解决哈希冲突?
我们面试时经常被问到HashMap是怎么解决哈希冲突的,很多同学对其含糊其词、一知半解。因此小编对相关知识进行了总结,希望帮助读者加深对其理解。哈希表就是通过散列函数将键映射到定值,简单来说就是一个键对应一个值。而通过散列函数映射时将两个键映射到了同一个值,即这两个键将被哈希表映射到同一个位置,这种情况就被称为哈希冲突。原创 2024-12-04 11:03:43 · 855 阅读 · 0 评论 -
美团面试:有哪些情况会产生死锁
我们首先需要知道,死锁一定发生在并发场景中。为了保证线程安全,有时会给程序使用各种能保证并发安全的工具,尤其是锁,但是如果在加解锁过程中处理不恰当,就有可能适得其反,导致程序出现死锁的情况。什么是死锁?死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。Java应用程序死锁产生的四个必要条件:1、互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用。原创 2024-11-22 17:47:46 · 1530 阅读 · 0 评论 -
吊打面试官系统:请说一下Java中的反射机制及反射的优缺点
java 中 java.lang.Class 是反射机制的基础,当我们想要在运行期获取一个类中的相关信息的时候,必须先获取其 Class 类。他本身的构造方法是 private 的,对外提供 getSingleton() 方法,统一管理实例的获取。而反射可以通过获取到类中的私有构造方法, 并将其变为可用,通过构造方法生成新的实例,这样就造成了单例的破坏。Class 类中有获取类的所有 属性、方法、注解、构造器的相关方法。:在单例类的构造方法中加判断,当实例已存在的时候,不再创建新的实例。原创 2024-11-19 15:01:08 · 953 阅读 · 0 评论 -
阿里面试题:为什么HashMap链表转红黑树的阈值为8呢
这段话的意思是:因为树节点(TreeNodes)所占的空间是普通节点Node的两倍,所以我们只有在桶中包含足够的节点时才使用树节点(请参阅TREEIFY_THRESHOLD)(只有在同一个哈希桶中的节点数量大于等于TREEIFY_THRESHOLD时,才会将该桶中原来的链式存储的节点转化为红黑树的树节点)。事实上,链表长度超过 8 就转为红黑树的设计,更多的是为了防止用户自己实现了不好的哈希算法时导致链表过长,从而导致查询效率低,而此时转为红黑树更多的是一种保底策略,用来保证极端情况下查询的效率。原创 2024-11-18 09:56:44 · 1270 阅读 · 0 评论 -
吊打面试官系列:hashCode() 相同,equals() 就一定相等吗?
在哈希表中,哈希码值相同的对象被称为“哈希冲突”。由于哈希函数的设计,不同的对象可能会有相同的哈希码值。哈希码值是一个整数,通常用于在哈希表(如HashMap、HashSet等)中快速查找对象。理解它们之间的关系和实现方式,对于编写高质量的代码至关重要。涵盖 Java几乎覆盖了所有主流技术面试题,还有市面上最全的技术精品系列教程,免费提供。类中,是每个Java对象都继承的两个方法。如果两个对象相等,那么它们的。属性都相同,那么它们是相等的,它们的哈希码值也相同。属性,那么这两个对象可能会有相同的哈希码值。原创 2024-11-13 09:17:02 · 848 阅读 · 0 评论 -
HashMap的put流程知道吗
HashMap 的 put 方法算是 HashMap 中比较核心的功能了,复杂程度高但是算法巧妙,同时在上一版本的基础之上优化了存储结构,从链表逐步进化成了红黑树,以满足存取性能上的需要。本文逐行分析了 put 方法的执行流程,重点放在了对整个流程的把握,以后遇到相关问题时,也能够得心应手。原创 2024-11-12 10:21:15 · 1278 阅读 · 0 评论 -
腾讯一面,讲一下ArrayList的自动扩容机制
创建一个ArrayList对象时,底层先创建了一个长度为0的数组elementDate,创建变量size,size有两个作用:集合的长度(元素的个数)和下一个元素应该添加的位置添加一个元素其实有点复杂:如果现在的size≠数组的长度(数组没有存满),则直接在size所指的位置添加元素,然后size++但是若size=数组的长度(相当于已经存满了),那么就会调用ArrayList中的grow方法,先对数组进行扩容然后再存入元素。原创 2024-11-06 11:52:10 · 766 阅读 · 0 评论 -
吊打面试官系列:final、finally、finalize 有什么区别?
finally块则是无论异常是否发生,都会执行finally块的内容,所以在代码逻辑中有需要无论发生什么都必须执行的代码,就可以放在finally块中。finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定会被执行(不管有没有抛出异常),经常被用在需要释放资源的情况下。当用final修饰类的时,表明该类不能被其他类所继承。finally:finally关键词主要用在异常处理中,无论try块中是否发生异常,finally块中的代码都会被执行。原创 2024-11-06 11:42:59 · 1203 阅读 · 0 评论 -
三次输错密码后,系统是怎么做到不让我继续尝试的(前提不能使用数据库)?
上面这套限流的逻辑感觉用在小型或中型的项目上应该问题不大,不过目前的登录很少有直接锁定账号不能输入的,一般都是弹出一个验证码框,让你输入验证码再提交。Redis的选择不难看出,这个流程比较重要的是存在一个用来计数的变量,这个变量既要满足分布式读写需求,还要满足全局递增或递减的需求,那Redis的incr方法是最优选了。虽然,但是,密码还是很重要的,顺便我有了一个问题:三次输错密码后,系统是怎么做到不让我继续尝试的?忘记密码这件事,相信绝大多数人都遇到过,输一次错一次,错到几次以上,就不允许你继续尝试了。原创 2024-10-22 11:57:40 · 763 阅读 · 0 评论 -
公司新来一个同事,把枚举运用得炉火纯青...
本文我们讨论了Java枚举类型,从基础知识到高级应用以及实际应用场景,让我们感受到枚举的强大功能。枚举在很多时候会和常量拿来对比,可能因为本身我们大量实际使用枚举的地方就是为了替代常量。那么这种方式由什么优势呢?以这种方式定义的常量使代码更具可读性,允许进行编译时检查,预先记录可接受值的列表,并避免由于传入无效值而引起的意外行为。原创 2024-10-18 11:04:21 · 1019 阅读 · 0 评论 -
Java8 中一个极其强悍的新接口,很多人没用过
在开发过程中经常会使用if...else...进行判断抛出异常、分支处理等操作。这些if...else...充斥在代码中严重影响了代码代码的美观,这时我们可以利用Java 8的Function接口来消灭if...else...原创 2024-10-17 11:46:28 · 921 阅读 · 0 评论 -
线程数突增!领导:谁再这么写就滚蛋
看上去不只一个线程池,并且这些线程池的名字居然是一样的,我大胆的猜测一下,是不断的创建同样的线程池,但是线程池无法被回收导致的线程数,所以接下来我们要分析两个问题,首先这个线程池在代码里是哪个线程池,第二这个线程池是怎么被创建的?冷静下来后我梳理一遍代码,这个接口是我两年前写的,主要是功能是统计用户的钱包每个月的流水,因为担心统计比较慢,所以使用了线程池,做了批量的处理,没想到居然导致了线程数过高,虽然没有导致事故,但是确实是潜在的隐患,现在没出事不代表以后不会出事。难道是因为没有调用shutdown?原创 2024-10-15 15:21:45 · 877 阅读 · 0 评论 -
CTO:谁在项目中使用Arrays.asList、ArrayList.subList,就立马滚蛋!
ArrayList的subList方法,返回的是原集合的一个子集合(视图),非结构性修改任意一个集合的元素的值,都会彼此影响,结构性修改原集合时,会报ConcurrentModificationException异常,结构性修改子集合时,会影响原集合,所以使用时要注意,避免程序错误或者异常。可以看出,SubList类是ArrayList的内部类,该构造函数中也并没有重新创建一个新的ArrayList,所以修改原集合或者子集合的元素的值,是会相互影响的。看似简单,用起来却有不少坑,稍不留神就踩雷。原创 2024-10-15 15:15:06 · 864 阅读 · 0 评论 -
Spring 中经典的 9 种设计模式,打死也要记住啊!
本文主要介绍spring使用到的9种设计模式原创 2024-09-05 14:45:20 · 889 阅读 · 0 评论 -
你合并代码用 merge 还是用 rebase ?
其次,正如在上图中所看到的,rebase也会产生完美线性的项目历史记录 - 你可以从feature分支顶端一直跟随到项目的开始而没有任何的分叉。有些公司规定只能用 rebase,它更适合那种只有单一版本的项目,只有一个主分支一直向前推进,且没有多个分支并行的情况,例如一个产品既要维护2.x 版本又要维护3.x版本,那用 rebase就不合适了。同步两个master分支的唯一方法是将它们合并在一起,从而产生额外的合并提交和两组包含相同更改的提交(原始提交和来自rebase分支的更改)。原创 2024-08-21 09:59:29 · 1256 阅读 · 0 评论 -
支付宝二面:使用 try-catch 捕获异常会影响性能吗?90%都会答错
不知道从何时起,传出了这么一句话:Java中使用try catch 会严重影响性能。然而,事实真的如此么?我们对try catch 应该畏之如猛虎么?看完本篇文章后,让人彻底明白原理原创 2023-03-16 15:02:55 · 170 阅读 · 0 评论 -
聊聊Spring事务失效的10种场景,太坑人了
前言最近在看spring事务源码,时不时回想起前几年面试YY的场景,面试官拿出下面的一道面试题问我,updateStatus方法会不会生成事务。我心想,这么简单的问题还要问我,这是瞧不起我的水平吗?但是我仔细看了看,想了想,这道题还真不容易回答,如果以前没有特别注意或者研究过,很容易掉坑里。还好我当时认真想了想,回答了不会生成事务,但后面面试官继续追问为什么不产生事务,我就把具体的原因说明了一下,事后回到家我再想了想这个问题,发现我回答的并不是很好。@Service public class User原创 2021-10-26 15:01:30 · 523 阅读 · 0 评论 -
深入解析JVM之虚拟机栈(面试必备)
一.虚拟机栈概念1.概念Java虚拟机栈是什么?每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧(stack Frame) ,对应着一次次的Java方法调用。其中栈的特点如下:栈是一种快速有效的分配存储方式,访问速度仪次于程序计数器JVM直接对Java栈的操作只有两个:每个方法执行伴随着进栈(入栈、压栈) 和 执行结束后的出栈工作3)对于栈来说不存在垃圾回收问题GC,但存在内存溢出问题OOM(程序猿易搞错)2.栈的存储结构和运行原理1) 栈中存储什么每个线程都有自己的原创 2021-10-19 22:51:12 · 291 阅读 · 0 评论