2023编程题库:Java面试题集及参考答案.pdf
《2023编程题库:Java面试题集及参考答案.pdf》由会员分享,可在线阅读,更多相关《2023编程题库:Java面试题集及参考答案.pdf(32页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、2023编程精选题库:Java面试题集及参考答案相关概念面向对象的三个特征封装,继承,多态.这个应该是人人皆知.有时候也会加上抽象.多态的好处允许不同类对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息就是函数调用).主要有以下优点:1.可替换性:多态对已存在代码具有可替换性.2.可扩充性:增加新的子类不影响已经存在的类结构.3.接口性:多态是超类通过方法签名,向子类提供一个公共接口,由子类来完善或者重写它来实现的.4.灵活性.5.简化性.代码中如何实现多态实现多态主要有以下三种方式:1.接口实现2.继承父类重写方法3.同一类中进行方法重载虚拟机是如何实
2、现多态的动态绑定技术(dynamic binding),执行期间判断所引用对象的实际类型,根据实际类型调用对应的方法.接口的意义接口的意义用三个词就可以概括:规范,扩展,回调.抽象类的意义抽象类的意义可以用三句话来概括:1.为其他子类提供一个公共的类型2.封装子类中重复定义的内容3.定义抽象方法,子类虽然有不同的实现,但是定义时一致的接口和抽象类的区别比较抽象类接口默认方法抽象类可以有默认的方法实现java 8之前,接口中不存在方法的实现.实现方式子类使用extends关键字来继承抽象类.如果子类不是抽象类,子类需要提供抽象类中所声明方法的实现.子类使用implements来实现接口,需要提供
3、接口中所有声明的实现.构造器抽象类中可以有构造器,接口中不能和正常类区别抽象类不能被实例化接口则是完全不同的类型访问修饰符抽象方法可以有public,protected和default等修饰接口默认是public,不能使用其他修饰符多继承一个子类只能存在一个父类一个子类可以存在多个接口添加新方法想抽象类中添加新方法,可以提供默认的实现,因此可以不修改子类现有的代码如果往接口中添加新方法,则子类中需要实现该方法.父类的静态方法能否被子类重写不能.重写只适用于实例方法,不能用于静态方法,而子类当中含有和父类相同签名的静态方法,我们一般称之为隐藏.什么是不可变对象不可变对象指对象一旦被创建,状态就不
4、能再改变。任何修改都会创建一个新的 对 象,如String、Integer及其它包装类。静态变量和实例变量的区别?静态变量存储在方法区,属于类所有.实例变量存储在堆当中,其引用存在当前线程栈.能否创建一个包含可变对象的不可变对象?当然可以创建一个包含可变对象的不可变对象的,你只需要谨慎一点,不要共享可变对象的引用就可以了,如果需要变化时,就返回原对象的一个拷贝。最常见的例子就是对象中包含一个日期对象的引用.java创建对象的几种方式1.采 用new2.通过反射3.采用 clone4.通过序列化机制前2者都需要显式地调用构造方法.造成耦合性最高的恰好是第一种,因此你发现无论什么框架,只要涉及到解
5、耦必先减少new的使用.switch中能否使用string做参数在idk 1.7之前,switch只能支持byte,short,char,int或者其对应的封装类以及Enum类型。从idk 1.7之 后switch开始支持String.switch 能否作用在 byte,long?可以用在byte上,但是不能用在long上.String sl=ab,String s2=a+b,String s3=a,String s4二 b户5=53+54请问55=52返回什么?返 回false.在编译过程中,编译器会将s2直接优化为ab”,会将其放置在常量池当中,s5则是被创建在堆区,相当于s5=newSt
6、ring(ab);你对String对象的intern。熟悉么?intern。方法会首先从常量池中查找是否存在该常量值,如果常量池中不存在则现在常量池中创建,如果已经存在则直接返回.比如String sl=aa;String s2=sl.intern();System.out.print(sl=s2);返回 trueObject中有哪些公共方法?1.equals()2.clone()3.getClass()4.notify(),notifyAll(),wait()5.toStringjava当中的四种引用强引用,软引用弱引用虚引用不同的引用类型主要体现在GC:1.强 引 用:如果一个对象具有强引
7、用,它就不会被垃圾回收器回收。即使当前内存空间不足,JVM也不会回收它,而是抛出OutOfMemoryError错 误,使程序异常终止。如果想中断强引用和某个对象之间的关联,可以显式地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象2.软 引 用:在使用软引用时,如果内存的空间足够,软引用就能继续被 使 用,而不会被垃圾回收器回收,只有在内存不足时,软引用才会被垃圾回收器回收。3.弱 引 用:具有弱引用的对象拥有的生命周期更短暂。因为当JVM进行垃圾回收,一旦发现弱引用对象,无论当前内存空间是否充足,都会将弱引用回收。不过由于垃圾回收器是一个优先级较低的线程,所以并不一定能
8、迅速发现弱引用对象4.虚 引 用:顾名思义,就是形同虚设,如果一个对象仅持有虚引用,那么它相当于没有引用,在任何时候都可能被垃圾回收器回收。WeakReference 与 SoftReference 的区别?这点在四种引用类型中已经做了解释,这里简单说明一下即可:虽然WeakReference与SoftReference都有利于提高GC和内存的效率,但是WeakReference,一旦失去最后一个强引用,就会被GC回收,而软引用虽然不能阻止被回收,但是可以延迟到JVM内存不足的时候。为什么要有不同的引用类型不 像C语言,我们可以控制内存的申请和释放,在Java中有时候我们需要适当的控制对象被回
9、收的时机,因此就诞生了不同的引用类型,可以说不同的引用类型实则是对GC回收时机不可控的妥协.有以下几个使用场景可以充分的说明:1.利 用 软 引 用 和 弱 引 用 解 决0 0 M问 题:用 一 个HashMap来保存图片的路径和相应图片对象关联的软引用之间的映射关系,在 内 存 不 足 时,JVM会自动回收这些缓存图片对象所占用的空间,从而有效地避免了0 0 M的问题.2.通 过 软 引 用 实 现Java对象的高速缓存:比如我们创建了一 Person的 类,如 果 每 次 需 要 查 询 一 个 人 的 信 息,哪 怕 是 几 秒 中 之 前 刚 刚 查 询 过 的,都 要 重 新 构
10、建 一 个 实 例,这 将 引 起 大 量Person对象的消耗,并且由于这些对象的生命周期相对较短,会 引 起 多 次GC影响性能。此时,通过软引用和HashMap的结合可以构建高速缓存,提供性能.java中=和 eqauls()的区别,equals()禾 口 hdShCOCle 的区别=是运算符,用于比较两个变量是否相等,而equals是Object类的方法,用于比较两个对象是否相等.默认Object类 的equals方法是比较两个对象的地址,此时和=的结果一样.换句话说:基本类型比较用=,比较的是他们的值.默认下,对象用=比较时,比较的是内存地址,如果需要比较对象内容,需要重写equal
11、方法equals。和 hashcode()的联系hashcode()是Object类的一个方法,返回一个哈希值.如果两个对象根据equal。方法比较相等,那么调用这两个对象中任意一个对象的hashCode。方法必须产生相同的哈希值.如果两个对象根据eqaul()方法比较不相等,那么产生的哈希值不一定相等(碰撞的情况下还是会相等的.)a.hashCode。有什么用?与a.equals(b)有什么关系hashCode()方法是相应对象整型的hash值。它常用于基于hash的集合类,如 Hashtable、HashMap、LinkedHashMap 等等。它与 equals。方法关系特别紧密。根据J
12、ava规范,使用equal()方法来判断两个相等的对象,必须具有相同的hashcode。将对象放入到集合中时,首先判断要放入对象的hashcode是否已经在集合中存在,不存在则直接放入集合.如果hashcode相等,然后通过equal。方法判断要放入对象与集合中的任意对象是否相等:如果equal。判断不相等,直接将该元素放入集合中,否则不放入.有没有可能两个不相等的对象有相同的hashcode有可能,两个不相等的对象可能会有相同的hashcode值,这就是为什么在hashmap中会有冲突。如果两个对象相等,必须有相同的hashcode值,反之不成立.可以在hashcode中使用随机数字吗?不行
13、,因为同一对象的hashcode值必须是相同的a=b与a.equals(b)有什么区别如果a和b都是对象,则a=b是比较两个对象的引用,只有当a和b指向的是堆中的同一个对象才会返回true,而a.equals(b)是进行逻辑比较,所以通常需要重写该方法来提供逻辑一致性的比较。例如,String类重写equals()方法,所以可以用于两个不同对象,但是包含的字母相同的比较。3*0.1=0.3 返回值是什么false,因为有些浮点数不能完全精确的表示出来。a=a+b与a+=b有什么区别吗?+=操作符会进行隐式自动类型转换,此处a+=b隐式的将加操作的结果类型强制转换为持有结果的类型,而a=a+b则
14、不会自动进行类型转换.如:byte a=127;byte b=127;b=a+b;/error:cannot convert from int to byteb+=a;/ok(译者注:这个地方应该表述的有误,其实无论a+b的值为多少,编译器都会报 错,因 为a+b操作会将a、b提 升 为int类 型,所 以 将int类型赋值给byte就会编译出错)short sl=1;si=si+1;该段代码是否有错,有的话怎么改?有错误,short类型在进行运算时会自动提升为int类型,也就是说si+i的运算结果 是int类型.short sl=1;si+=1;该段代码是否有错,有的话怎么改?+=操作符会自
15、动对右边的表达式结果强转匹配左边的数据类型,所以没错.&和&的区别首先记住&是位操作,而&是逻辑运算符.另外需要记住逻辑运算符具有短路特性,而&不具备短路特性.以上代码将会抛出空指针异常.一个.java文件内部可以有类?(非内部类)只能有一个public公共类,但是可以有多个default修饰的类.如何正确的退出多层嵌套循环.1.使 用 标 号 和break;2.通过在外层循环中添加标识符内部类的作用内部类可以有多个实例,每个实例都有自己的状态信息,并且与其他外围对象的信息相互独立.在单个外围类当中,可以让多个内部类以不同的方式实现同一接口,或者继承同一个类.创建内部类对象的时刻不依赖于外部类
16、对象的创建.内部类并没有令人疑惑的is-a关系,它就像是一个独立的实体.内部类提供了更好的封装,除了该外围类,其他类都不能访问final,finalize 和 finally 的不同之处final是一个修饰符,可以修饰变量、方法和类。如果final修饰变量,意味着该变量的值在初始化后不能被改变。finalize方法是在对象被回收之前调用的方法,给对象自己最后一个复活的机会,但是什么时候调用finalize没有保证。finally是一个关键字,与try和catch 一起用于异常的处理。finally块一定会被执行,无论在try块中是否有发生异常。clone。是哪个类的方法?java.Iang.C
17、loneable是一个标示性接口,不包含任何方法,clone方法在object类中定义。并且需要知道clone()方法是一个本地方法,这意味着它是由c或C +或其他本地语言实现的。深拷贝和浅拷贝的区别是什么?浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象。深拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深拷贝把要复制的对象所引用的对象都复制了一遍。static都有哪些用法?几乎所有的人都知
18、道static关键字这两个基本的用法:静态变量和静态方法.也就是被static所修饰的变量/方法都属于类的静态资源,类实例所共享.除了静态变量和静态方法之外,static也用于静态块,多用于初始化操作:此外static也多用于修饰内部类,此时称之为静态内部类.最后一种用法就是静态导包,即import static.import static是 在JDK 1.5之后引入的新特性,可以用来指定导入某个类中的静态资源,并且不需要使用类名.资源名,可以直接使用资源名,比如:final有哪些用法final也是很多面试喜欢问的地方,能回答下以下三点就不错了:1.被final修饰的类不可以被继承2.被fin
19、al修饰的方法不可以被重写3.被final修饰的变量不可以被改变.如果修饰引用,那么表示引用不可变,引用指向的内容可变.4.被final修饰的方法,JVM会尝试将其内联,以提高运行效率5.被final修饰的常量,在编译阶段会存入常量池中.回答出编译器对final域要遵守的两个重排序规则更好:1.在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序.2.初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序.数据类型相关java中int charjong各占多少字节?类型位数字节数short216i
20、nt432long864类型位数字节数float432double864char21664位的JVM当中,int的长度是多少?Java中,int类型变量的长度是一个固定值,与平台无关,都 是32位。意思就 是 说,在32位 和64位 的Java虚拟机中,int类型的长度是相同的。int和Integer的区别Integer是int的包装类型,在拆箱和装箱中,二者自动转换.int是基本类型,直接存数值,而integer是 对 象,用一个引用指向这个对象.int和Integer谁占用的内存更多?Integer对象会占用更多的内存。Integer是一个对象,需要存储对象的元数据。但 是int是一个原始
21、类型的数据,所以占用的空间更少。String,String Buffer 和 StringBuilder 区别String是字符串常量,final修饰;StringBuffer字符串变量(线程安全);StringBuilder字符串变量(线程不安全).String 和 StringBufferString和StringBuffer主要区别是性能:String是不可变对象,每次对String类型进行操作都等同于产生了一个新的String对象,然后指向新的String对象.所以尽量不在对String进行大量的拼接操作,否则会产生很多临时对象,导 致GC开始工作,影响系统性能.StringBuffe
22、r是对对象本身操作,而不是产生新的对象,因此在有大量拼接的情况下,我们建议使用StringBuffer.但是需要注意现在JVM会 对String拼接做一定的优化:String s=f,This is only+simple+test”会被虚拟机直接优化成 Strings=This is only simple test”,此时就不存在拼接过程.StringBuffer 和 StringBuilderStringBuffer是线程安全的可变字符串,其内部实现是可变数组.StringBuilder是jdk 1.5新增的,其功能和StringBuffer类似,但是非线程安全.因此,在没有多线程问题的
23、前提下,使用StringBuilder会取得更好的性能.什么是编译器常量?使用它有什么风险?公共静态不可变(public static final)变量也就是我们所说的编译期常量,这里的public可选的。实际上这些变量在编译时会被替换掉,因为编译器知道这些变量的值,并且知道这些变量在运行时不能改变。这种方式存在的一个问题是你使用了一个内部的或第三方库中的公有编译时常量,但是这个值后面被其他人改变了,但是你的客户端仍然在使用老的值,甚至你已经部署了一个新的jar。为了避免这种情况,当你在更新依赖JAR文件时,确保重新编译你的程序。java当中使用什么类型表示价格比较好?如果不是特别关心内存和性
24、能的话,使用BigDecimal,否则使用预定义精度的double类型。如何将byte转 为String可以使用String接收byte参数的构造器来进行转换,需要注意的点是要使用的正确的编码,否则会使用平台默认编码,这个编码可能跟原来的编码相同,也可能不同。可以将int强转为byte类型么?会产生什么问题?我们可以做强制转换,但是Java中int是32位的而byte是8位的,所以,如果强制转化int类型的高24位将会被丢弃,byte类型的范围是从-128到128关于垃圾回收你知道哪些垃圾回收算法?垃圾回收从理论上非常容易理解,具体的方法有以下几种:1.标记-清除2.标记-复制3.标记-整理4
25、.分代回收更详细的内容参见深入理解垃圾回收算法:http:/ 世 代:年轻、年老和永久。内存的分配是发生在年轻世代中的。当一个对象存活时间足够长的时候,它就会被复制到年老世代中。对于不同的世代可以使用不同的垃圾回收算法。进行世代划分的出发点是对应用中对象存活时间进行研究之后得出的统计规律。一般来说,一个应用中的大部分对象的存活时间都很短。比如局部变量的存活时间就只在方法的执行过程中。基于这一点,对于年轻世代的垃圾回收算法就可以很有针对性.调用System.gc()会发生什么?通 知GC开始工作,但 是GC真正开始的时间不确定.进程,线程相关说说进程,线程,协程之间的区别简而言之,进程是程序运行
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2023 编程 题库 Java 试题 参考答案
限制150内