前言

马上国庆了,本来想着给自己放松一下,刷刷博客,慕然回首,自动拆装箱?equals?==?HashCode? instanceof? 似乎有点模糊了,那就大概看一下5道Java基础面试题吧。好记性不如烂键盘~

*** 12万字的java面试题整理 ***

instanceof 关键字的作用

instanceof 严格来说是Java中的一个双目运算符,用来测试一个对象是否为一个类的实例,用法为:

if (object instanceof Json) {
Json json = (Json)object;
}

其中 object 为一个对象,Json表示一个类或者一个接口,当 object 为 Json的对象,或者是其直接

或间接子类,或者是其接口的实现类,结果result 都返回 true,否则返回false。

注意:编译器会检查 object 是否能转换成右边的Json类型,如果不能转换则直接报错,如果不能确定类型,则通过编译,具体看运行时定。

nt i = 0;
System.out.println(i instanceof Integer);//编译不通过 i必须是引用类型,不能是基本类型
System.out.println(i instanceof Object);//编译不通过
Integer integer = new Integer(1);
System.out.println(integer instanceof Integer);//true
System.out.println(null instanceof Object);//false ,在 JavaSE规范 中对 instanceof 运算符的规定就是:如果 obj 为 null,那么将返回 false。

Java自动装箱与拆箱

装箱就是自动将基本数据类型转换为包装器类型(int-->Integer);调用方法:Integer的

valueOf(int) 方法


拆箱就是自动将包装器类型转换为基本数据类型(Integer-->int)。调用方法:Integer的

intValue方


为什么会需要这功能呢?

在Java SE5之前,如果要生成一个数值为100的Integer对象,必须这样进行:

Integer i = new Integer(100);

而在从Java SE5开始就提供了自动装箱的特性,如果要生成一个数值为100的Integer对象,只需要这样就可以了:

Integer i = 100

面试题1:以下代码会输出什么?

public class Main {
public static void main(String[] args) {
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1==i2);
System.out.println(i3==i4);
}
}
true
false

为什么会出现这样的结果?时只需一看源码便知究竟

public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[]; static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h; cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++); // range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
} private IntegerCache() {}
}

从这2段代码可以看出问题了吗?第一段代码,if判断,true拿缓存,false就new一个,是不是很熟悉

面试题2:以下代码输出什么

public class Main {
public static void main(String[] args) {
Double i1 = 100.0;
Double i2 = 100.0;
Double i3 = 200.0;
Double i4 = 200.0;
System.out.println(i1==i2); // false
System.out.println(i3==i4); // false
}
}

在某个范围内的整型数值的个数是有限的,而浮点数却没有,本身没做这数值的缓存

equals与==的区别

首先,先看定义

  • == 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作
public static void main(String[] args) {
System.out.println(10L == 10); // true
}

当你使用 == 操作符比较这两个值时,Java会自动进行类型提升,将较小的数据类型(这里是 int)转换为较大的数据类型(这里是 long),以便进行比较。

  • equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话(String就是很好的例子),调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断,
public class Object {
public boolean equals(Object obj) {
return (this == obj);
}
}
public class 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;
}
}

Hashcode的作用

在Java中,集合框架主要分为两大类:List 和 Set。List 是有序且允许重复元素的集合,而 Set 则是无序且不允许重复元素的集合。

当我们向 Set 中插入元素时,需要确保该元素之前没有被添加过。这通常通过调用元素的 equals 方法来实现。然而,当集合中的元素数量非常大时,直接使用 equals 方法进行逐个比较会变得效率低下

为了解决这个问题,引入了哈希算法。哈希算法能够提高查找、插入和删除操作的效率。每个对象都有一个 hashCode 方法,该方法返回一个整数值,这个值被称为哈希码。哈希码用于确定对象应该存储在集合内部的哪个位置(也称为桶或槽)。具体来说,哈希码可以用来快速定位到可能包含该对象的存储区域

在实际操作中,当尝试向 Set 添加新元素时,首先计算该元素的哈希码,并根据哈希码找到对应的存储区域。如果该区域为空,则可以直接将新元素存入;如果该区域已包含其他元素,那么就需要进一步调用 equals 方法来确认这些元素是否与新元素相同。只有当 equals 方法返回 false 时,才会将新元素存入集合中(这里面就涉及到另一个面试题,hashcode相等的对象是否相等)。

通过这种方式,哈希码减少了直接使用 equals 方法进行比较的次数,从而大大提高了性能。理想情况下,即使集合中有很多元素,查找特定元素的操作也可以接近常数时间复杂度 O(1)。

需要注意的是,为了保证哈希表的高效运行,hashCode 方法的实现必须满足以下条件:

  • 相等的对象必须具有相等的哈希码(即如果 x.equals(y) 返回 true,那么 x.hashCode() 必须等于 y.hashCode())。(hashcode相等的对象是否相等)
  • 不相等的对象最好拥有不同的哈希码,以减少碰撞(不同对象具有相同的哈希码的情况),尽管这是不可能完全避免的。

因此,正确地重写 equals 和 hashCode 方法对于自定义类型的对象是非常重要的,这样可以确保它们能够在基于哈希的集合中正确工作。

重载和重写的区别

  1. 重载(Overloading)

    • 定义:在同一个类中,允许存在多个方法名相同但参数列表不同的方法。
    • 目的:提供一种方式来执行相似功能的方法,但是针对不同类型的输入或数量的参数。
public class Calculator {
public int add(int a, int b) { return a + b; }
public double add(double a, double b) { return a + b; } // 重载
}
  1. 重写(Overriding)

    • 定义:子类重新定义从父类继承下来的方法,以实现特定的行为。
    • 目的:当子类认为父类的方法不能满足需求时,可以覆盖该方法以实现新的行为,子类方法的访问级别不能比父类更严格(例如,如果父类方法是 public,那么子类方法也必须是 public),如果父类方法被声明为 final 或 private,则子类无法重写这些方法,使用 @Override 注解可以帮助编译器检查是否正确实现了重写
class Animal {
public void sound() {
System.out.println("Some generic animal sound");
}
} class Dog extends Animal {
@Override
public void sound() { // 重写
System.out.println("Bark");
}
}

今日一学,5道Java基础面试题(附Java面试题及答案整理)的更多相关文章

  1. 【Java基础】11、java方法中只有值传递,没有引用传递

    public class Example { String testString = new String("good"); char[] testCharArray = {'a' ...

  2. 【Java基础】4、java中的内部类

    内部类的分类:常规内部类.静态内部类.私有内部类.局部内部类.匿名内部类. 实例1:常规内部类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2 ...

  3. java基础阶段几个必会面试题

    摘自:https://www.cnblogs.com/zn19961006/p/11869182.html java基础阶段几个必会面试题 目录 1.说出你对面向对象的理解 在我理解,面向对象是向现实 ...

  4. Java基础系列1:Java基本类型与封装类型

    Java基础系列1:Java基本类型与封装类型 当初学习计算机的时候,教科书中对程序的定义是:程序=数据结构+算法,Java基础系列第一篇就聊聊Java中的数据类型. 本篇聊Java数据类型主要包括两 ...

  5. java基础学习03(java基础程序设计)

    java基础程序设计 一.完成的目标 1. 掌握java中的数据类型划分 2. 8种基本数据类型的使用及数据类型转换 3. 位运算.运算符.表达式 4. 判断.循环语句的使用 5. break和con ...

  6. java基础3.0:Java常用API

    本篇介绍Java基础中常用API使用,当然只是简单介绍,围绕重要知识点引入,巩固开发知识,深入了解每个API的使用,查看JavaAPI文档是必不可少的. 一.java.lang包下的API Java常 ...

  7. java基础知识回顾之---java String final类普通方法

    辞职了,最近一段时间在找工作,把在大二的时候学习java基础知识回顾下,拿出来跟大家分享,如果有问题,欢迎大家的指正. /*     * 按照面向对象的思想对字符串进行功能分类.     *      ...

  8. java基础学习总结一(java语言发展历史、jdk的下载安装以及配置环境变量)

    最近一段时间计划复习一下java基础知识,使用的视频课程是尚学堂高淇老师的,上课过程中的心得体会直接总结一下,方便以后复习. 一:计算机语言的发展 1:机器语言,最原始的语言,主要有“01”构成,最早 ...

  9. JAVA基础第一章-初识java

    业内经常说的一句话是不要重复造轮子,但是有时候,只有自己造一个轮子了,才会深刻明白什么样的轮子适合山路,什么样的轮子适合平地! 从今天开始,我将会持续更新java基础知识,欢迎关注. java的诞生 ...

  10. Java基础笔记(1) 语言 JAVA的历史 Java的搭建环境

    本文除了搭建是重点,其他的都当阅读小说一样去看就好了,不想看可以直接抓住重点,我会改变颜色勾出重点! 英语是人与人交流沟通的重要方式之一.JAVA:是人与计算机沟通交流重要方式之一.我们除了用java ...

随机推荐

  1. localAI: 编译步骤说明

    懒人通道 官网提供了懒人包,使用的时候不需要关注整个打包流程,,下面是官方的cuda示例,当然官方提供可选项很多,Available: cublas, openblas, clblas, metal, ...

  2. 【CMake系列】07-export与find

    为了将我们的库文件更方便地提供给他人使用,cmake 提供了一种方式,通过查找 .cmake 文件,将库导入项目中. 本节学习的内容,就是将我们的库导出一个 xxx.cmake 文件,以及 在项目中导 ...

  3. Linux内核及补丁编译

    Linux内核及补丁编译 一.源码下载 1.查看当前linux内核版本 uname -r 2.获取对应版本的linux源码 方式1:源方式下载 sudo apt search linux-source ...

  4. RabbitMQ接口封装

    1.引用 <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client< ...

  5. Visual Studio Code 配置文件关联

    在编写 Linux 的 .service 文件的时候,我发现 .service 文件的本质是 INI 文件.然而 VS Code 却并没有使用 INI 格式进行语法高亮.于是我通过如下设置使 VS C ...

  6. 【FFmpeg】之Mac系统爬取所有M3U8视频下载方法

    前言 由于有的网站不允许下载视频,到了有效期就不能看了,但是我想以后反复看,怎么办呢? 前提准备 操作系统:Mac 浏览器:谷歌浏览器 抓取m3u8工具:猫爪 视频处理工具:ffmpeg 需要安装工具 ...

  7. Windows平台体验StableSwarmUI-0.6.4-Beta经验版

    目录 StableSwarmUI install 经验版 StableSwarmUI 配置后端 StableSwarmUI 快捷安装脚本 StableSwarmUI 安装与启动 sd_xl_base_ ...

  8. 关于安装李沐深度学习d2l包报错的解决办法(保姆教程)

    目录 目录:d2l包安装失败的解决过程 前言 一.李沐提供的安装方式 1. 创建一个新的环境 2. 激活 d2l 环境 3. 安装深度学习框架和d2l软件包 3.1 安装PyTorch的CPU或GPU ...

  9. 丝滑解决Chatgpt频繁奔溃、断网掉线问题

    事件缘由 这段时间使用Chatgpt的时候频繁出现something wrong等断网掉线问题,中间还频繁出现物品转向的人机验证(我那么具有迷惑性吗...),被烦的不行.后面了解到有一个KeepCha ...

  10. sql日期创建

    TRUNCATE TABLE SYS_DATEINFO declare @i int set @i=-30000 WHILE @i<1000000 BEGIN INSERT INTO SYS_D ...