Hi!欢迎光临陕西省的权威思科、华为、Oracle、红帽、深信服、微软认证培训中心!
| 029-88235527
您现在所在位置:首页 > 新闻资讯 > 最新资讯 >

全面的Java面试题集及参考答案

发布日期:2019-08-22 14:51:56点击次数:

分享到:
  今天要谈的主题是关于求职.求职是在每个技术人员的生涯中都要经历多次,对于我们大部分人而言,在进入自己心仪的公司之前少不了准备工作,有一份全面细致面试题将帮助我们减少许多麻烦.在跳槽季来临之前,特地做这个系列的文章,一方面帮助自己巩固下基础,另一方面也希望帮助想要换工作的朋友.

全面的Java面试题集及参考答案

  相关概念

  面向对象的三个特征

  封装,继承,多态.这个应该是人人皆知.有时候也会加上抽象.

  多态的好处

  允许不同类对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息就是函数调用).主要有以下优点:

  可替换性:多态对已存在代码具有可替换性.

  可扩充性:增加新的子类不影响已经存在的类结构.

  接口性:多态是超类通过方法签名,向子类提供一个公共接口,由子类来完善或者重写它来实现的.

  灵活性.

  简化性.

  代码中如何实现多态

  实现多态主要有以下三种方式:

  1.接口实现

  2.继承父类重写方法

  3.同一类中进行方法重载

  虚拟机是如何实现多态的

  动态绑定技术(dynamicbinding),执行期间判断所引用对象的实际类型,根据实际类型调用对应的方法.

  接口的意义

  接口的意义用三个词就可以概括:规范,扩展,回调.

  抽象类的意义

  抽象类的意义可以用三句话来概括:

  为其他子类提供一个公共的类型

  封装子类中重复定义的内容

  定义抽象方法,子类虽然有不同的实现,但是定义时一致的

  接口和抽象类的区别

  比较抽象类接口默认方法抽象类可以有默认的方法实现java8之前,接口中不存在方法的实现.实现方式子类使用extends关键字来继承抽象类.如果子类不是抽象类,子类需要提供抽象类中所声明方法的实现.子类使用implements来实现接口,需要提供接口中所有声明的实现.构造器抽象类中可以有构造器,接口中不能和正常类区别抽象类不能被实例化接口则是完全不同的类型访问修饰符抽象方法可以有public,protected和default等修饰接口默认是public,不能使用其他修饰符多继承一个子类只能存在一个父类一个子类可以存在多个接口添加新方法想抽象类中添加新方法,可以提供默认的实现,因此可以不修改子类现有的代码如果往接口中添加新方法,则子类中需要实现该方法.

  父类的静态方法能否被子类重写

  不能.重写只适用于实例方法,不能用于静态方法,而子类当中含有和父类相同签名的静态方法,我们一般称之为隐藏.

  什么是不可变对象

  不可变对象指对象一旦被创建,状态就不能再改变。任何修改都会创建一个新的对象,如String、Integer及其它包装类。

  静态变量和实例变量的区别?

  静态变量存储在方法区,属于类所有.实例变量存储在堆当中,其引用存在当前线程栈.

  能否创建一个包含可变对象的不可变对象?

  当然可以创建一个包含可变对象的不可变对象的,你只需要谨慎一点,不要共享可变对象的引用就可以了,如果需要变化时,就返回原对象的一个拷贝。最常见的例子就是对象中包含一个日期对象的引用.

  java创建对象的几种方式

  采用new

  通过反射

  采用clone

  通过序列化机制

  前2者都需要显式地调用构造方法.造成耦合性最高的恰好是第一种,因此你发现无论什么框架,只要涉及到解耦必先减少new的使用.

  switch中能否使用string做参数

  在idk1.7之前,switch只能支持byte,short,char,int或者其对应的封装类以及Enum类型。从idk1.7之后switch开始支持String.

  switch能否作用在byte,long上?

  可以用在byte上,但是不能用在long上.

  Strings1=”ab”,Strings2=”a”+”b”,Strings3=”a”,Strings4=”b”,s5=s3+s4请问s5==s2返回什么?

  返回false.在编译过程中,编译器会将s2直接优化为”ab”,会将其放置在常量池当中,s5则是被创建在堆区,相当于s5=newString(“ab”);

  你对String对象的intern()熟悉么?

  intern()方法会首先从常量池中查找是否存在该常量值,如果常量池中不存在则现在常量池中创建,如果已经存在则直接返回.

  比如

  Strings1=”aa”;

  Strings2=s1.intern();

  System.out.print(s1==s2);//返回true

  Object中有哪些公共方法?

  equals()

  clone()

  getClass()

  notify(),notifyAll(),wait()

  toString

  java当中的四种引用

  强引用,软引用,弱引用,虚引用.不同的引用类型主要体现在GC上:

  强引用:如果一个对象具有强引用,它就不会被垃圾回收器回收。即使当前内存空间不足,JVM也不会回收它,而是抛出OutOfMemoryError错误,使程序异常终止。如果想中断强引用和某个对象之间的关联,可以显式地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象

  软引用:在使用软引用时,如果内存的空间足够,软引用就能继续被使用,而不会被垃圾回收器回收,只有在内存不足时,软引用才会被垃圾回收器回收。

  弱引用:具有弱引用的对象拥有的生命周期更短暂。因为当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值。它常用于基于hash的集合类,如Hashtable、HashMap、LinkedHashMap等等。它与equals()方法关系特别紧密。根据Java规范,使用equal()方法来判断两个相等的对象,必须具有相同的hashcode。

  将对象放入到集合中时,首先判断要放入对象的hashcode是否已经在集合中存在,不存在则直接放入集合.如果hashcode相等,然后通过equal()方法判断要放入对象与集合中的任意对象是否相等:如果equal()判断不相等,直接将该元素放入集合中,否则不放入.

  有没有可能两个不相等的对象有相同的hashcode

  有可能,两个不相等的对象可能会有相同的hashcode值,这就是为什么在hashmap中会有冲突。如果两个对象相等,必须有相同的hashcode值,反之不成立.