您的位置:首页 > 编程语言 > Java开发

【Java基础】易错面试题,初级程序员面试必看!(会不断更新)

2020-03-06 10:55 519 查看

写在前面: 我是 扬帆向海,这个昵称来源于我的名字以及女朋友的名字。我热爱技术、热爱开源、热爱编程。

技术是开源的、知识是共享的


这博客是对自己学习的一点点总结及记录,如果您对 Java、算法 感兴趣,可以关注我的动态,我们一起学习。

用知识改变命运,让我们的家人过上更好的生活

相关文章:

20道你必须要背会的微服务面试题

文章目录

1、& 和 && 的区别

&
:按位与,不管左边是true或false,右边都进行运算,不会短路;

&&
:逻辑与,如果左边为true,右边参与运算,如果左边为false,那么右边不参与运算,具有短路的功能 。

2、重载和重写的区别

重载
:同一个类中的方法名相同而参数列表不同,与方法的修饰符、返回值类型没有关系

重写
:需要遵循“两同两小一大”的原则。

  • 两同:子类重写的方法 必须 和父类被重写的方法 方法名相同、参数列表相同

  • 两小:子类的返回值类型小于等于父类的返回值类型,子类抛出的异常小于等于父类抛出的异常。

  • 一大:子类重写的方法使用的访问权限大于父类被重写的方法的访问权限。

注意:子类不能重写父类中声明为 private 权限的方法

3、== 和 equals 的区别

==
既可以比较基本类型也可以比较引用类型。对于基本类型比较的是值,对于引用类型比较的是内存地址。

equals
,它是属于 java.lang.Object 类里面的方法,如果该方法没有被重写过默认也是==;通常情况下,重写 equals 方法,会比较类中的相应属性是否都相等。

更详细的解释请参考下面的博文:

深入理解 equals() 方法以及与 == 的区别

4、final、finally、finalize 的区别

  • final
    :用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,被其修饰的类不可继承。
  • finally
    :异常处理语句结构的一部分,表示总是执行。
  • finalize
    :Object 类的一个方法,在垃圾回收器执行的时候会调用被回收对象的此方法,可以覆盖此方法

5、接口和抽象类

相同点

  • 接口和抽象类都不能被实例化,它们都位于继承树的顶端,用于被其他类实现和继承
  • 可以将抽象类和接口类型作为引用类型
  • 接口和抽象类都包含抽象方法
  • 一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类

不同点

  • 一个类可以实现多个接,一个类只能继承一个抽象类;
  • .接口中不能定义构造器,抽象类中可以定义构造器;抽象类的构造器不是用来创建对象,而是让其子类调用完成抽象类的初始化操作;
  • 接口中的方法全部都是抽象方法,抽象类中可以有抽象方法和具体方法;
  • 接口中的成员全都是public 的,抽象类中的成员可以是 private、默认、protected、public;
  • 接口中定义的成员变量实际上都是常量,抽象类中可以定义成员变量;
  • 接口中不能有静态方法,抽象类中可以包含静态方法;(注意:JDK1.8之后接口中可以有静态方法)

6、error 和exception 的区别

相同点

Error
类和
Exception
类的父类都是Throwable 类

不同点

Error
类一般是指Java 虚拟机无法解决的严重问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等。
Exception
类表示其它因编程错误或偶然的外在因素导致的一般性问题,程序可以处理的异常,可以捕获且可能恢复。

关于异常的问题请参考下面的博文:

Java里面的异常

7、throw 和 throws 的区别

throw

  • throw 语句用在方法体内,表示抛出异常,由方法体内的语句处理。
  • throw 是具体向外抛出异常的动作,所以它抛出的是一个异常实例,执行throw 一定是抛出了某种异常。

throws

  • throws 语句是用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理。
  • throws 主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道需要捕获的异常的类型。
  • throws 表示出现异常的一种可能性,并不一定会发生这种异常。

8、String 、StringBuilder 、StringBuffer 的区别

  • String
    由final修饰,是不可变字符序列
  • StringBuffer
    可变字符序列,其效率低,但是线程安全
  • StringBuilder
    可变字符序列,其效率高,但是线程不安全

更详细的解释请参考下面的博文:

聊聊 StringBuffer 与 StringBuilder

9、ArrayList 和Linkedlist 区别

二者都线程不安全,但是效率比 Vector 的高

  • ArrayList
    底层是以 数组 的形式保存数据,随机访问集合中的元素比LinkedList 快(原因是 LinkedList 要移动指针);
  • LinkedList
    内部以 链表 的形式保存集合里面数据,它随机访问集合中的元素性能比较慢,但是新增和删除时速度比 ArrayList 快(原因是 ArrayList 要移动数据)。

更详细的解释请参考下面的博文:

聊聊 ArrayList 与 LinkedList

10、Comparable 和 Comparator 的区别

Comparable
Comparator
都是用来实现集合中元素的比较、排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法。

更详细的解释请参考下面的博文:

比较器(Comparable和Comparator)

11、equals 和 hashcode 的区别

  • 如果两个对象
    equals
    相等,Java运行时环境会认为他们的
    hashcode
    一定相等。
  • 如果两个对象
    equals
    不相等,他们的
    hashcode
    有可能相等。
  • 如果两个对象
    hashcode
    相等,他们的
    equals
    不一定相等。
  • 如果两个对象
    hashcode
    不相等,他们的
    equals
    不一定相等。

由于水平有限,本博客难免有不足,恳请各位大佬不吝赐教!

  • 点赞 65
  • 收藏
  • 分享
  • 文章举报
扬帆向海 发布了92 篇原创文章 · 获赞 2679 · 访问量 40万+ 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: