美文网首页
Java面试之Java基础下册(含答案)

Java面试之Java基础下册(含答案)

作者: 嗯哼_9793 | 来源:发表于2020-02-17 14:07 被阅读0次

15. 动态代理与cglib实现的区别。

动态代理有两种实现方式,分别是:jdk动态代理和cglib动态代理

jdk动态代理的前提是目标类必须实现一个接口,代理对象跟目标类实现一个接口,从而避过虚拟机的校验。

cglib动态代理是继承并重写目标类,所以目标类和方法不能被声明成final。

 ==================================================================

16.  为什么cglib方式可以对接口实现代理。

 cglib动态代理是继承并重写目标类,所以目标类和方法不能被声明成final。而接口是可以被继承的。

 ==================================================================

17. final的用途。

1.final修饰的对象不能被修改;

2.final修饰的类不能被继承;

3.final修饰的方法不能被重写;

 ==================================================================

18  如何在父类中为子类自动完成所有的hashcode和equals实现?这么做有何优劣。

父类的equals不一定满足子类的equals需求。比如所有的对象都继承Object,默认使用的是Object的equals方法,在比较两个对象的时候,是看他们是否指向同一个地址。

但是我们的需求是对象的某个属性相同,就相等了,而默认的equals方法满足不了当前的需求,所以我们要重写equals方法。

如果重写了equals 方法就必须重写hashcode方法,否则就会降低map等集合的索引速度。

 ==================================================================

20.  请结合OO设计理念,谈谈访问修饰符public、private、protected、default在应用设计中的作用

OO设计理念:封装、继承、多态

封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。所以我们可以通过public、private、protected、default 来进行访问控制

关键字类内部本包子类外部包

public √√√√

protected√√√×

default √√××

private√×××

java访问控制符的含义和使用情况

 ==================================================================

21.  深拷贝和浅拷贝区别。

浅拷贝只拷贝指针,深拷贝就是拷贝他的值,重新生成的对像。

 ==================================================================

23. error和exception的区别,CheckedException,RuntimeException的区别。

Error(错误)表示系统级的错误和程序不必处理的异常,是java运行环境中的内部错误或者硬件问题。比如:内存资源不足等。对于这种错误,程序基本无能为力,除了退出运行外别无选择,它是由Java虚拟机抛出的。    Exception(违例)表示需要捕捉或者需要程序进行处理的异常,它处理的是因为程序设计的瑕疵而引起的问题或者在外的输入等引起的一般性问题,是程序必须处理的。Exception又分为运行时异常,受检查异常。       RuntimeException(运行时异常),表示无法让程序恢复的异常,导致的原因通常是因为执行了错误的操作,建议终止程序,因此,编译器不检查这些异常。       CheckedException(受检查异常),是表示程序可以处理的异常,也即表示程序可以修复(由程序自己接受异常并且做出处理), 所以称之为受检查异常。

 ==================================================================

24.  请列出5个运行时异常。

NullPointerException

IndexOutOfBoundsException

ClassCastException

ArrayStoreException

BufferOverflowException

 ==================================================================

25. 在自己的代码中,如果创建一个java.lang.String对象,这个对象是否可以被类加载器加载?为什么。

不可以,双亲委派模式会保证父类加载器先加载类,就是BootStrap(启动类)加载器加载jdk里面的java.lang.String类,而自定义的java.lang.String类永远不会被加载到

 ==================================================================

26. 说一说你对java.lang.Object对象中hashCode和equals方法的理解。在什么场景下需要重新实现这两个方法

父类的equals不一定满足子类的equals需求。比如所有的对象都继承Object,默认使用的是Object的equals方法,在比较两个对象的时候,是看他们是否指向同一个地址。

但是我们的需求是对象的某个属性相同,就相等了,而默认的equals方法满足不了当前的需求,所以我们要重写equals方法。

如果重写了equals 方法就必须重写hashcode方法,否则就会降低map等集合的索引速度。

 ==================================================================

27.  在jdk1.5中,引入了泛型,泛型的存在是用来解决什么问题。

泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。==================================================================

28. 有没可能 2个不相等的对象有同hashcode。

有可能,最简单的方法,百分百实现的方式就是重写hascode();

 ==================================================================

29.  Java中的HashSet内部是如何工作的。

public HashSet() {

    map = new HashMap<>();}

默认使用的是HaseMap;

 ==================================================================

30什么是序列化,怎么序列化,为什么序列化,反序列化会遇到什么问题,如何解决。

序列化是一种用来处理对象流的机制 ,所谓对象流就是将对象的内容进行流化。

序列化是为了解决在对对象流进行读写操作时所引发的问题。

序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

小编分类整理了许多java进阶学习材料和BAT面试题,需要资料的请转发此文章后再私聊小编回复【java】就能领取2019年java进阶学习资料和BAT面试题以及《Effective Java》(第3版)电子版书籍。也可以加群:712263501领取海量学习资料进行学习。

相关文章

网友评论

      本文标题:Java面试之Java基础下册(含答案)

      本文链接:https://www.haomeiwen.com/subject/zzubfhtx.html