《java编程语言 面经 思考题 整理》秋招 待更新


   问题的答案参考了很多博客归纳整理,以及个人的思考,如果有其他见解欢迎留言讨论。

面试题1、你认为接口和抽象类有什么区别?

  首先,从语法上讲,

  • 抽象类中除了抽象方法,还可以有方法的实现,而接口比抽象类更加抽象,只能有抽象方法。
  • 抽象类中的成员可以是private、默认、protected、public的,而接口中的成员全都是public的。
  • 抽象类中的成员可以是private、默认、protected、public的,而接口中的成员全都是public的,如果是常量的话是默认为public static final。接口中由于没有具体方法体,所以无法定义属性的set和get方法,所以它干脆把属性定义为常量,例如接口中interface geneElec{ int power = 220; void generate();} 其中power由于是在接口中,所以默认的修饰符是public static final。

  从java面向对象编程语言角度为什么要设计接口和抽象类两者?抽象类是对概念的归纳,接口是对功能的归纳,两者的侧重点不一样。任何的一个类当要扩展功能时,可以通过实现多个接口,而需要将现有的类的内容归为自己所有,则采用面向对象的四大基本特征之一,继承来实现(认现有的类作儿子)。 一个类可以实现多个接口,但只能继承一个父类。

面试题2、你认为为什么接口可以多实现,类只能单继承?

  从语法的角度上讲,
  Java接口是行为性的,是对功能的归纳,它只是定义了某个行为名称,具体的行为的实现是集成接口的类实现的。因此就算两个接口中定义了两个名称完全相同的方法,当某个类去集成这两个接口时,类中也只会有一个相应的方法,这个方法的具体实现是这个类来进行编写的,所以并不会出现结构混乱的情况。
  如果Java是可以多继承的,会存在多继承导致的的菱形继承问题。举个例子,在这里有个A类,我们又编写了两个类B类和C类,并且B类和C类分别继承了A类,并且对A类的同一个方法进行了覆盖。如果此时我们再次编写了一个D类,并且D类以多继承的方式同时集成了B类和C类,那么D类也会继承B类和C类从A类中重载的方法,那么问题来了,D类也开始犯迷糊了,我到底应该哪个继承哪个类中的方法呢,因为类是结构性的,这样就会造成结构上的混乱。C++语言可以实现多继承,但是会经常掉入多继承这个陷阱,虽然它也提出了相应的解决办法,但Java语言本着简单的原则舍弃了C++中的多继承,这样也会使程序更具安全性。

面试题3、你认为是什么原因导致了java语言的安全性问题(5月30日 华为 )

  1、java相比C++,提供了JVM来完成对象的销毁,内存的回收,由虚拟机来管理内存看起来不容易出现内存泄露和溢出问题,一切都很美好,但是正是因为java程序员把内存控制的权利交给了java虚拟机,如果不了解虚拟机是如何使用内存,一旦出现内存泄露和溢出问题,排查错误会非常困难。
  2、java在多线程并发中,即使java提供了JAVA内存模型,如果你不了解并发编程中的可见性、原子性、有序性,竞态条件下或者对共享对象的访问操作很容易导致线程安全性问题。导致线程安全性问题可能会出现死锁、活锁、饥饿等情况,你可以用锁、同步机制、或者使用线程封闭的技术、使用不可变对象来解决。

面试题4、java中方法的重载和覆盖有什么区别?

  方法的重载可提供一个多个同名方法,每个方法有不同的参数类型或者格式,java编译器能通过检查调用方法的参数类型和个数来决定具体调用哪个方法,这体现了面向对象的基本特征之一多态覆盖(方法的重写)是对父类的函数进行重新定义,在java中,子类可继承父类的方法,则不需要重新编写相同的方法。但有时子类并不想原封不动继承父类的方法,而是想做一定的修改,这就采用方法重写。方法覆盖时需要子类中的方法与父类的中的一方法具有相同的方法名、返回类型和参数表,如需要父类的原有方法,可以调用super关键字
  构造函数能被重载,但是不能被覆盖。????为什么

面试题5、为什么Vector相比ArrayList不常用

  Vector底层与ArrayList相同都是数组,Vector是线程安全的,大多数的程序都运行在单线程环境下,无需考虑线程安全问题,而单线程下ArrayList的性能要优于Vector。
  更重要的原因是,Vector的扩容是扩充100%,ArrayList是扩充50%,更加节省内存。例如长度是10的Vector和ArrayList,当插入第11个元素时,代码不会提示越界异常,Verctor扩充成20,ArrayList扩充为15。

面试题6、如果让你来实现一个ArrayList,需要考虑哪些要素?

  1. ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存。
  2. ArrayList实现了Serializable接口,因此它支持序列化,能够通过序列化传输,实现了RandomAccess接口,支持快速随机访问,实际上就是通过下标序号进行快速访问,实现了Cloneable接口,能被克隆。
  3. 每个ArrayList实例都有一个容量,该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向ArrayList中不断添加元素,其容量也自动增长。自动增长会带来数据向新数组的重新拷贝,因此,如果可预知数据量的多少,可在构造ArrayList时指定其容量。在添加大量元素前,应用程序也可以使用ensureCapacity操作来增加ArrayList实例的容量,这可以减少递增式再分配的数量。
    注意,此实现不是同步的。如果多个线程同时访问一个ArrayList实例,而其中至少一个线程从结构上修改了列表,那么它必须保持外部同步。
  4. ArrayList提供了三种方式的构造器,可以构造一个默认初始容量为10的空列表、构造一个指定初始容量的空列表以及构造一个包含指定collection的元素的列表,这些元素按照该collection的迭代器返回它们的顺序排列的。
  5. 要实现ArrayList中提供的方法,ArrayList提供了set(int index, E element)、add(E e)、add(int index, E element)、addAll(Collection<? extends E> c)、addAll(int index, Collection<? extends E> c)这些添加元素的方法。
  6. 每当向数组中添加元素时,都要去检查添加后元素的个数是否会超出当前数组的长度,如果超出,数组将会进行扩容,以满足添加数据的需求。数组扩容通过一个公开的方法ensureCapacity(int minCapacity)来实现。在实际添加大量元素前,我也可以使用ensureCapacity来手动增加ArrayList实例的容量,以减少递增式再分配的数量。
  7. 数组进行扩容时,会将老数组中的元素重新拷贝一份到新的数组中,每次数组容量的增长大约是其原容量的1.5倍。这种操作的代价是很高的,因此在实际使用时,我们应该尽量避免数组容量的扩张。当我们可预知要保存的元素的多少时,要在构造ArrayList实例时,就指定其容量,以避免数组扩容的发生。或者根据实际需求,通过调用ensureCapacity方法来手动增加ArrayList实例的容量。
  8. Fail-Fast机制ArrayList也采用了快速失败的机制,通过记录modCount参数来实现。在面对并发的修改时,迭代器很快就会完全失败,而不是冒着在将来某个不确定时间发生任意不确定行为的风险。

面试题7、你如何理解happens before原则?

  JMM就使用happens-before的概念来阐述多线程之间的内存可见性。在JMM中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-before关系。happens-before有8条原则。

  • 如果一个操作happens-before另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前
  • 两个操作之间存在happens-before关系,并不意味着一定要按照happens-before原则制定的顺序来执行。如果重排序之后的执行结果与按照happens-before关系来执行的结果一致,那么这种重排序并不非法

下面是happens-before原则规则:

  • 程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作
  • 锁定规则:一个unLock操作先行发生于后面对同一个锁额lock操作;
  • volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作
  • 传递规则:如果操作A先行发生于操作B,而操作B又先行发生于操作C,则可以得出操作A先行发生于操作C;
  • 线程启动规则:Thread对象的start()方法先行发生于此线程的每个一个动作
  • 线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生;
  • 线程终结规则:线程中所有的操作都先行发生于线程的终止检测,我们可以通过Thread.join()方法结束、Thread.isAlive()的返回值手段检测到线程已经终止执行;
  • 对象终结规则:一个对象的初始化完成先行发生于他的finalize()方法的开始

猜你喜欢

转载自blog.csdn.net/weixin_41262453/article/details/91823458