Java史上最全的基础面试题,你一定被问过。(带答案下)

23.接口和抽象类的区别?

区别1:语法方面

1.继承实现方面((抽象类单继承,接口多实现)接口也可以继承其他接口)

2.成员变量方面

①.抽象类中可以有普通成员变量,接口中没有普通成员变量

②.抽象类和接口中都可以包含静态成员变量

3.方法方面

①.抽象类可以有构造方法,接口中不能有构造方法。

②.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。

③.抽象类中的抽象方法的访问类型可以是public,protected默认类型 , 但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。

④.抽象类中可以包含静态方法,接口中不能包含静态方法。

区别2:概念方面

抽象类所体现的是一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is-a"关系,即父类和派生类在概念本质上应该是相同的。对于接口则不然,并不要求接口的实现者和接口定义在概念本质上是一致的,仅仅是实现了接口定义的契约而已,"has-a"的关系。
接口在设计时要注意稳定性,不能随意改动方法的参数和返回值。

区别3:设计方面

抽象层次不同,抽象类是对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。抽象类是自底向上抽象而来的,接口是自顶向下设计出来的。
在这里插入图片描述
下面这个链接,暗号: csdn 。加入即可获得。
点这个,点这个。

24.java中常见的异常类型?

25.多重异常编写的注意事项?

a.排列catch语句的顺序:先子类后父类

b.发生异常时按顺序逐个匹配

c.只执行第一个与异常类型匹配的catch语句

(不要“吃异常”,父类兜底)

在catch中要输出异常信息和打印异常发生的堆栈信息,如果没有输出,则会造成异常发生了,但因为没有相关错误信息的输出,不知道异常发生的情况。这种情况简称“吃异

26.Error和Exception的区别?

Error 类和 Exception 类的父类都是 Throwable 类,他们的区别如下:

Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和预防,遇到这样的错误,建议让程序终止。

Exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。

27.检查型Exception和运行时Exception的区别?

运行时异常(Runtime Exception)编译能通过,但是一运行就终止了,程序不会处理运行时异常,出现这类异常,程序会终止。(bug的来源,出现运行时异常要排查)(父类RunTimeException)

受检查的异常(Checked Exception)要么用 try。。。catch 捕获,要么用 throws 字句声明抛出,交给它的父类处理,否则编译不会通过。(父类Exception)

28.Final、Finally、Finalize的区别?

final:用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承

finally:异常处理语句结构的一部分,表示总是执行。

finalize:Object 类的一个方法,在垃圾回收器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。这是一个被动的方法(其实就是回调方法),不需要我们调用。

29.Throw和Throws的区别?

Throw:

a.语句用在方法体内,表示抛出异常,由方法体内的语句处理。
b.是具体向外抛出异常的动作,所以它抛出的是一个异常实例,执行 throw 一定是抛出了某种异常。
Throws:

a.是声明异常语句是用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理。
b.主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道需要捕获的异常的类型。
c. 表示出现异常的一种可能性,并不一定会发生这种异常

在这里插入图片描述
下面这个链接,暗号: csdn 。加入即可获得。
点这个,点这个。

30.什么是装箱和拆箱,包装类的应用场景?

拆箱——包装类的变量可以被赋值为一个基本类型

装箱——基本类型的变量可以被赋值为一个包装类

包装类的应用场景:

主要应用在集合类中.(集合不允许存放基础数据类型,存放数字时,要用到包装类型)

包装类的作用:

a、集合不允许存放基础数据类型,存放数字时,要用包装类型;
b、包装类提供一系列实用的方法

31.List、Set、Map的区别?

①.List 和 Set 是存储单列数据的集合,Map 是存储键和值这样的双列数据的集合;

②.List 中存储的数据是有顺序,并且允许重复;

③.Map 中存储的数据是没有顺序的,其键是不能重复的,它的值是可以有重复的。

④.Set 中存储的数据是无序的,且不允许有重复,但元素在集合中的位置由元素的hashcode决定,位置是固定的(Set集合根据hashcode来进行数据的存储,所以位置是固定的,但是位置不是用户可以控制的,所以对于用户来说set中的元素还是无序的)

32.ArrayList、LinkedList的区别?

ArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高。

LinkedList采用链表存储方式。插入、删除元素时效率比较高。

33.如果一个HashMap存放有很多值,但是在不知道KEY是什么的情况下,如何遍历出所有的KEY和VALUE?

获取Iterator :Collection 接口的iterator()方法

terator的方法

boolean hasNext(): 判断是否存在另一个可访问的元素

Object next(): 返回要访问的下一个元素

entrySet(),返回此映射中包含的映射关系(键-值)

getKey()方法得到key;getValue()方法得到value

keySet(),返回键集

取出所有key的集合、获取Iterator对象、取出key、根据key取出对应的值

34.进程和线程的区别?

进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。

线程是指进程中的一个执行流程,一个进程中可以运行多个线程。比如java.exe进程中可以运行很多线程。线程总是属于某个进程。

进程包含了线程,线程必须属于某个进程,进程中的多个线程共享进程的内存,二者之间是一对多的关系。

35.线程的实现方式有哪几种?

①.继承Thread类

特点:编写简单,可直接操作线程;适用于单继承

②.实现Runnable接口

特点:避免单继承局限性;便于共享资源

③.编写callable实现类

特点:需要实现call()方法,call方法与run方法不同,call有返回值.

36.多线程中调用start方法和run方法的区别?

调用run()方法:只有主线程一条执行路径;不启动新线程(普通方法调用)。

调用start()方法:多条执行路径,主线程和子线程并行交替执行;启动一个线程。

调用start方法就是线程启动,调用后线程进入了就绪状态,

Run方法编写了线程要实现的功能,一般不直接调用,由系统来调用,如果调用就是普通的方法调用。

37.多线程中的问题?

何时用到多线程开发?

①.程序需要同时执行两个或多个任务。例如:手机淘宝中"我的界面"的后台程序,开启多个线程从不同系统获取数据,组合发给前端APP。
②.程序需要实现一些需要等待的任务,例如:导出过大的Excel文件。
③.需要一些后台运行的程序,例如:Java垃圾回收器程序。
线程安全几点注意:

1、出现线程安全问题:当多线程有共享数据的时候,由于一个线程对共享数据的操作尚未完成,其它线程就参与进来,于是就产生了数据篡改的问题。
2、如何解决线程安全的问题:要保证一个线程操作共享数据的时候,其它线程必须在外边等候,直到操作共享数据的线程执行完,其它线程才可以操作共享数据。
3、同步方法的锁就是当前对象this,同步代码块需要指定锁对象(必须保证唯一);相比较而言,同步代码块能够更加精准地控制所要管理的代码。
另:调试多线程的排查手段是多输出日志,不再是Debug,使用log4j来输出中间处理结果,来进行问题的排查。

38.HashTable与HashMap的区别?

都是实现Map接口,Hashtable继承Dictionary类,Hashmap继承AbstractMap类

Hashtable是线程安全的,效率低,键和值都不允许为空。

Hashmap是非线程安全的,效率高,键和值都允许为空。

Hashtable为什么效率低就是线程安全的:

线程安全是以牺牲效率为代价的,Hashtable是synchronized(一种同步锁,用来共享数据,一次仅有一个线程能够访问共享数据)的,所以线程安全,多个线程访问时不需要为他自己的方法实现同步。
在这里插入图片描述
下面这个链接,暗号: csdn 。加入即可获得。
点这个,点这个。

39.Join和yield的区别?

Yield:(礼让)当前线程贡献出对CPU的使用权,但是当前线程还是有可能再次获得CPU的使用权。

Join:当出现该方法时,暂停当前线程,执行其他进程,等待其他线程执行完后再执行暂停的进程。

40.线程的状态?

线程在一定条件下,状态会发生变化。

线程一共有以下几种状态:

1、新建状态(New):新创建了一个线程对象。

2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于“可运行线程池”中,变得可运行,只等待获取CPU的使用权。即在就绪状态的进程除CPU之外,其它的运行所需资源都已全部获得。

3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。

4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。

5、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

阻塞的情况分三种:

(1)、等待阻塞:运行的线程执行wait()方法,该线程会释放占用的所有资源,JVM会把该线程放入“等待池”中。进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒。

(2)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入“锁池”中。

(3)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

41.获取Class对象的三种方法是什么?

第1种方式:

没有new,根据类的class属性来获取Class对象(类名.class)

第2种方式:

在new的情况下通过对象.getClass()方法来获取Class对象

第3种方式:

通过Class.forName(“包名+类名”)方法来获取Class对象

42.什么是反射?

Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。

反射(Reflection)机制:能够动态获取类的信息以及动态调用对象的方法。

反射机制主要提供以下功能:

在运行时判断任意一个对象所属的类。
在运行时构造任意一个类的对象。
在运行时判断任意一个类所具有的成员变量和方法。
在运行时调用任意一个对象的方法。
对反射的理解:

1、平时我们创建对象的时候,都是通过New某某类来创建的,但是通过反射技术,我们可以通过Class.forName(类的全路径)来创建实例,例如:加载JDBC驱动的时候,就是采用反射技术。

2、反射在平时开发中主要应用于框架层的开发,例如Spring框架内部就采用了反射技术来创建实例。

43.工厂模式和单例模式?

单例模式:

应用该模式的类一个类只能有一个实例。它必须自行创建这个实例,必须自行向整个系统提供这个实例。从具体实现角度来说:

一是单例模式的类只提供私有的构造函数;

二是类定义中含有一个该类的静态对象私有对象;

三是该类提供了一个静态的公有函数用于创建或获取它本身的静态私有对象。

工厂模式:

就简单说,对象的创建由传统的自身创建交付给一个工厂类创建,然后自身通过工厂类的工厂方法获得对象即可,适用场景是对象的创建步骤繁琐,过程比较复杂。

工厂模式和单例模式的区别:

区别1:工厂模式可以创建不同种类的对象实例,单例模式只能创建一种的对象实例;

区别2:工厂模式创建的对象实例在内存中没有只能创建一份的要求,单例模式创建的对象实例在内存中只有一份

提供【免费】的Java架构学习资料,学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。

下面这个链接,暗号: csdn 。加入即可获得。
点这个,点这个。

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书。
在这里插入图片描述
完。

猜你喜欢

转载自blog.csdn.net/weixin_48011329/article/details/107819418
今日推荐