本文小结了JAVA常见的基础面试问题,希望对大家面试有帮助。
知识点拓展的链接均为自己这一个月内整理的文章是相关知识点详解。
Welcome reading and learning to progress together.
1.有继承 2. 有重写 3. 要有父类引用指向子类对象
一个类只能继承一个抽象类,一个类可以实现多个接口
子类继承父类时,存在与父类中某一方法相同的方法名,返回类型和参数列表,则子类方法将覆盖父类原有的方法。
方法重写特性:方法重写的返回值、方法名、参数列表必须完全一致。在一个类中具有多个函数名相同,参数列表不同的方法
。参数列表不同包含参数个数和类型的不同。4.==和equals()的区别
①关于==解读:
基本数据类型:比较的是值是否相同
引用数据类型:比较的是引用(地址)是否相同
②关于equals解读:
对于重写equals方法的引用数据类型:比较的是值是否相同
对于未重写equals方法的引用数据类型,源码继承object的equals方法,等同于==,即比较引用(地址)是否相同
补充源码:
&与&&都可以用做逻辑与运算符
,表示逻辑与(and),当运算符两边的表达式结果都为true时,整个运算的结果才为true,否则为false&&具有短路功能
,即如果第一个表达式为false,则不再计算第二个表达式&还可以用作位运算符
,当&操作符两边的表达式不是boolean类型时,&表示按位与操作final修饰的类不可被继承,被final修饰的方法不可被重写,被final修饰的变量。
常考
StringBuffer:线程安全
,StringBuilder:线程不安全
联系:ArrayList与LinkedList都是List接口的实现类,都表示元素有序可重复的单值集合
9.HashMap与ConcurrentHashMap的区别?
HashMap是非线程安全的,而ConcurrentHashMap是线程安全的
,它在HashMap的基础上加入了分段锁的概念,即创建的Map的初始数组中的每一个元素为一个区块(segment),当线程A对键值对进行操作时只会锁住当前区块,而不影响对其它区块的操作,提高了Map在多线程并发操作时的效率。10.列举10个常见异常
NullPointerException 空指针异常 、 ClassNotFoundException 类找不到异常
ArithmeticException 数学运算异常、 IndexOutOfBoundsExcept 下标越界异常
IllegalArgumentException 非法参数异常 、 FileNotFoundException 文件未找到异常
NumberFormatException 字符串转为数字异常、 EOFException 文件已结束异常
SQLException 操作数据库异常、 IOException 输入输出异常
常考
新建状态(New)
:当线程对象创建后即进入新建状态就绪状态(Runnable)
:当调用线程对象的start()方法后,线程即进入就绪状态,等待CPU调度运行状态(Running)
:当CPU开始调度处于就绪状态的线程时,线程即进入运行状态阻塞状态(Blocked)
:处于运行状态中的线程由于某种原因,暂时放弃了对CPU的使用权,停止执行,即进入阻塞状态,直到其进入就绪状态才有机会获得CPU的调度而进入运行状态,根据阻塞原因的不同,阻塞状态分为:等待阻塞(wait)、同步阻塞(synchornized)、其它阻塞(sleep、join)死亡状态(Dead)
:线程执行完后或因异常而退出了run()方法,该线程的生命周期结束建议了解线程的三种创建方式!!!反正我面试的时候被问过!
13.简述线程池及工作原理
线程池是管理线程的容器,先启动若干数量的线程,并让这些线程都处于睡眠状态,当客户端有一个新请求时,就会唤醒线程池中的某一个睡眠线程,让它来处理客户端的这个请求,当处理完这个请求后,线程又处于睡眠状态
小结:线程池是面向后台程序的,是为了提高内存和CPU效率
。
17.简述数据库连接池
数据库连接池是管理数据库连接的容器
,数据库连接是一种关键的、有限的、昂贵的资源,一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完都关闭连接,这样造成系统的性能低下。
作用:连接池技术尽可能多地重用了消耗内存地资源,大大节省了内存,提高了服务器地服务效率,能够支持更多的客户服务
。通过使用连接池,将大大提高程序运行效率,同时,我们可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。
小结:连接池是面向数据库连接的,是为了优化数据库连接资源
常考
Servlet是单实例多线程的,自始至终只会创建一个对象来响应用户请求。
①如果web.xml中没有配置load-on-startup
,则当用户第一次请求到达时创建servlet类的对象,然后使用该对象依次调用service(ServletRequest,ServletResponse)—service(HttpServletRequest,HttpServletResponse)—doGet/doPost方法响应用户请求;当用户请求再次到达时,不会重新创建对象,直接使用已经创建的对象调用service—service—doGet/doPost进行响应。②
如果web.xml中有该Servlet的load-on-startup配置
,则服务器启动时会按照load-on-startup配置的加载顺序依次创建Servlet对象,当请求到达时直接使用对象调用service-service-doGet/doPost方法进行相应。
③当服务器关闭时,就销毁Servlet对象实例
虽然JSP很少用了还是建议了解一点内置对象
这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
Collection:集合类的上级接口
,继承与他的接口主要有Set 和List.Collections:针对集合类的一个帮助类
,提供了一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
TCP(Transmission Control Protocol,传输控制协议)
是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。UDP(User Data Protocol,用户数据报协议)
, UDP 是一个非连接的协议,传输数据之前源端和终端不建立连接。(不安全)
session 保存在服务器
,客户端不知道其中的信息;cookie 保存在客户端
,服务器能够知道其中的信息。我面试的时候考的
sleep()是 Thread 类中的方法,而 wait()则是 Object 类中的方法
。sleep()方法导致了程序暂停,但是他的监控状态依然保持着
,当指定的时间到了又会自动恢复运行状态。在调用sleep()方法的过程中,线程不会释放对象锁。wait()方法会导致线程放弃对象锁,进入等待此对象的等待锁定池
,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。25.简述HashMap存储过程
HashMap中键值对是基于哈希表(数组+链表+二叉树)的存储。
①.当我们创建一个HashMap集合时,默认创建一个初始长度为16的数组(加载因子为0.75);
②.当我们向HashMap中添加键值对的时候,首先根据键值对键的hash码除以数组的长度取余以确定键值对在map中的位置
③.当这个位置有多个键值对时,以链表的结构进行存储;
④.在JDK8中,当链表长度大于8时,则将链表结构转换为二叉树进行存储
扩容原理:当map的数组中元素超过数组长度的75%时,表示需要扩容(扩容算法<<1),每次扩容都会导致对所有键值对进行重新排列,会影响map的性能,所以在实际开发中要尽量避免无谓的扩容。
Thank you very much for your reading. I hope we can all be good programmers.
2020.03.12 辰兮的第26篇博客 thanks~
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦