
Java基础面试题
似来
一个老程序员
展开
-
一线大厂面试真题——SortedSet和List异同点
3、在 SortedSet中,元素的添加和删除操作的时间复杂度为O(logn),而在List中,元素的添加和删除操作的时间复杂度为O(n),因为需要移动其他元素的位置。在Java的整个集合体系中,集合可以分成两个体系,一个是Collection存储单个对象的集合,另一个是k-v结构的Map集合。SortedSet是Collection体系下Set接口下的派生类,而Set集合的特征是不包含重复的元素的集合。1、SortedSet是一个有序的集合,不允许元素的重复,而List是一个有序的列表,允许元素的重复。原创 2024-04-13 15:36:12 · 258 阅读 · 0 评论 -
一线大厂面试真题——谈谈什么是零拷贝
从磁盘中读取目标文件内容拷贝到内核缓冲区,CPU控制器再把内核缓冲区的数据赋值到用户空间的缓冲区中,接着在应用程序中,调用write()方法,把用户空间缓冲区中的数据拷贝到内核下的SocketBuffer中。而零拷贝,就是把这两次多于的拷贝省略掉,应用程序可以直接把磁盘中的数据从内核中直接传输给Socket,而不需要再经过应用程序所在的用户空间。在这个流程中,数据只经历了两次拷贝就发送到了网卡中,并且减少了2次cpu的上下文切换,对于效率有非常大的提高。3、除此之外,还有一个mmap的文件映射机制。原创 2024-04-13 15:25:45 · 486 阅读 · 0 评论 -
一线大厂面试真题——介绍下策略模式和观察者模式
一个工作了5年的,去字节面试,在第一面遇到这样一个问题“请你介绍一些策略模式和观察者模式?这个思路突然就短路了,不知道该怎么回答?要想真正理解设计模式的精髓并且能灵活运用,需要多去阅读一些优秀的源码,比如Spring,否则设计模式永远只会停留在纸上无法落地。原创 2024-04-12 09:31:48 · 397 阅读 · 0 评论 -
一线大厂面试真题——为什么重写equals()就一定要重写hashCode()方法
强调一遍,基础很重要,基础很重要。不要觉得每天写CRUD能解决业务问题就很牛逼了,等你工作了7~8年以后会发现对技术体系化的理解和技术底层原理的学习才是自己的核心竞争力。原创 2024-04-12 09:27:51 · 483 阅读 · 0 评论 -
一线大厂面试真题——Java反射的优缺点
在Java里面,专门有一个java.lang.reflect用来实现反射相关的类库,包括Construct、Field、Method等类,分别用来获取类的构造方法、成员变量、方法信息。它能够在程序运行的过程中去构造任意一个类对象、并且可以获取任意一个类的成员变量、成员方法、属性,以及调用任意一个对象的方法。反射的使用场景还挺多的,比如在动态代理的场景中,使用动态生成的代理类来提升代码的复用性。3、可以在运行时轻松获取任意一个类的方法、属性,并且还能通过反射进行动态调用。原创 2024-04-11 11:00:31 · 513 阅读 · 0 评论 -
一线大厂面试真题——HashMap与HashTable区别
对于这类问题,要能够获得面试官的认可,必须要做两个动作1. 平时要注意总结2. 回答的逻辑结构要清晰,临阵磨枪很难达到这种状态。原创 2024-04-11 10:58:38 · 399 阅读 · 0 评论 -
一线大厂面试真题——Integer a1 =100 Integer a2 =100 ,a1 ==a2?的运行结果?
一个工作了3年的同学去面试遇到这样一个问题。“Integer a1 =100、 Integer a2 =100 ,请问a1==a2的运行结果以及为什么?注意,这个基础知识非常重要,如果有些同学在工作中直接把两个 Integer 封装类型用 等号去比较,就有可能导致生产故障。所以大家在写程序的时候 ,一定要对用到的 api 和技术框架的实现有一定的了解不仅仅是为了面试 ,而是为了提升编码和架构设计能力。原创 2024-04-09 10:13:15 · 500 阅读 · 0 评论 -
一线大厂面试真题——Integer和int的区别?Java为什么要设计封装类
Integer和int的区别?Java为什么要设计封装类?虽然经常使用,但是很少去关注为什么,导致面试遇到这个问题就懵了。因为平时没有总结过,大脑一开始肯定是一篇空白的。遇到特别基础的问题,先不用急着回答,好好整理一下思路。找到问题的关键因素,然后以此为切入点去回答,一般是没什么问题的。原创 2024-04-09 10:10:46 · 464 阅读 · 0 评论 -
一线大厂面试真题——Java SPI是什么?有什么用?
不过,在Java里面并没有提供实现,因为不同的数据库厂商,会有不同的语法和实现。Java SPI 有一定的不足之处,比如,不能根据需求去加载扩展实现,每次都会加载扩展接口的所有实现类并进行实例化,实例化会造成性能开销,并且加载一些不需要用到的实现类,会导致内存资源的浪费。Java中SPI机制主要思想是将装配的控制权移到程序之外实现标准和实现的解耦,以及提供动态可插拔的能力,在模块化的设立中,这种思想非常重要。3、在这个目录下,以接口的全限定名命名的配置文件,文件内容是这个接口的实现类。原创 2024-04-09 10:07:54 · 440 阅读 · 0 评论 -
一线大厂面试真题——在Java中实现单例模式有哪些方法
在Java中实现单例模式有哪些方法”!屏幕前的你们,是不是感觉这个问题很简单。但是实际上,有一个同学曾经去快手面试的时候,被更进一步问到。写一个性能最好的单例模式,结果很显然就没有回答出来。原创 2024-04-08 14:19:44 · 394 阅读 · 0 评论 -
一线大厂面试真题——finally块一定会执行吗
finally块一定会执行吗?这是最近一个工作3年的小伙伴去面试的时候遇到的问题。原创 2024-04-08 14:14:44 · 199 阅读 · 0 评论 -
一线大厂面试真题——聊聊你知道的设计模式
比如单例模式、装饰器模式、工厂模式、代理模式等。创建型模式:是对对象创建过程的各种问题和解决方案的总结,包括各种工厂模式、单例模式、构建器模式、原型模式。比较常见的行为型模式有策略模式、解释器模式、命令模式、观察者模式、迭代器模式、模板方法模式、访问者模式。常见的结构型模式,包括桥接模式、适配器模式、装饰者模式、代理模式、组合模式、外观模式、享元模式等。大致按照模式的应用目标分类,设计模式可以分为创建型模式、结构型模式和行为型模式。行为型模式:是从类或对象之间交互、职责划分等角度总结的模式。原创 2024-04-03 10:41:35 · 227 阅读 · 0 评论 -
一线大厂面试真题——Java有几种文件拷贝方式,哪一种效率最高
关于文件IO方面的问题和内容还挺多的,这块属于Java里面的基础知识,但是随着这个技术知识的延展,会涉及到NIO、AIO、零拷贝、IO多路复用机制等等。对于求职者来说,这块内容的重要性也不言而喻。原创 2024-04-03 10:38:15 · 339 阅读 · 0 评论 -
一线大厂面试真题——强引用、软引用、弱引用、虚引用有什么区别
强引用、软引用、弱引用、虚引用有什么区别?这个问题难倒了很多资深Java工程师,不是因为这个问题本身有多难。而是确实它是一个比较小众的知识点。原创 2024-04-02 10:15:16 · 587 阅读 · 0 评论 -
一线大厂面试真题——HashMap啥时候扩容,为什么扩容
这是一个针对1到3年左右Java开发人员的面试题,问题本身不是很难,但是对于这个阶段来说,由于不怎么关注,所以会难住一部分同学。原创 2024-04-02 10:13:10 · 610 阅读 · 0 评论 -
一线大厂面试真题——HashMap中的hash方法为什么要右移16位异或
之所以要对hashCode无符号右移16位并且异或,核心目的是为了让hash值的散列度更高,尽可能减少hash表的hash冲突,从而提升数据查找的性能。从而降低了hash冲突的概率。所以也就意味着i的值,始终是使用hash值的低16位与(n-1)进行取模运算,这个是由与运算符&的特性决定的。这样就会造成key的散列度不高,导致大量的key集中存储在固定的几个数组位置,很显然会影响到数据查找性能。因此,为了提升key的hash值的散列度,在hash方法里面,做了位移运算。这个问题,确实是有点偏。原创 2024-04-02 10:05:51 · 395 阅读 · 0 评论 -
一线大厂面试真题——什么是深拷贝和浅拷贝
一个工作了3年的小伙子,委屈巴巴的说最近面试也太难了。只是找个CRUD的工作,竟然还问深拷贝和浅拷贝,这个问题又不影响写CRUD,唉。然后深情的望向天空,眼里充满了迷茫了焦虑。原创 2024-04-01 14:09:47 · 322 阅读 · 0 评论 -
一线大厂面试真题——可以讲一下ArrayList的自动扩容机制吗
随着在程序里面不断的往ArrayList中添加数据,当添加的数据达到10个的时候,ArrayList就没有多余容量可以存储后续的数据。不需要过多的关注技术底层的原理,但是在未来的职业晋升中,技术的理解程度就显得很重要。1. 首先,创建一个新的数组,这个新数组的长度是原来数组长度的1.5倍。ArrayList是一个数组结构的存储容器,默认情况下,数组的长度是10。扩容完成后再把当前要添加的元素加入到新的数组里面,从而完成动态扩容的过程。一个工作了3年的,最近在面试的时候遇到一个集合方面的问题。原创 2024-04-01 14:06:20 · 234 阅读 · 0 评论 -
一线大厂面试真题——Integer使用不当导致生产的事故
一个工作4年的,他说最近背了一个生产事故,想让来给大家分享一下避免采坑。他是做理财这块业务的,他每天会收到一个基金公司的收益文件,然后他需要把这个文件解析并且保存每个用户的收益数据到数据库。在解析文件的时候,他需要对数据的条数做校验,于是用到了Integer这个对象并且使用==来判断。测试环境都没问题,但是到了生产环境上出现用户收益没有到账的问题,造成了大规模的投诉。最后定位才发现是收益文件验证失败导致没有被解析入库。所以这里就出现一个问题:“为什么两个Integer的对象不能用==号来判断?原创 2024-03-27 14:39:48 · 467 阅读 · 0 评论 -
一线大厂面试真题——HashMap是如何解决hash冲突的
首先,HashMap底层采用了数组的结构来存储数据元素,数组的默认长度是16,当们通过put方法添加数据的时候,HashMap根据Key的hash值进行取模运算。(如图)所以HashMap引入了链式寻址法来解决hash冲突问题,对于存在冲突的key,HashMap把这些key组成一个单向链表。另外,为了避免链表过长的问题,当链表长度大于8并且数组长度大于等于64的时候,HashMap会把链表转化为红黑树(如图)。1、再hash法,就是如果某个hash函数产生了冲突,再用另外一个hash进行计算,原创 2024-03-27 14:37:21 · 350 阅读 · 0 评论 -
一线大厂面试真题——请简单说一下你对受检异常和非受检异常的理解
而非受检异常,表示在编译器可以不需要强制检查的异常,这种异常不需要显示去捕捉。所以,除了Error和RuntimeException及派生类以外,其他异常都是属于受检异常,比如IOException、SQLException。比如数据库异常、文件读取异常,这些异常是程序无法提前预料到的,但是一旦出现问题,就会造成资源被占用导致程序出现问题。(如图)所谓的受检异常,表示在编译的时候强制检查的异常,这种异常需要显示的通过。检异常,以及在Java中这两种异常是如何分类,最后说明了这两种异常的价值。原创 2024-03-25 19:39:59 · 343 阅读 · 0 评论 -
一线大厂面试真题——New String(“abc“)到底创建了几个对象
一个工作了6年的和说,最近面试感觉越来越难的,基本上都会问技术底层原理,甚至有些还会问到操作系统层面的知识。现在各个一线大厂有很多优秀的程序员毕业了,再加上市场大环境不好对程序员的需求量也在减少。如果技术底子不好,确实找工作会很困难。原创 2024-03-25 19:37:44 · 309 阅读 · 0 评论 -
一线大厂面试真题——请说一下对象的创建过程
(如图)在实例化一个对象的时候,JVM首先会去检查目标对象是否已经被加载并初始化了。如果没有,JVM需要立刻去加载目标类,然后调用目标类的构造器完成初始化。目标类的加载是通过类加载器来实现的,主要就是把一个类加载到内存里面。然后初始化的过程,主要是对目标类里面的静态变量、成员变量、静态代码块进行初始化。当目标类被初始化以后,就可以从常量池里面找到对应的类元信息,并且目标对象的大小在类加载之后就已经确定了,所以这个时候就需要为新创建的对象,根据目标对象的大小在堆内存里面分配内存空间。原创 2024-03-24 09:39:35 · 279 阅读 · 0 评论 -
一线大厂面试真题——JDK动态代理为什么只能代理有接口的类
一个工作5年的Java程序员,去应聘得物APP月薪30k的Java开发岗位。被一个基础问题问得措手不及这个问题是:JDK动态代理为什么只能代理有接口的类。这个问题在他的认知里面,是一个很正常的事情,竟然还有问什么?原创 2024-03-24 09:36:57 · 313 阅读 · 0 评论 -
一线大厂面试真题——为什么阿里巴巴的Java开发手册不建议使用Java自带的线程池
为了避免这类问题出现,们可以直接实例化ThreadPoolExecutor,然后自己设置参数的值,从而确保线程池的可控性。第一个,FixedThreadPool和SingleThreadPool中,阻塞队列长度是Integer.Max_Value,一旦请求量增加,就会堆积大量请求阻塞在队列中,可能会造成内存溢出的问题。Executors里面默认提供的几个线程池是有一些弊端的,如果是不懂多线程、或者是新手直接盲目使用,就可能会造成比较严重的生产事故。实际上,很多源码或者中间件里面,都是使用这类的方式。原创 2024-03-23 12:39:32 · 186 阅读 · 0 评论 -
一线大厂面试真题——HashMap是怎么解决哈希冲突的
b. Hash表又叫做“散列表”,它是通过key直接访问在内存存储位置的数据结构,在具体实现上,们通过hash函数把key映射到表中的某个位置,来获取这个位置的数据,从而加快查找速度。ii. 链式寻址法,这是一种非常常见的方法,简单理解就是把存在hash冲突的key,以单向链表的方式来存储,比如HashMap就是采用链式寻址法来实现的。c. 所谓hash冲突,是由于哈希算法被计算的数据是无限的,而计算后的结果范围有限,所以总会存在不同的数据经过计算后得到的值相同,这就是哈希冲突。原创 2024-03-23 12:37:40 · 404 阅读 · 0 评论 -
一线大厂面试真题——fail-safe机制与fail-fast机制分别有什么作用
比如这种情况(贴下面这个图),定义了一个CopyOnWriteArrayList,在对这个集合遍历过程中,对集合元素做修改后,不会抛出异常,但同时也不会打印出增加的元素。原因是采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。Fail-fast:表示快速失败,在集合遍历过程中,一旦发现容器中的数据被修改了,会立刻抛出ConcurrentModificationException异常,从而导致遍历失败,像这种情况(贴下面这个图)。原创 2024-03-22 09:57:46 · 343 阅读 · 0 评论 -
一线大厂面试真题——ConcurrentHashMap(JDK1.8)为什么要使用synchronized而不是如ReentranLock这样的可重入锁
synchronized则是JVM直接支持的,JVM能够在运行时作出相应的优化措施:锁粗化、锁消除、锁自旋等等。这就使得synchronized能够随着JDK版本的升级而不改动代码的前提下获得性能上的提升。但并不是每个节点都需要获得同步支持的,只有链表的头节点(红黑树的根节点)需要同步,这无疑带来了巨大内存浪费。JDK1.8中,在ConcurrentHashmap进行扩容时,其他线程可以通过检测数组中的节点决定是否对这条链表(红黑树)进行扩容,减小了扩容的粒度,提高了扩容的效率。2、获得JVM的支持。原创 2024-03-22 09:49:18 · 348 阅读 · 0 评论 -
一线大厂面试真题——Java8开始ConcurrentHashMap,为什么舍弃分段锁
既然弃用了分段锁, 那么一定由新的线程安全方案, 我们来看看源码是怎么解决线程安全的呢?ConcurrentHashMap的原理是引用了内部的 Segment ( ReentrantLock ) 分段锁,保证在操作不。但是在 Java 8 之后, JDK 却弃用了这个策略,重新使用了 synchronized+CAS。同段 map 的时候, 可以并发执行, 操作同段 map 的时候,进行锁的竞争和等待。生产环境中, map 在放入时竞争同一个锁的概率非常小,分段锁反而会造成更新等操作的长时间等待。原创 2024-03-21 19:43:39 · 132 阅读 · 0 评论 -
一线大厂面试真题——队列和栈是什么?有什么区别?
栈只能从头部取数据 也就最先放入的需要遍历整个栈最后才能取出来,而且在遍历数据的时候还得为数据开辟临时空间,保持数据在遍历前的一致性;队列则不同,他基于地址指针进行遍历,而且可以从头或尾部开始遍历,但不能同时遍历,无需开辟临。时空间,因为在遍历的过程中不影像数据结构,速度要快的多。(1)队列先进先出,栈先进后出。(2)遍历数据速度不同。原创 2024-03-20 09:29:08 · 244 阅读 · 0 评论 -
一线大厂面试真题——怎么确保一个集合不能被修改
我们很容易想到用final关键字进行修饰,我们都知道final关键字可以修饰类,方法,成员变量,final修饰的类不能被继承,final修饰的方法不能被重写,final修饰的成员变量必须初始化值,如果这个成员变量是基本数据类型,表示这个变量的值是不可改变的,如果说这个成员变量是引用类型,则表示这个引用的地址值是不能改变的,但是这个引用所指向的对象里面的内容还是可以改变的。那么,我们怎么确保一个集合不能被修改?我们再修改后,可以把键为1的值改为100,说明我们是可以修改map集合的值的。原创 2024-03-20 09:27:53 · 507 阅读 · 0 评论 -
一线大厂面试真题——哪些集合类是线程安全的
Vector:就比Arraylist多了个同步化机制(线程安全)。ConcurrentHashMap:是一种高效但是线程安全的集合。Hashtable:就比Hashmap多了个线程安全。Stack:栈,也是线程安全的,继承于Vector。原创 2024-03-19 14:27:13 · 324 阅读 · 0 评论 -
一线大厂面试真题——ArrayList 和 LinkedList 的区别是什么
ArrayList是动态数组的数据结构实现,查找和遍历的效率较高;LinkedList 是双向链表的数据结构,增加和删除的效率较高;原创 2024-03-19 14:25:50 · 446 阅读 · 0 评论 -
一线大厂面试真题——说一下 HashMap 的实现原理
HashMap采取Entry数组来存储key-value,每一个键值对组成了一个Entry实体,Entry类时机上是一个单向的链表结构,它具有next指针,指向下一个Entry实体,以此来解决Hash冲突的问题。HashMap基于map接口,元素以键值对方式存储,允许有null值,HashMap是线程不安全的。HashMap实现一个内部类Entry,重要的属性有hash、key、value、next。JDK1.8中采用数据+链表+红黑树的存储形式。JDK1.7中采用数组+链表的存储形式。原创 2024-03-19 14:24:43 · 224 阅读 · 0 评论 -
一线大厂面试真题——list与Set区别
② List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉,(元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的,加入Set 的Object必须定义equals()方法 ,另外list支持for循环,也就是通过下标来遍历,也可以用迭代器,但是set只能用迭代,因为他无序,无法用下标来取得想要的值。List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。原创 2024-03-19 14:18:48 · 146 阅读 · 0 评论 -
一线大厂面试真题——Collection 和 Collections 有什么区别
(1)Collection是最基本的集合接口,Collection派生了两个子接口list和set,分别定义了两种不同的存储方式。(2)Collections是一个包装类,它包含各种有关集合操作的静态方法(对集合的搜索、排序、线程安全化等)。此类不能实例化,就像一个工具类,服务于Collection框架。原创 2024-03-19 14:16:59 · 234 阅读 · 0 评论 -
一线大厂面试真题——Java 集合容器都有哪些
/将一个对象实例化后,进行序列化,再反序列化,也可以获得一个对象(远程通信的场景 下使用)//用 Class.forName方法获取类,在调用类的newinstance()方法。System.out.println("反序列化user:" + user2);加上负号,再减去1;将其转换为十进制数;原创 2024-03-15 14:29:33 · 210 阅读 · 0 评论 -
一线大厂面试真题——byte类型127+1等于多少
例如10000000,最高位是1,是负数,①对各位取反得01111111,转换为十进制就是127,加上负号得-127,再减去1得-128;字节长度为8位,最左边的是符号位,而127的二进制为01111111,所以执行+1操作时,01111111变为。一个数如果为正,则它的原码、反码、补码相同;一个正数的补码,将其转化为十进制,可以直接转换。大家知道,计算机中存储负数,存的是补码的兴衰。左边第一位为符号位。byte的范围是-128~127。原创 2024-03-15 09:43:12 · 273 阅读 · 0 评论 -
一线大厂面试真题——实例化对象有哪几种方式
Java的重载(overload) 最重要的应用场景就是构造器的重载,构造器重载后,提供多种形参形式的构造器,可以应对不同的业务需求,加强程序的健壮性和可扩展性,比如我们最近学习的Spring源码中的ClassPathXmlApplicationContext,它的构造函数使用重载一共提供了10个构造函数,这样就为业务的选择提供了多选择性。总结:重载必须要修改方法(构造器)的形参列表,可以修改方法的返回值类型,也可以修改方法的异常信息即访问权限;cglib实现动态代理,核心原理用的就是方法的重写;原创 2024-03-14 19:18:34 · 424 阅读 · 0 评论 -
一线大厂面试真题——在 Java 中,什么时候用重载,什么时候用重写
总结:方法重写时,参数列表,返回值得类型是一定不能修改的,异常可以减少或者删除,但是不能抛。(2)重写的使用是建立在继承关系上的,子类在继承父类的基础上,增加新的功能,可以用重写。(1)重载是多态的集中体现,在类中,要以统一的方式处理不同类型数据的时候,可以用重载。出新的异常或者更广的异常,方法的访问权限可以降低限制,但是不能做更严格的限制。目的是提高程序的多样性和健壮性,以适配不同场景使用时,使用重载进行扩展;目的是在不修改原方法及源代码的基础上对方法进行扩展或增强时,使用重写;原创 2024-03-14 19:16:21 · 635 阅读 · 0 评论