面试问题记录 一 (基础部分)
面试问题记录 一 (基础部分)
前言
不知不觉已经大三结束了,最近也在准备实习面试,打算把一些面试问到的Java基础问题记录一下,其实我个人面的还是比较基础简单的,大厂也目前就这水平也不敢投,所以就只能投一些要求还是比较低的,面试这块会长期记录,毕竟也是对自己问题的反馈记录。
以下部分是Java基础,至于数据库、JavaWeb、框架、Linux、中间件、微服务还在记录修改当中。
最近也是在看东京奥运会,中国已经12金6银9铜,祝中国队一往无前,加油,加油,加油!!!
也在这里祝今年面试Java的伙伴可以一路顺风顺水!
如果记录中有什么问题是解释不正确的、偏离比较多的,请各位大佬个小伙伴及时纠正我的错误!
一、Java基础
1.JDK和JRE有什么区别?
答:JDK是Java的开发工具包(在开发工具中如果选择JDK完整环境,可以看到底层源码,但是JRE环境的话,只能看到“.class”文件源码),也就是进行调试运行Java的环境,而且包含JRE,JRE是Java的运行环境,如果仅仅是运行Java程序,则只需要安装JRE即可。
2.==和equals的区别?
答:我们通过JDK源码,可以知道equals本质上就是"=="
但由于String和Integer等封装类重写了equals方法,所以equals默认情况下是引用比较,而在String、Integer中是变成了值比较,所以一般情况下是判断值是否相等;而“==“对于基本类型来说是值比较,对于引用类型来说是引用比较
3.final在Java中的作用
答:首先是它修饰的类是不能被继承的,其次修饰的方法是不能被重写,最后修饰的变量叫做常量,且初始化之后不能被修改.
4.Java中的数据结构有哪些,基本数据类型呢?
答:数据结构八种有数组、链表、队列、哈希表、栈、堆、图、树;基本数据类型八种byte、short、int、long、float、double、Boolean、char
5.两个对象的hashCode()相同,则equals()也一定是ture吗?
答:不是,在散列表中,hashCode()相等即是两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等。
6.Java中操作字符串都有哪些类?有什么区别?String类常用的方法有?
答:String、StringBuider、StringBuffer;String声明的是不可变的对象,每次操作都会生成新的String对象,然后将指针指向新的String对象,而StringBuffer和StringBuilder修饰的变量,但StringBuffer是线程安全的(其中方法是用synchronize关键字修饰的),且性能比StringBuilder高。String类中常用的方法有length返回字符串长度、indexOf返回指定字符索引、charAt返回指定索引处的字符、equals字符串比较、subString截取字符串、replace替换字符串。
7.抽象类和接口的区别?
答:一是类只能继承一个抽象类,而可以实现多个接口;二是抽象类中有无参构造方法,接口中不能有;三是抽象类中方法修饰可以是各种,而接口中只能是public;四是抽象类中可以有main方法,但接口中不行。
8.抽象类还有什么要求吗?
答: 抽象类中可以包含抽象方法,但不同类中不可以;抽象类不能直接实例化、普通类可以;抽象类不能用final关键字修饰;抽象类中不一定有抽象方法。
9.IO流有了解吗?
答:首先是输入输出流input和output,其次可分为字节流和字符流;字节流是按8位传输、字符流是16位
10.链表和数组有什么区别
答:链表是链式存储结构,⽽数组是顺序存储结构,也就是链表可以存放在内存中不同的区域,数组是⼀块连续的区域,所以数组随机读取率⽐较⾼,但它扩展不⽅便,添加和删除的效率较低,相反链表的话,查找、添加、删除较快,扩展⽅便。
11.Java中的数据结构和基本数据类型
答:数据结构和基本数据类型都有八种,数据结构有数组、链表、队列、哈希表、堆、栈、图、树;基本数据类型有字节byte占1个字节、短整型short占2个字节、整型int占4个字节、长整型long占8个字节、单精度float占4个字节、双精度double占8个字节、布尔boolean占1位按计算机最低计算单位就是1字节、字符char占2个字节。
12.String为什么不可变?
答:因为String类是用final这关键字修饰的,而且底层中实现存储的value数组是用final修饰的,同理可知它也是不可继承的。
二、Java容器
1.List和Set的区别是什么?
答:它们都是继承Collection集合接口,List中存放的元素是可重复、有序的而set中是不可重复无序的(set中的无序是可以由HashCode决定);List下有ArrayList和LinkedList、Vector集合,Set下有HashSet、TreeSet集合
2.解释一下Map实现原理
答:Map是一种数据存储容器,数据是以键值对的形式进行存储,也就是底层是以哈希表的方式实现的,而哈希表在JDK8之前是数组+链表,而从JDK8开始是以数组+链表+红黑树的方式实现的。Map下主要有两个实现类HashMap和TreeMap;HashMap插入、删除和定位元素很快,如果是对一个有序的Key集合进行遍历则选TreeMap;
具体Map实现原理可参考这篇博文 (Map实现原理)
3.如何实现List和数组的转换?
答:List转数组调用toArray方法,数组转List调用Arrays的asList方法
4.ArrayList和LinkedList的区别是什么?
答:ArrayList底层数据结构是双向链表、支持随机访问;LinkedList底层数据结构是双向循环链表、不支持随机访问;而且前者时间复杂度是O(1)而后者是O(n)。
三、多线程
1.创建线程有哪几种方式?说说它们有什么区别?
答:一是继承Thread类,创建实例,重写run方法,二是实现Runable接口,重写接口中run方法,三是通过Callable和Future创建,第三种并未了解过。前两种⽅式都是通过run这个⽅法来创建线程,然后通过start启动线程;不管是哪两种⽅式,最终都是通过调⽤Thread类的对象的API来控制线程。相⽐继承类的⽅式,实现接⼝的⽅式⼀是适合多个相同的程序代码处理同⼀个资源,⼆是代码可以被多个线程共享,三是避免了单继承,四是线程池只能放⼊实现runable或callable类线程,不能直接放⼊继承Thread的类中。
2.线程的run方法和start方法有什么区别?
答:每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run成为线程体,通过调用Thread类的start方法来启动线程;而run方法只是线程中的一个方法,而不是多线程的,直接调用run方法必须等待run方法执行完毕才能执行接下来的代码,所以执行路径还是只有一条,没有多线程的特征;而start是用来启动一个线程,也真正实现了多线程运行,也就是无需等待run方法体代码执行完毕,可以直接继续执行下面的代码,这时候线程是处于就绪状态,然后通过此Thread类调用run方法来完成
其运行状态,而run此时称为线程体,它包含了要执行的这个线程的内容,run方法运行结束,此线程终止。
3.创建线程池的几种方式?
答:Executors工具类是通过调用底层ThreadPoolExecutor构造方法实现线程池的创建,一是创建定长的线程池,二是创建单线程化的线程池,三是创建可缓存的线程池,四是创建一个支持线程定时操作和周期操作的线程池。
具体参考这篇文章:ThreadPoolExecutor线程池解析及Executor创建线程常见四种方式
4.synchronize和volatile的区别是什么?
答:一是synchronize关键字可以使用在变量、方法、和类别之前,而volatile只能使用在变量上;二是synchronize是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住,而volatile是告诉jvm当前变量在寄存器中的值不确定,需要从主存中读取;三是synchronize可能造成线程阻塞,而volatile不会;四是synchronize可以保证变量的修改可见性和原子性,而volatile只能实现变量修改可见性,不能保证原子性;五是synchronize标记的变量可以被编译器优化,volatile标记的变量不会被编译器优化。
5.怎样保证多线程的运行安全
答:线程安全体现在三个方面:一是原子性(提供互斥访问,同一时刻只能有一个线程对数据进行操作),二是可见性(一个线程对主内存的修改可以及时的被其他线程看到),三是有序性(一个线程观察其他线程中的指令执行顺序,由于指令重排序,该观察结果一般杂乱无章)。
三、反射
1.反射是什么?有什么用?
答:首先反射主要是指程序可以访问、检测和修改它本身状态或行为的能力;其次再Java运行环境中,我们可以对任意一个类,知道有哪些属性和方法,对于任意一个对象,能否调用它的任意一个方法;即在运行时判断任意一个对象所属的类和这个类所具有的成员变量和方法,还有就是在运行时去构造任意一个类的对象和任意一个对象的方法。
四、异常
1.final、finally和finalize有什么区别?
答:final可以修饰类、变量、方法,表示该类不能被继承、该方法不能被重写、该变量不能被赋值;finally主要是处理异常的时候用,也就是finally代码块中的代码都会执行,一般用来存放一些关闭资源的代码。finalize是属于Object类的一个方法,即当我们去调用System的gc方法时候,由垃圾回收器调用finalize方法,回收垃圾。
2.try-catch-finally的出口是什么,catch中return后,finally还会执行吗?
答:try只适合处理运行时异常,try+catch适合处理运行时异常+普通异常,因为由于Java编译器的硬性规定,普通异常如果选择捕获,就必须使用catch显示声明异常并进一步处理;出口的话一个就是自己进行处理,第二个是抛出给JVM虚拟机由虚拟机进行处理,finally的话就是不管最后有没有捕获异常都进行扫尾处理。而catch中有return语句的话,finally在return之前执行。
3.说说你写代码的时候遇到的一些异常
答:NullPointerException空指针异常(访问了空对象,则抛出该异常),SQLException数据库异常(有数据库的错误信息)、NumberFormatException数字格式化异常(类型转换失败时)、IOException异常(发生I/O操作失败或中断时的抛出)、ClassCastException(当对象强制转换为不是实例的子类时抛出)、IllegalArgumentException(不合法参数)、RuntimeException(JVM虚拟机正常运行时抛出的异常超类)。
最后
其实网上面经是很多,Java这方面资料是真的多,但多是多,可是大部分都吃灰了,所以平时也是随便看看,并没有去从头到尾看一遍;在这我只记录了一下我面的四五家问的问题,比较少,而且大部分都是我个人主观回答,个人也不是学的很深入,最近是尽量把其他相关的面试问题都记录完成。
基础这块建议
1、面试放平心态,不要紧张,紧张会让人变得吞吞吐吐,不自信,而且大脑一片空白。
2、有时间多看看源码,比如集合、多线程这块,还是感觉很有用的。
3、简历上写某些技术的时候还是慎重一点,多思考为什么、怎么用。
4、叙述主观问题,我感觉star法则很好(情境(situation):指事情是在什么情况下发生
任务(task):你是如何明确你的任务的
;行动(action):针对这样的情况分析,你采用了什么行动方式;
结果(result):结果怎样,在这样的情况下你学习到了什么
)
5、基础问题答不上来,不要气馁,面试讲究自信。
祝各位小伙伴一路过关斩将,面到自己心仪的岗位!