【java面试题】2021年Java面试题整理,拿年薪全靠它了

发布时间:2021-11-12 17:23:09
2021java面试题整理,拿到年薪全靠它了。是我们每个人都要经历的事,大多数人并不止一次,这里给大家总结一下最新的一期试题,让大家在找工作的时候可以事半功倍。

1.Switch可以使用string作为参数吗?
a.在Java7之前,switch只支持byte、short、char、int或相应的封装类和Enum类型。JAVA7增加了对String的支持。

2.equals和==的区别:
a.==的值是否相同,以确定两个变量或实例是否指向同一内存空间equals,这与判断两个变量或实例所指向的内存空间相同。

3.Object采用什么通用方法?
a.方法equals测试两个对象是否相等。
b.将方法clone复制对象。
方法getClass返回一个Class对象,该对象与当前对象有关。
d.方法notify、notifyall、wait都用于同步给定对象。

4.四种Java引用,强弱软虚,使用场景。
a.使用软引用和弱引用解决OOM问题:使用HashMap保存图片的路径与对应图片对象所关联的软引用之间的映射关系,JVM会在内存不足的情况下自动回收那些缓存图片对象所占用的空间,有效地避免了OOM问题。
b.使用软可及对象复用方法实现Java对象的高速缓存:例如当需要查询雇员信息时,我们创建了一种Employee的类。即使在几秒钟内之前才被查询过,也要重新构建实例,这会占用大量时间。通过软引用和HashMap的组合,我们可以首先保存引用方面:以软引用的方式引用一个Employee对象的实例,并将其保存到HashMap中,key为此员工的id,value对此对象的软引用,另一方面是从缓存中取出了对Employee实例的软引用,若有,则取自软引用。在不使用软引用或获得软引用的实例为null的情况下,重新构建实例并将软引用保存到该新实例。
强引用:如果对象有强引用,垃圾回收器将不会回收它。JVM不会回收当前内存空间,而是抛出OutOfMemoryError错误,从而导致程序异常终止。若希望中断强引用与一个对象之间的关联,则可以明确地将引用赋值为null,这样JVM就会在适当的时候回收这个对象。
d.软引用:当使用软引用时,当内存空间足够时,软引用可以继续使用,而不会被垃圾回收器回收,并且仅当内存不足时,软引用才被垃圾回收器回收。
e.弱引用:具有弱引用的对象的生存期较短。由于在JVM执行垃圾收集时,一旦找到了一个弱引用对象,就会回收弱引用,而不管当前内存空间是否足够。但是,因为垃圾回收器是一个低优先级的线程,因此不一定能快速地找到弱引用对象。
f.虚引用:正如名称所示,形同虚设,如果一个对象只持有虚引用,则它等同于无引用,并且可以随时通过垃圾回收器回收。
g.使用方案:

5.Hashcode的作用,与equal有何不同。
a.同样用来判断2个对象是否相等,java集合有list和set两类,其中set不允许重复实现元素,该方法不允许重复实现,如果用equal比较的话,那么如果有1000个元素,那么new就会出现一个新元素,如果需要调用1000次equal,就可以逐个与它们进行比较是否是同一个对象,这就大大降低了效率。hashcode实际上是返回对象的存储地址,如果该位置中没有元素,则将该元素直接存储到其上,如果该位置已有元素,这时,请先将equal方法与新元素进行比较,然后再将相同的内容保存下来,在其他地址中散列。

6.String、StringBuffer和StringBuilder的区别。
String类型与StringBuffer类型的主要性能差异实际上在于String是一个不变的对象。
b.StringBuffer和StringBuilder底层由char[]数组实现。
c.StringBuffer为线程安全,而StringBuilder则不安全。

7.Override与Overload是区别对待。
Overload,正如其名称所示,可以显示一个类的多态,可以是函数中有相同的函数名,但其中的参数名、返回值、类型不能相同;或者可以更改参数、类型、返回值但函数名称仍然没有变化。
也就是ride(重写)的意思,当一个子类从父类继承的时候,子类可以定义一个方法与其父类具有相同的名字和参数,当一个子类在调用该函数时,它会自动调用一个子类,而父类等于被覆盖(覆盖)。

8.抽象类与接口的区别。
一个类只能从单一的类继承,但可以实现多个接口。
接口强调特定功能的实现,而抽象类则强调关联。
抽象类中的所有方法不必是抽象的,您可以选择在抽象类中实现一些基本方法。并且界面要求所有方法必须是抽象的。

9.多种解析XML方法的原理和特点:DOM、SAX、PULL。
DOM:占用内存:在使用DOMAPI访问树结构之前,首先将所有xml文档读入内存,然后使用DOMAPI获取树结构。这一点很简单,但占用了内存。如果数据太大,手机还不够牛逼,可能会直接导致手机死亡。
b.SAX:解析效率高,内存消耗少,并且基于事件驱动:更简单地说是连续扫描文档,并在扫描到文档(document)开始和结束时,当元素(element)开始和结束时,当文档(document)结束时,向事件处理函数发出通知,由事件处理函数执行相应操作,接着再进行相同的扫描,直到文件结束。
SAX:类似于SAX,也是基于事件驱动,我们可以调用SAX的next()方法,以获得下一次解析事件(这就是开始文档),完成文档,开始标签,结束标签),当在元素出现时,可以调用XmlPullParser的getAttributte()方法来获得一个属性值,还可以调用其nextText()来获得这个节点的值。

10.wait()与sleep()的区别。
sleep来自Thread类,而wait来自Object类。
在调用sleep()方法时,该线程不释放对象锁。同时调用waithethod方法线程释放了对象锁。
sleep休眠之后不释放系统资源,wait让系统资源的其他线程可以占用CPU。
sleep(milliseconds)要求指定睡眠时间,当时间到达时,它会自动唤醒。

11.JAVA中和栈的区别,即java的存储机制。
a.在栈中分配基本数据类型比变量和对象引用更多。
b.堆内存用于存储new创建的对象和数组。
c.class变数(static修饰的变数),当装入时,程式会将类变数分配到堆中,而堆内存储器的地址则存入栈中。
d.实例变量:当您使用java关键字new时,系统在堆中打开时不一定是连续空间,它基于零散堆内存地址,将哈希算法转换成一个很长的序列来表示该变量在堆中的“物理位置”,实例变量的生存期——在缺少实例变量引用之后,GC(垃圾收集器)将被列入可回收的“清单”,但不能立即释放堆中的内存。
e.局部变量:被声明在一个方法中,或者在一个特定的代码片段中(例如for循环),执行。
上一篇 【java面试题】Java开发面试题汇总(这一篇就够了)
下一篇 【java面试题】中高级Java面试题及答案解析