java面试题

马上又是一个金九银十的招聘旺季,小编在这里给大家整理了一套各大互联网公司面试都喜欢问的一些问题或者一些出场率很高的面试题,给在校招或者社招路上的你一臂之力。

首先我们需要明白一个事实,招聘的一个很关键的因素是在给自己找未来的同事,同级别下要找比自己优秀的人,面试是一个双向选择的过程,也是一个将心比心去沟通的过程。
就像我们有的人感觉自己很牛逼,但是拿不到offer,而其他的人菜的一笔,却可以拿到offer,我们称之为玄学offer,遇到这种情况大家也不要感觉到有什么不可描述的心情,一切随缘即可!
小编这里可是有参考答案的哟,需要各位小伙伴下来逐一学习!

一、开场白
简单的介绍一下自己的工作经历与职责,在校或者工作中主要的工作内容,主要负责的内容;(你的信息一清二白的写在简历上,能答出来的最好写在上面,模棱两可不是很清楚的最好不要写,否则会被问的很尴尬)
介绍下自己最满意的,有技术亮点的项目或平台,重点介绍下自己负责那部分的技术细节;(主要对自己做过的事情是否有清晰的描述)

二、Java基础

什么是字符串常量池?
Java中创建对象的几种方式?

https://www.cnblogs.com/baizhanshi/p/5896092.html

String为什么是不可变的?

因为String类底层代码中存储字符的 char[] 数组是 final 的。

String s = new String(“xyz”);究竟产生了几个对象,从JVM角度谈谈?

两个,一个在堆区,一个在方法区的字符串常量池中。

String拼接字符串效率低,你知道原因吗?

因为创建了很多新的临时对象,浪费内存。

你真的了解String的常见API吗?
Java中的subString()真的会引起内存泄露么?

1.6 会存在,1.7 以后是创建新的对象返回,不会引起内存泄露。

浅析Java中的final关键字?

可以用来修饰类,变量,方法。
修饰后的类不能继承;变量不能被重新赋值,但是引用指向的对象属性值可以改变;
修饰的方法不能被重写。

浅析Java中的static关键字?

可以用来变量,方法,静态语句块,匿名内部类。
修饰的变量叫常量,常与 final 关键字联用;
修饰的方法叫静态方法,静态变量和静态方法都可以直接使用 类名点来调用,和对象无关。
static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。
static代码块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。

你对Java中的volatile关键字了解多少?
i++是线程安全的吗?如何解决线程安全性?
从字节码角度深度解析 i++ 和 ++i 线程安全性原理?

i++ 不是原子操作,在多线程环境下会出现线程安全问题
++i 是原子操作,不会出现线程安全问题

请谈谈什么是CAS?
从源码角度看看ArrayList的实现原理?

添加元素是一个一个添加的,当添加元素的时候,发现装不下了,才会进行扩容,扩容后的数组长度是原来的 1.5 倍。
https://blog.csdn.net/xfhy_/article/details/80193648

手写LinkedList的实现,彻底搞清楚什么是链表?

https://blog.csdn.net/zxt0601/article/details/77341098

Java中方法参数的传递规则?
Java中throw和throws的区别是什么?
重载和重写的区别?
手写ArrayList的实现,在笔试中如何过关斩将?
ArrayList遍历时什么情况下报错:java.util.ConcurrentModificationException

迭代器原理:
https://blog.csdn.net/ditto_zhou/article/details/58586734

finally语句块你踩过哪些坑?
为什么重写equals方法需同时重写hashCode方法?

那为什么在重写equals方法时都要重写hashCode方法呢:
首先equals与hashcode间的关系是这样的:
1、如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同;
2、如果两个对象的hashCode相同,它们并不一定相同(即用equals比较返回false)   

自我的理解:
由于为了提高程序的效率才实现了hashcode方法,先进行hashcode的比较,如果不同,那没就不必在进行equals的比较了,这样就大大减少了equals比较的次数,这对比需要比较的数量很大的效率提高是很明显的,一个很好的例子就是在集合中的使用;

我们都知道java中的List集合是有序的,因此是可以重复的,而set集合是无序的,因此是不能重复的,那么怎么能保证不能被放入重复的元素呢,但靠equals方法一样比较的话,如果原来集合中以后又10000个元素了,那么放入10001个元素,难道要将前面的所有元素都进行比较,看看是否有重复,欧码噶的,这个效率可想而知,因此hashcode就应遇而生了,java就采用了hash表,利用哈希算法(也叫散列算法),就是将对象数据根据该对象的特征使用特定的算法将其定义到一个地址上,那么在后面定义进来的数据只要看对应的hashcode地址上是否有值,那么就用equals比较,如果没有则直接插入,只要就大大减少了equals的使用次数,执行效率就大大提高了。

继续上面的话题,为什么必须要重写hashcode方法,其实简单的说就是为了保证同一个对象,保证在equals相同的情况下hashcode值必定相同,如果重写了equals而未重写hashcode方法,可能就会出现两个没有关系的对象equals相同的(因为equal都是根据对象的特征进行重写的),但hashcode确实不相同的。

equals() 与 == 的区别?

equals 方法比较的是内存地址,== 比较的是值的大小。

StringBuffer和StringBuilder的区别,从源码角度分析?

StringBuffer 是线程安全的,StringBuilder 是非线程安全的。
https://www.jianshu.com/p/987d3727adc3

你知道HashMap的数据结构吗?

https://blog.csdn.net/qq_38946877/article/details/86649560

为何HashMap的数组长度一定是2的次幂?

hashMap源码获取元素的位置:

static int indexFor(int h, int length) {
    // assert Integer.bitCount(length) == 1 : "length must be a non-zero power of 2";
    return h & (length-1);
}
解释:
h:为插入元素的hashcode
length:为map的容量大小
&:与操作 比如 1101 & 1011=1001
如果length为2的次幂  则length-1 转化为二进制必定是11111……的形式,在于h的二进制与操作效率会非常的快,
而且空间不浪费;如果length不是2的次幂,比如length为15,则length-1为14,对应的二进制为1110,在于h与操作,
最后一位都为0,而0001,0011,0101,1001,1011,0111,1101这几个位置永远都不能存放元素了,空间浪费相当大,更糟的是这种情况中,
数组可以使用的位置比数组长度小了很多,这意味着进一步增加了碰撞的几率,减慢了查询的效率!这样就会造成空间的浪费

HashMap何时扩容以及它的扩容机制?

当数组的容量 大于等于 总容量的 0.75 时,会扩容,扩容后的长度为原来的 2 倍。

HashMap的key一般用字符串,能用其他对象吗?

HashMap中的key可以是null,基本数据类型或引用数据类型。为了HashMap的正常使用,key一般是不可变对象,
至少该对象中用于计算hash值的属性要不可变,方可保证HashMap的正常使用。

HashMap的key和value都能为null么?如果key能为null,那么它是怎么样查找值的?

key 和 value 都可以为 null ,如果 key 为 null 值,则保存在数组的第一个下标位置的链表中

HashMap是线程安全的吗?如何实现线程安全?

https://blog.csdn.net/itzhangdaopin/article/details/78720139

从源码角度分析HashSet实现原理?

https://blog.csdn.net/canot/article/details/51240251

HashTable与HashMap的实现原理有什么不同?

hashtable是线程安全的,所有的方法都加了sychronized关键字。hashmap是线程不安全的。

String方法intern() 你真的会用吗?

什么是自动拆装箱?

其实自动拆装箱是语法糖,底层还是 new 对象了。所以比较时不能使用 == 进行比较。

String.valueOf和Integer.toString的区别?

https://blog.csdn.net/itmyhome1990/article/details/77879653

IO流面试题

https://blog.csdn.net/chengyuqiang/article/details/79183748

三、Java多线程

https://blog.csdn.net/zhengzhaoyang122/article/details/79810972

线程的生命周期包括哪几个阶段?

Java线程具有五中基本状态	
新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread();	
就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行;	
运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。注:就     绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中;	
阻塞状态(Blocked):处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才 有机会再次被CPU调用以进入到运行状态。根据阻塞产生的原因不同,阻塞状态又可以分为三种:	
	1.等待阻塞:运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态;	
	2.同步阻塞 -- 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态;	
	3.其他阻塞 -- 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。	
死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

在这里插入图片描述

多线程有几种实现方式?

https://blog.csdn.net/u011480603/article/details/75332435

请谈谈什么是进程,什么是线程?
启动线程是用start()方法还是run()方法?
说说线程安全问题,什么实现线程安全,如何实现线程安全?
sychronized和Lock的区别?

https://blog.csdn.net/u012403290/article/details/64910926

sleep()和wait()的区别?
深入分析ThreadLocal的实现原理?
你看过AbstractQueuedSynchronizer源码阅读吗,请说说实现原理?
谈谈对synchronized的偏向锁、轻量级锁、重量级锁的理解?
通过三种方式实现生产者消费者模式?
JVM层面分析sychronized如何保证线程安全的?
JDK层面分析sychronized如何保证线程安全的?
如何写一个线程安全的单例?

https://www.cnblogs.com/x_wukong/p/3962315.html

通过AQS实现一个自定义的Lock?
ThreadLocal什么时候会出现OOM的情况?为什么?
为什么wait, notify 和 notifyAll这些方法不在thread类里面?
你真的理解CountDownLatch与CyclicBarrier使用场景吗?
出现死锁,如何排查定位问题?

https://blog.csdn.net/yu616568/article/details/46417319

notify和notifyAll的区别?
线程池启动线程submit和execute有什么不同?
SimpleDateFormat是线程安全的吗?如何解决?
请谈谈ConcurrentHashmap底层实现原理?
使用synchronized修饰静态方法和非静态方法有什么区别?
当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其方法?
线程池的原理,为什么要创建线程池?创建线程池的方式?

https://blog.csdn.net/u013276277/article/details/78530322

创建线程池有哪几个核心参数? 如何合理配置线程池的大小?

https://blog.csdn.net/y666666y/article/details/70212817

synchronized修饰的静态方法和非静态方法有什么区别?

四、Java Web

什么是Servlet,Servlet生命周期方法?

Servlet 通过调用 init () 方法进行初始化。
Servlet 调用 service() 方法来处理客户端的请求。
Servlet 通过调用 destroy() 方法终止(结束)。
最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的

什么Session和Cookie,它们之间有什么联系?

https://www.cnblogs.com/ITCodeMonkey/p/7874343.html

JSP的八个隐含对象有哪些?

https://blog.csdn.net/leeyefang/article/details/38925017

JSP的四个域对象的作用范围?

https://blog.csdn.net/qq_39203959/article/details/79778694

Post和Get请求的区别?

最直观的表现就是get请求的参数跟在url后面,post请求参数跟在request body中。
get请求会在浏览器中缓存,而post请求会进行第二次提交。
get请求参数有长度限制,post参数无长度限制。
get请求在浏览器回退时是无害的,post请求在回退时会被再次提交。
get请求的参数只接受ASII字符,而post无限制。

转发和重定向有什么区别?

https://blog.csdn.net/liubin5620/article/details/79922692

JSP自定义标签,如何实现循环打印功能?
Http1.0和Http1.1的区别是什么?
拦截器与过滤器的区别?

(1)过滤器(Filter):它依赖于servlet容器。在实现上,基于函数回调,它可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例
只能在容器初始化时调用一次。使用过滤器的目的,是用来做一些过滤操作,获取我们想要获取的数据,比如:在Javaweb中,对传入
的request、response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者Controller进行业务逻辑操作。通常用的场景
是:在过滤器中修改字符编码(CharacterEncodingFilter)、在过滤器中修改HttpServletRequest的一些参数(XSSFilter(自定义过滤器)),
如:过滤低俗文字、危险字符等。

五、JVM面试题

JVM内存区域如何划分?

根据《Java虚拟机规范》的规定,运行时数据区通常包括这几个部分:程序计数器(Program Counter Register)、Java栈(VM Stack)、
本地方法栈(Native Method Stack)、方法区(Method Area)、堆(Heap)。
https://www.cnblogs.com/dolphin0520/p/3613043.html

JVM堆中对象是如何创建的?

https://blog.csdn.net/tjiyu/article/details/53923392

JVM对象的结构?

https://blog.csdn.net/u011277123/article/details/53259110

JVM垃圾回收-如何判断对象是否是垃圾对象?

https://www.cnblogs.com/daijiting/p/9991831.html

JVM垃圾回收算法有哪些?

https://www.cnblogs.com/yulinfeng/p/7163052.html

JVM垃圾收集器有哪些?

https://blog.csdn.net/chenleixing/article/details/45190225

JVM内存是如何分配的?

https://blog.csdn.net/USTC_Zn/article/details/54912367

从一道面试题分析类的加载过程?
JVM双亲委派机制?

https://blog.csdn.net/u012900118/article/details/79525931

JVM可以作为GC Root的对象有哪些?
请写出几段可以导致内存溢出、内存泄漏、栈溢出的代码?
哪些情况会导致Full GC?
频繁GC问题或内存溢出问题,如何定位?

六、SQL性能优化

数据库三范式是什么?

https://blog.csdn.net/zymx14/article/details/69789326

数据库的事务、ACID及隔离级别?

https://blog.csdn.net/liuguangqiang/article/details/52181424

不考虑事务的隔离性,容易产生哪三种情况?

https://blog.csdn.net/franky814/article/details/43115699

数据库连接池原理?

https://blog.csdn.net/fuyuwei2015/article/details/72419975

什么是B-Tree?

https://blog.csdn.net/u014165620/article/details/82976882
https://blog.csdn.net/It_BeeCoder/article/details/81258165

什么是B+Tree?

https://blog.csdn.net/csdnxingyuntian/article/details/57540650

MySQL数据库索引结构?

https://blog.csdn.net/baidu_19473529/article/details/77715905

什么是索引?什么条件适合建立索引?什么条件不适合建立索引?

https://blog.csdn.net/WuLex/article/details/69540136

索引失效的原因有哪些?如何优化避免索引失效?

https://blog.csdn.net/u010793461/article/details/79851372

MySQL如何启动慢查询日志?

https://blog.csdn.net/keketrtr/article/details/78673565

MySQL如何使用show Profile进行SQL分析?

https://blog.csdn.net/gaoshan12345678910/article/details/78840158

一条执行慢的SQL如何进行优化,如何通过Explain+SQL分析性能?
什么是行锁、表锁、读锁、写锁,说说它们各自的特性?

https://blog.csdn.net/hh1sdfsf56456/article/details/79449696

什么情况下行锁变表锁?

https://blog.csdn.net/u010502101/article/details/81429006

什么情况下会出现间隙锁?

https://blog.csdn.net/tb3039450/article/details/66475638

谈谈你对MySQL的in和exists用法的理解?

https://blog.csdn.net/u012410733/article/details/70217674

MySQL的数据库引擎有哪些,如何确定在项目中要是用的存储引擎?
各个存储引擎的特点:
在这里插入图片描述

count(*)、count(列名)和count(1)的区别?

11g下,通过实验结论,说明了count()、count(1)和count(主键索引字段)其实都是执行的count(),而且会选择索引的FFS扫描方式,
count(包含空值的列)这种方式一方面会使用全表扫描,另一方面不会统计空值,因此有可能和业务上的需求就会有冲突,因此使用count统计
总量的时候,要根据实际业务需求,来选择合适的方法,避免语义不同。

union和union all的区别?

如果我们需要将两个或多个select语句的结果作为一个整体显示出来,这是我们就需要用到union或者union all关键字。
union和union all的区别是,union会自动压缩多个结果集合中的重复结果,而union all则将所有的结果全部显示出来,不管是不是重复。

Intersect:对两个结果集进行交集操作,不包括重复行,重复的会被过滤,同时进行默认规则的排序。

Minus:对两个结果集进行差操作,返回的总是左边表中的数据且不包括重复行,重复的会被过滤,同时进行默认规则的排序。

值得注意的是:当我们要使用这两个联合SQL语句是,selecte查询语句的字段个数必须一样且字段类型要一致。在MySQL中不支持
Intersect和Minus,但可以用简单的方法来代替。

七、Spring框架

Spring的IOC和AOP机制?

https://blog.csdn.net/qq_31794059/article/details/77980512
https://blog.csdn.net/u012813201/article/details/77074795

Spring中Autowired和Resource关键字的区别?

https://blog.csdn.net/gst6062825/article/details/8765157

依赖注入的方式有几种,各是什么?

https://blog.csdn.net/a909301740/article/details/78379720

Spring容器对Bean组件是如何管理的(bean的生命周期)?

https://blog.csdn.net/kkdelta/article/details/7282782

Spring容器如何创建?

https://blog.csdn.net/tinyDolphin/article/details/75087551

Spring事务分类?

https://blog.csdn.net/u011277123/article/details/78774646

Spring事务的传播特性?

https://blog.csdn.net/jjavaboy/article/details/45243565

Spring事务的隔离级别?

https://blog.csdn.net/weixin_38070406/article/details/78157603

Spring的通知类型有哪些?

https://blog.csdn.net/cqabl/article/details/46965197

八、SpringMVC框架

SpringMVC完整工作流程,熟读源码流程?

https://blog.csdn.net/u013430196/article/details/48290835/

SpringMVC如何处理JSON数据?

https://blog.csdn.net/bsw451926392/article/details/79115996

SpringMVC拦截器原理,如何自定义拦截器?

https://blog.csdn.net/xnf1991/article/details/53113519

SpringMVC如何将请求映射定位到方法上面?结合源码阐述?

https://blog.csdn.net/qwe6112071/article/details/51035882

SpringMVC常见注解有哪些?

https://blog.csdn.net/wuruijiang/article/details/78970547

SpringMVC容器和Spring容器的区别?

https://blog.csdn.net/u014695188/article/details/51570764

SpringMVC的控制器是不是单例模式,如果是,有什么问题,怎么解决?

https://blog.csdn.net/weiha666/article/details/78670644

九、MyBatis框架

MyBatis中#和$的区别?

https://blog.csdn.net/u013552450/article/details/72528498/

MyBatis一级缓存原理以及失效情况?

https://blog.csdn.net/jield/article/details/50163327

MyBatis二级缓存的使用?

https://blog.csdn.net/u014756827/article/details/52754472

MyBatis拦截器原理?

https://blog.csdn.net/zxc123e/article/details/77119826

看过MyBatis源码吗,请说说它的工作流程?

https://blog.csdn.net/yang1464657625/article/details/53508854

十、Java高级部分

Dubbo负载均衡策略?
Dubbo中Zookeeper做注册中心,如果注册中心集群都挂掉,发布者和订阅者之间还能通信么?
Dubbo完整的一次调用链路介绍?
请说说SpringBoot自动装配原理?
有用过SpringCloud吗,请说说SpringCloud和Dubbo有什么不一样?
什么是WebService,如何基于WebService开发接口?
谈谈项目中分布式事务应用场景?
使用Redis如何实现分布式锁?
请谈谈单点登录原理?
Tomcat如何优化?
后台系统怎么防止请求重复提交?
Linux常见命令有哪些?
请说说什么是Maven的依赖、继承以及聚合?
Git暂存区和工作区的区别?
Git如何创建、回退以及撤销版本?

十一、其他

看过哪些源代码?然后会根据你说的源码问一些细节的问题?(这里主要考察面试者是否对技术有钻研的精神,还是只停留在表面,还是背了几道面经,这个对于很多有强迫症的面试官,如果你连源码都没看过,基本上是会pass掉的!)
项目中遇到了哪些比较有挑战性的问题,是如何解决的;(这个很有争议,一方面是你连一个复杂的问题都解决不了,要你过来干什么,还有就是,我的能力牛逼啊,但是公司没有业务场景让我展示啊!这个就看你遇到的面试官了,祝你好运!)

转载自:
https://www.cnblogs.com/marsitman/p/9539369.html
https://blog.csdn.net/dd864140130/article/details/55833087

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值