【java面试题】Java开发面试题汇总(这一篇就够了)

发布时间:2021-11-04 16:55:03
压缩,继承,多态.这些应该比较常见.有时还添加了抽象。
多态的好处
让不同的类对象对相同的消息作出响应,也就是说,相同的消息可以采取多种不同的行为(发送消息即为函数调用)。
替代性:多态对于已经存在的代码具有可替代性。
扩展性:增加新的子类并不会影响现有类结构。
接口:多态是超累性通过方法签名,设想子类提供一个公共接口,由子类对其进行改进或重写以实现。
灵活性;
简化性。
如何在代码中实现多态。
多态性的实现途径主要有三个:1.接口实现2.继承父类重写方法3.在同一个类中执行方法重载。
虚拟机器如何实现多态。
(dynamicbinding),在执行过程中,根据实际类型调用相应的方法,来确定被引用对象的实际类型。
接口的意义
界面的含义可以概括为三个字:规范,扩展,回调.
抽象类的含义。
抽象类的意义可以归结为三个句子:
给其它子类提供通用类型。
包含子类中重复定义的内容。
用一种抽象方法来定义,这些子类虽然有不同的实现,但它们在定义时会保持一致。
Java采访宝典-这篇足够了。
父类的静态方法是否可以被类覆盖。
无法.子类在继承父类之后,具有相同的静态方法和非静态方法,这是一个非静态方法覆盖父类(即方法重写),父类的这个静态方法被隐藏(如果对象是父类,则调用隐藏方法),另一个子类可以集成父类的静态和非静态方法,而方法重载我认为其元素之一是在同一类中,不能说父类方法和子类中的哪一种方法是方法重载的体现.
不变的对象是什么。
一个不可变的对象指对象一旦被创建,它的状态将无法更改。所有修改都会创建一个新的对象,比如String、Integer和其他包装类。
是否可以创建包含可变对象的不可变对象?
您肯定会创建一个包含可变对象的不变对象,您需要小心,不能共享可变对象的引用,如果需要更改,则返回原始对象的副本。一个最常用的例子是一个对date对象的引用。
java以多种方法创建对象。
采用new
通过反射
使用clone。
序列化机制下。
前面2个函数都需要显式调用构造方法.导致耦合度最高的只是第一个,所以你会发现不管什么框架,只要涉及到解耦,就必须首先减少new的使用。
switch中是否有string作为参数。
直到idk1.7,switch只支持byte、short、char、int或相应的封装类和Enum类型。自idk1.7之后,switch就支持String.
Object中的公共方法是什么?
equals()
clone()
getClass()
notify(),notifyAll(),wait()
java中有四个引用。
强引用、软引用、弱引用、虚引用.GC中主要有不同的引用类型:
强引用:如果对象有强引用,垃圾回收器将无法回收它。JVM不会回收当前内存空间,而是抛出OutOfMemoryError错误,从而导致程序异常终止。若希望中断强引用与一个对象之间的关联,则可以明确地将引用赋值为null,这样JVM就会在适当的时候回收这个对象。
柔性引用:当使用软引用时,当内存空间足够时,软引用可以继续使用,而不会被垃圾回收器回收,并且仅当内存不足时,软引用才被垃圾回收器回收。
弱引用:一个弱引用的对象具有较短的生存期。由于在JVM执行垃圾收集时,一旦找到了一个弱引用对象,就会回收弱引用,而不管当前内存空间是否足够。但是,因为垃圾回收器是一个低优先级的线程,因此不一定能快速地找到弱引用对象。
虚引:顾名思义,就是形同虚设,如果一个对象只持有虚引用,则它等同于无引用,并且可以随时由垃圾回收器回收。
WeakReference和软件Reference有什么不同?
四种引用类型对此做了解释,这里简单地说一句:尽管WeakReference和SoftReference都有助于提高GC和存储器的效率,但WeakReference,一旦丢失上一次强引用,将由GC回收,尽管软引用无法阻止被回收,不过,JVM的内存可能会被延迟。
为何使用不同的引用类型。
与C语言不同,我们可以控制内存的申请和释放,在Java中,有时我们需要适当地控制对象的回收时间,从而产生了不同的引用类型。不同的引用类型实际上是对GC回收时机的不可控折衷.以下使用场景可以很好地说明:
使用软引用和弱引用来解决OOM问题:使用HashMap保存图片的路径与对应图片对象相关的软引用之间的映射关系,JVM会在内存不足的情况下自动回收那些缓存图片对象所占用的空间,从而有效地避免了OOM问题。
实现Java对象的高速缓存:例如,我们创建了一Person的类,如果每次需要查询某人的信息,即使在几秒钟内之前才被查询过,也要重新构建一个实例,这样会消耗大量Person对象,因为这些对象的生命周期比较短,将导致多次GC影响性能。这时,通过软引用与HashMap的组合,就可以构建高速缓存,并提供性能。
java中==和eqauls()、equals()和`hashcode之间的区别。
=是一种运算子,用来比较两个变量是否相等,equals是Object类的方法,用来比较两个对象是否相等.默认Object类的equals方法是比较两个对象的地址,这一点与==相同.换言之:基本类型比较使用==,比较它们的值.默认情况下,对象用==比较时,内存地址比较若要比较对象内容,需要覆盖equal方法。
equals()与hashcode()之间的联系。
hashCode()是Object类的一种方法,返回散列值.如果两个对象基于equal()方法比较相同,对这两个对象的hashCode()方法的调用必须得到相同的散列.如果两个对象基于eqaul()方法进行比较,则因此,生成的散列值不必相等(在碰撞时,仍将相等.)
a.hashCode()有什么用?和a.equals(b)有什么关系。
hashCode()方法是对应对象整型的hash值。这经常被用在诸如Hashtable、HashMap、LinkedHashMap等基于集合类中。这种方法和equals()方法尤其相关。按照Java规范,两个使用equal()方法来判断相同的对象,必须有相同的hashcode。
把一个对象放到一个集合中时,首先会判断要放入对象的hashcode是否已经存在于集合中,没有它就直接放入集合.如果hashcode相等,接着,用equal()方法判断要放置的对象是否与集合中的任意对象相等:如果equal()判断不相等,则直接将该元素放在集合中,另外,不要放置.
两个不同的对象具有相同的hashcode是可能的吗?
两个不相等的对象可能具有相同的hashcode值,这就是hashmap发生冲突的原因。等值hashcod。
上一篇 【java面试题】Java笔试题大全带答案(经验汇总)
下一篇 【java面试题】2021年Java面试题整理,拿年薪全靠它了