当前位置: 首页 > 后端技术 > Java

80%大厂必问的面试题,有答案

时间:2023-04-01 17:40:54 Java

面向对象的三大特性封装、继承、多态,多态的好处,如何在代码中实现多态,如何在虚拟机中实现多态,让不同不同类型的对象响应同一条消息,好处如下:可替换性:多态性可以替换已有的代码可扩展性:增加新的子类不会影响已有的类结构接口:多态性通过方法签名为超类,为子类提供接口,可由子类改进或重写,实现灵活性和简化代码中:接口实现,继承父类重写方法,同类中的方法重载虚拟机中:动态绑定技术(dynamicbinding),引用对象的实际类型执行时判断,根据实际类型调用相应的方法作为阅读红利。】得到!接口的含义,抽象类的含义接口:规范、扩展、回调抽象类:为其他子类提供一个通用的类型;在包子类中重复定义一个内容;定义抽象方法,虽然子类有不同的实现,但是定义时一致的父类的静态方法是否可以被子类覆盖。重写只适用于实例方法,不适用于静态方法,子类中包含与父类签名相同的静态方法,我们一般称之为隐藏。什么是不可变对象不可变对象是指对象一旦创建,其状态就不能改变。任何修改都会创建一个新对象,如String、Integer和其他包装类。静态变量和实例变量的区别静态变量存在于方法区,属于类。实例变量存储在堆上,它们的引用存在于当前线程栈中。你能创建一个包含可变对象的不可变对象吗?您需要注意不要共享可变对象的引用。如果需要更改,请返回原始对象的副本。示例:日期对象。Java中创建对象的几种方式:new,reflection,clone(),通过序列化机制Switch可以使用String作为参数,能不能作用于byte,longJava7之前不能使用String作为参数,可以使用byte,short,char,int和封装类和枚举,Java7以后可以用String,long不能用了,讲string的intern()方法。intern()方法会先从常量池中查询常量值是否存在,不存在则创建。否则,直接放回对象的公共方法是什么?euqals(),toString(),clone(),wait(),notify(),nofifyAll(),getClass()Java中的四种引用强引用,软引用,弱引用,虚引用。不同的引用类型主要体现在GC上:强引用:如果一个对象有强引用,它就不会被垃圾回收器回收。即使当前内存空间不足,JVM也不会回收,而是抛出OutOfMemoryError错误,导致程序异常终止。如果要打破强引用与对象的关联,可以显式地将引用赋值为null,这样JVM就会在合适的时候回收对象。软引用:当使用软引用时,如果内存空间足够,软引用可以继续使用而不被垃圾回收器回收。只有当内存不足时,软引用才会被垃圾回收器回收。弱引用:具有弱引用的对象的生命周期较短。因为JVM在进行垃圾回收时,一旦发现弱引用对象,无论当前内存空间是否足够,都会回收弱引用。但是,由于垃圾回收器是一个优先级较低的线程,它可能无法快速找到弱引用对象。Phantomreference:顾名思义,没有用。如果一个对象只持有虚引用,则相当于没有引用,随时可能被垃圾回收器回收。WeakReference和SoftReference的区别虽然WeakReference和SoftReference都有利于提高GC和内存的效率,但是一旦WeakReference失去了最后一个强引用,它就会被GC回收,而softreference不能阻止它被回收,但是可以会延迟到JVM内存不够用的时候。为什么有不同的引用类型?不像C语言,我们可以控制内存的申请和释放。在Java中,有时候我们需要适当的控制对象被回收的时机,于是就诞生了不同的引用类型,可以说是各有千秋。引用类型其实是对GC回收不可控时机的妥协。有几个使用场景可以充分说明:使用软引用和弱引用解决OOM问题:使用一个HashMap来保存图片的路径和对应图片对象关联的软引用的映射关系。当内存不足时,JVM会自动回收这些缓存的图片对象占用的空间,从而有效避免OOM问题。通过软引用实现Java对象的缓存:比如我们创建一个Person类,如果我们每次都需要查询一个人的信息,即使是几秒前查询的,也必须重新构建一个实例,这会造成大量Person对象的消耗,而且由于这些对象的生命周期比较短,会造成多次GC影响性能。此时,软引用和HashMap的结合可以构建缓存来提高性能。Java中==和equals()的区别,equals()和hashcode()的区别和联系==是一个运算符,比较两个变量是否相等,equals是Object类的一个方法,就是用于比较两个对象是否相等。默认的equals方法比较两个对象的地址。这时候,结果是一样的。如果要比较内容,需要重写equals方法。hashcode()是Object类的一个方法,返回一个哈希值。如果equals()相同,hashcode()相同,反之亦然。两个不相等的对象是否可能具有相同的哈希码?有可能两个不相等的对象有相同的hashcode值,但是hashmap就会有冲突。如果对象相等,则哈希码相等。否则,它可以在hashcode中使用随机数吗?不,哈希码必须是相同的值。a==b和a.equals(b)有什么区别?如果a和b都是对象,a==b比较引用,只有当a和b指向堆中同一个对象时才会返回true,a.equals(b)进行逻辑比较。通常,重写此方法以提供逻辑比较。3*0.1==0.3false的返回值是多少,因为有些浮点数不能准确表示?a=a+b和a+=b有区别吗?+=运算符将隐式转换。;s1=s1+1;代码有没有错误,如果有错误,如何修改?如果有错误,s1=(short)(s1+1);shorts1=1;s1+=1是否有错误,如果有错误,如何修改+=运算符会自动强制表达式结果放在right匹配左边的数据类型,所以是的,&和&&的区别在于前者是位运算,后者是逻辑运算符。Java内部可以有类吗?(非内部类)一个Java中只能有一个publicclass,可以有多个defaultclasses。如何使用labels和break正确退出多层嵌套循环;内部类的作用。内部类提供了更好的封装,除了外围类。其他类无法访问final、finally和finalize之间的区别。fianl是修饰符,可以修饰类、方法和变量。finally是一个关键字。捕获异常和try结合使用,肯定会执行。finalize是在对象被回收之前调用的方法,给对象本身最后一次复活的机会,但是finalize什么时候调用并没有保证。clone()是方法java.lang.Cloneable的指示性接口,不包含任何方法,clone方法定义在object中,clone()方法是本地方法,用c或c++实现有什么区别深拷贝和浅拷贝的区别浅拷贝:只拷贝所考虑的对象,不拷贝它所指的对象深拷贝:拷贝所有对象。静态的用途是什么?静态变量和静态方法由类实例共享。静态块,初始化操作。装饰内部类,为静态内部类导包,在某个类中指定静态资源的导入,不需要使用类名finalfinal有什么用法修饰的方法不能继承,修饰的方法不能重写,修改后的变量不能改变。对于被final修饰的方法,JVM会尝试在内部进行关联以提高运行效率,在编译阶段会将修饰的变量存储在常量池中。编译器必须遵守final字段的两个重排规则:1.在构造函数中写入一个final字段,然后将构造对象的引用赋给一个引用变量,这两个操作之间不能重新排序2.第一次读取引用包含一个final字段对象,并且后续第一次读取final字段,这两个操作不能重新排序。作为读书的福利,我整理了一些Java面试真题。我希望每个人都能赢得他们最喜欢的报价。如果您需要,可以【点击这里】获取!