小呆呆的生活

  • 首页
  • 分类
    • Linux
    • MySQL
    • SpringBoot
    • SpringCloud
  • 工具
  • 留言
  • 登录
  • 注册
  • 友情链接
    • 咸鱼的窝
    • DIY熙的家
    • Farmer的自习室
    • Dark的小黑屋
  • 关于
人的一生注定会遇到两个人
一个惊艳了时光,一个温柔了岁月
  1. 首页
  2. Java基础
  3. 正文

Java面试高频(三)

2021年 6月 3日 1003次阅读 0人点赞 0条评论

1.switch 语句能否作用在 byte 上,能否作用在 long 上,能否作用在 String 上?

在switch(expr1)中,expr1只能是一个整数表达式或者枚举常量(更大字体),整数表达式可以是int基本类型或Integer包装类型,由于,byte,short,char都可以隐含转换为int,所以,这些类型以及这些类型的包装类型也是可以的。显然,long、double、boolean以及他们的包装类和String类型都不符合switch的语法规定,并且不能被隐式转换成int类型,所以,它们不能作用于swtich语句中。但是在JDK7的新特性中,switch语句可以用String。

2.final、finally、finalize 的区别

final:final是一个修饰符,可以修饰类,方法和变量。final修饰类表示类不能被其它类继承,并且该类中的所有方法都会隐式的被final修饰。final修饰方法,则该方法不能被重写,若父类中final方法的访问权限为private,将导致子类中不能直接继承该方法,因此,此时可以在子类中定义相同方法名的函数,此时不会与重写final的矛盾,而是在子类中重新地定义了新方法。当final修饰一个基本数据类型时,表示该基本数据类型的值一旦在初始化后便不能发生变化;如果final修饰一个引用类型时,则在对其初始化之后便不能再让其指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。本质上是一回事,因为引用的值是一个地址,final要求值,即地址的值不发生变化。

finally:finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定会被执行(不管有没有抛出异常),经常被用在需要释放资源的情况下。但须注意,在某些特殊情况下,finally块是不会执行的。

finalize:finalize()是Object中定义的一个方法,也就是每个对象都有这个方法。当垃圾回收器确定不存在对该对象的更多引用时(是个垃圾),由对象的垃圾回收器调用此方法。子类重写 finalize 方法,以配置系统资源或执行其他清除,例如:一个socket链接,在对象初始化时创建,整个生命周期内有效,那么就需要实现finalize,关闭这个链接。

3.== 和 equals 的区别?

1.==是操作符,equals是方法。

2.==对于基本类型(如short、int、long、float、double)和引用类型是不一样的,基本类型:比较的是值是否相同,引用类型:比较的是引用是否相同,即比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象,比较的是真正意义上的指针操作。

3.equals 本质上就是 ==,equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。只不过 String 和 Integer 等重写了 equals 方法,把它变成了值比较。

equals方法没有被重写的情况下:

  public boolean equals(Object obj) {
      return (this == obj);
  }

equals方法被重写的情况下:(String为例)

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

4.两个对象的 hashCode() 相同,则 equals() 也一定为 true 吗?

  • 两个对象equals相等,则它们的hashCode()必须相等,反之则不一定。
  • 两个对象==相等,则其hashCode()一定相等,反之不一定成立。

5.为什么重写 equals() 就一定要重写 hashCode() 方法?

1.当我们将equals方法重写后有必要将hashCode方法也重写,这样做才能保证不违背hashCode方法中“相同对象必须有相同哈希值”的约定。

2.由hashCode方法的源码注释得知:

  • hashCode方法本质就是一个哈希函数,将对象的地址值映射为integer类型的哈希值。
  • 一个对象多次调用它的hashCode方法,应当返回相同的integer(哈希值)。
  • 两个对象如果通过equals方法判定为相等,那么就应当返回相同integer。
  • 两个地址值不相等的对象调用hashCode方法不要求返回不相等的integer,但是要求拥有两个不相等integer的对象必须是不同对象。

3.所以equals方法与hashCode方法根本就是配套使用的。对于任何一个对象,不论是使用继承自Object的equals方法还是重写equals方法。hashCode方法实际上必须要完成的一件事情就是,为该equals方法认定为相同的对象返回相同的哈希值。Object类中的equals方法区分两个对象的做法是比较地址值,即使用“==”。而我们如若根据业务需求改写了equals方法的实现,那么也应当同时改写hashCode方法的实现。否则hashCode方法依然返回的是依据Object类中的依据地址值得到的integer哈希值。

6.& 和 && 的区别?

&&和&都可以表示逻辑与,但他们是有区别的,共同点是他们两边的条件都成立的时候最终结果才是true;

不同点是&&只要是第一个条件不成立为false,就不会再去判断第二个条件,最终结果直接为false,而&判断的是所有的条件;

7.Java 中的参数传递时传值呢?还是传引用?

值传递:是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

引用传递:是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

Java中的传递只有值传递而没有引用传递,只不过传递为基本数据类型的话,是复制的数值,而对象类型的话,则是复制的对象存放地址。

8.Java 中的 Math.round(-1.5) 等于多少?

Math.round() 方法返回一个最接近的 int、long 型值,四舍五入。

round 表示"四舍五入",算法为Math.floor(x+0.5) ,即将原来的数字加上 0.5 后再向下取整,所以 Math.round(11.5) 的结果为 12,Math.round(-11.5) 的结果为 -11。

public class Test {
    public static void main(String []args) {
       System.out.println( Math.round(-1.5));
    }
}

结果为:-1

参考文档

  • Java round() 方法 | 菜鸟教程 (runoob.com)
  • final、finally与finalize的区别?
  • equals和==的区别小结 - 简书 (jianshu.com)
  • Java中常用的equals方法源码解析
本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: Java 面试
最后更新:2023年 11月 23日

小呆呆

知足常乐,就会拥有幸福

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

小呆呆

知足常乐,就会拥有幸福

最新 热点 随机
最新 热点 随机
本站暂时停止更新,后续文章将在CSDN更新 数据库索引简析 Java多线程的使用场景以及线程的创建方式 Spring事务的使用示例和传播行为以及失效场景 Spring Boot使用JUnit和Mockito进行Service层单元测试 Spring Cloud Zuul和Gateway的简单示例(搭建方式)
Spring Boot整合MyBatis Centos7的MySQL初次使用教程 MySQL练习(二) 初识消息队列 SpringCloud五大核心组件 修复bug翻车记录
标签聚合
MySQL SpringCloud 后端 面试 Spring Java 干货 SpringBoot
最近评论
我是可是尼古拉斯·爱新觉·罗·G·钰豪啊 发布于 4 年前(04月08日) 我来注水了胜哥 :hehe:
鸟人金 发布于 4 年前(03月03日) v
鸟人金 发布于 4 年前(03月03日) 胜哥yyds
鸟人金 发布于 4 年前(03月03日) 我滴偶像!!!!!!!!!!!!!!!
水军2号 发布于 4 年前(03月03日) 胜哥tql
归档
  • 2024 年 4 月
  • 2024 年 2 月
  • 2024 年 1 月
  • 2023 年 12 月
  • 2023 年 11 月
  • 2023 年 10 月
  • 2023 年 8 月
  • 2023 年 6 月
  • 2022 年 11 月
  • 2022 年 8 月
  • 2022 年 6 月
  • 2022 年 4 月
  • 2022 年 3 月
  • 2022 年 1 月
  • 2021 年 12 月
  • 2021 年 9 月
  • 2021 年 8 月
  • 2021 年 6 月
  • 2021 年 4 月
  • 2020 年 10 月
  • 2020 年 9 月
  • 2020 年 8 月
  • 2020 年 7 月
  • 2020 年 6 月
  • 2020 年 5 月
  • 2020 年 4 月
  • 2020 年 3 月

COPYRIGHT © 2023 小呆呆的生活. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备2020104583号

粤公网安备44011802000463号