【备战面试】每日10道面试题打卡-Day2

news2024/11/15 13:56:24

本篇总结的是Java基础知识相关的面试题,后续也会更新其他相关内容

文章目录

  • 1、== 和 equals 的区别是什么?
  • 2、你重写过 hashcode 和 equals 吗,为什么重写equals时必须重写hashCode方法?
  • 3、为什么Java中只有值传递?
  • 4、BIO、NIO、AIO 有什么区别?
  • 5、什么是反射机制?反射机制的应用场景有哪些?
  • 6、String有哪些特性?
  • 7、String和StringBuffer、StringBuilder的区别是什么?String 为什么是不可变的?
  • 8、集合和数组的区别是什么?
  • 9、List,Set,Map三者的区别?
  • 10、在使用 HashMap 的时候,用 String 做 key 有什么好处?


1、== 和 equals 的区别是什么?

答:

  • ==:它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。(基本数据类型比较的是值,引用数据类型比较的是内存地址)
  • equals:它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
    • 情况1:类没有覆盖equals() 方法。则通过 equals() 比较该类的两个对象时, 等价于通过“==”比较这两个对象
    • 情况2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来比较两个对象的内容是否相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。

String中的equals方法是被重写过的,因为object的equals方法是比较的对象的内存地址,而String的equals方法比较的是对象的值。
创建String类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个String对象。

2、你重写过 hashcode 和 equals 吗,为什么重写equals时必须重写hashCode方法?

答:如果我们只重写了equals方法没有重写hashcode方法的时候,就可能会导致两个对象通过equals方法比较之后判断相等,而两个对象的hashcode不同,因为它们的引用地址是不同的。

但是这时候就违背了hashcode 的规则:两个对象相等其 hash 值一定要相等,这样就会导致我们在使用hashcode计算存储地址的时候,两个相同的对象却存储在不同的位置,这显然是不合理的。所以我们在重写equals时,必须要重写hashCode方法。

如下:

public class Main {
    public static void main(String[] args) {
        // 对象 1
        Persion p1 = new Persion();
        p1.setName("Java");
        p1.setAge(18);
		// 对象 2
        Persion p2 = new Persion();
        p2.setName("Java");
        p2.setAge(18);
		// 创建 Set 对象
        Set<Persion> set = new HashSet<Persion>();
        set.add(p1);
        set.add(p2);
		// 打印 Set 中的所有数据
        set.forEach(p -> {
            System.out.println(p);
        });
    }
}


class Persion {
    private String name;
    private int age;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true; // 引用相等返回 true
        // 如果等于 null,或者对象类型不同返回 false
        if (o == null || getClass() != o.getClass()) return false;
        // 强转为自定义 Persion 类型
        Persion persion = (Persion) o;
        // 如果 age 和 name 都相等,就返回 true
        return age == persion.age &&
                Objects.equals(name, persion.name);
    }

    @Override
    public int hashCode() {
        // 对比 name 和 age 是否相等
        return Objects.hash(name, age);
    }
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    
    @Override
    public String toString() {
        return "Persion{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

如果你还不理解可以看这篇:文章

3、为什么Java中只有值传递?

答:当方法参数是基本数据类型时,我们进行参数传递的时候就是将这个基本数据类型复制一份然后作为参数传递。当方法参数是引用类型时,我们进行参数传递的时候就是将这个引用复制一份然后作为参数传递。

4、BIO、NIO、AIO 有什么区别?

答:

  • BIOBlock IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
  • NIONon IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过
    Channel(通道)通讯,实现了多路复用。
  • AIOAsynchronous IONIO 的升级,也叫 NIO2,实现了异步非堵塞 IO
    ,异步 IO 的操作基于事件和回调机制。

5、什么是反射机制?反射机制的应用场景有哪些?

答:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

  • 静态编译:在编译时确定类型,绑定对象
  • 动态编译:在运行时确定类型,绑定对象

反射机制优缺点:

优点: 运行期类型的判断,动态加载类,提高代码灵活度
缺点性能瓶颈,反射相当于一系列解释操作,通知 JVM 要做的事情,性能比直接的java代码要慢很多。

反射机制的应用场景:

  • ①我们在使用JDBC连接数据库时使用Class.forName()通过反射加载数据库的驱动程序;
  • ②Spring框架也用到很多反射机制, 经典的就是xml的配置模式。Spring 通过 XML 配置模式装载 Bean
    的过程:
    • 将程序内所有 XML 或 Properties 配置文件加载入内存中
    • Java类里面解析xml或properties里面的内容,得到对应实体类的字节码字符串以及相关的属性信息;
    • 使用反射机制,根据这个字符串获得某个类的Class实例;
    • 动态配置实例的属性;

6、String有哪些特性?

答:

  • 不变性:String 是只读字符串,是一个典型的 immutable 对象,**对它进行任何操作,其实都是创
    建一个新的对象,再把引用指向该对象。**不变模式的主要作用在于当一个对象需要被多线程共享并
    频繁访问时,可以保证数据的一致性。
  • 常量池优化String 对象创建之后,会在字符串常量池中进行缓存,如果下次创建同样的对象时,
    会直接返回缓存的引用。
  • final:使用 final 来定义 String 类,表示 String 类不能被继承,提高了系统的安全性。

7、String和StringBuffer、StringBuilder的区别是什么?String 为什么是不可变的?

答:我们分别从可变性、线程安全性和性能三个方面来讲:

可变性:

  • String类中使用字符数组保存字符串private final char value[],但是使用了final关键字来修饰,所以 string对象是不可变的
  • StringBuilder类时继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串char[] value,StringBuilder对象都是可变的。
  • StringBuffer类时继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串char[] value,StringBuffer对象都是可变的。

线程安全性:

  • String中的对象是不可变的,也就可以理解为常量线程安全
  • StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。
  • StringBuilder没有对方法进行加同步锁,所以是非线程安全的。

性能:

  • String类型:每次对String 类型进行改变的时候,都会生成一个新的String对象,然后将指针指向新的String 对象。
  • StringBuffer类型:每次都会对StringBuffer对象本身进行操作,而不是生成新的对象并改变对象引用,所以性能强于String类型。
  • StringBuilder:StringBuilder类型与StringBuffer类型相似,但是由于StringBuilder没有对方法加锁,所以性能强于StringBuffer。

使用场景选择:

  • String :要操作少量的数据可以选择String;
  • StringBuilder单线程操作字符串缓冲区下操作大量数据
  • StringBuffer多线程操作字符串缓冲区下操作大量数据

8、集合和数组的区别是什么?

答:

  • 数组是固定长度的;集合可变长度的。
  • 数组可以存储基本数据类型,也可以存储引用数据类型;集合只能存储引用数据类型
  • 数组存储的元素必须是同一个数据类型;集合存储的对象可以是不同数据类型。

9、List,Set,Map三者的区别?

答:Java 容器分为 Collection 和 Map 两大类,Collection集合的子接口有Set、 List、Queue三种子接口。
我们比较常用的是Set、List,Map接口不是 collection的子接口

如下图:
在这里插入图片描述
图片来源:Java集合中List,Set以及Map等集合体系详解(史上最全)

Collection集合主要有List和Set两大接口:

  • List:一个有序(元素存入集合的顺序和取出的顺序一致)容器,元素可以重复可以插入多个
    null元素
    ,元素都有索引。
  • Set:一个无序(存入和取出顺序有可能不一致)容器,不可以存储重复元素只允许存入一个
    null元素
    ,必须保证元素唯一性。
  • Map是一个键值对集合,存储键、值和之间的映射。 Key无序,唯一value 不要求有序,允许重复。Map没有继承于Collection接口,从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象。

List接口常用的实现类有 ArrayListLinkedListVector
Set接口常用的实现类有 HashSetLinkedHashSet 以及TreeSet
Map接口常用的实现类:HashMapTreeMapHashTableLinkedHashMapConcurrentHashMap

10、在使用 HashMap 的时候,用 String 做 key 有什么好处?

答:HashMap 内部实现是通过 key 的 hashcode 来确定 value 的存储位置,因为字符串是不可变的,所以
当创建字符串时,它的 hashcode 被缓存下来,不需要再次计算它的hashcode,所以相比于其他对象更快。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/382602.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL SERVER中SCHEMA的詳解

SQL SERVER中SCHEMA的講解1. Introduction1.1 優勢1.2 內置schema2. Create Schema2.1 Parameters2.2 Sql3.Awakening1. Introduction 1.1 優勢 数据库模式为我们提供了在数据库中创建逻辑对象组的灵活性。如果多个团队使用同一个数据库&#xff0c;我们可以设计各种模式来分組…

基于Ubuntu的Brainframe视觉AI分析平台搭建的详细步骤

目录 引言&#xff1a; 过程&#xff1a; 下载Brainframe安装包&#xff1a; 搭建Brainframe命令接口&#xff1a; 解决下载Docker速度慢的方法&#xff1a; 安装Docker : Unable to find image hello-world:latest locally 问题的解决&#xff1a; Step1&#xff1a;进…

Vue3创建项目(四)axios封装及接口配置

项目结构: 目录 &#x1f349;&#x1f349;&#x1f349;index.ts &#x1f349;&#x1f349;&#x1f349; api.ts 看完需要预计花费10分钟。 请求拦截器与响应拦截器 阅读下面代码需先了解以下内容&#xff1a; 请求拦截器&#xff1a; 请求拦截器的作用是在请求发送前进…

Windows搭建机器学习环境

一、环境介绍Anaconda&#xff1a;Anaconda offers the easiest way to perform Python/R data science and machine learning on a single machine. Start working with thousands of open-source packages and libraries today.Anaconda包括Conda、Python以及一大堆安装好的工…

Qt信号与槽机制——新手友好

目录 一 为什么会有这个机制 二 信号与槽是什么 三 信号 四 槽 五 使用 1 最简单的 2 函数指针 3 用Lambda表达式实现 一 为什么会有这个机制 我们平时的一个网页&#xff0c;如果点击网页上不同的部分会有不同的相应动作。比如点击超链接就会实现网页的跳转&#xff0c…

Code Virtualizer 3.1.4 Crack

Code Virtualizer 是一个强大的 Windows 应用程序代码混淆系统&#xff0c;它可以帮助开发人员保护他们的敏感代码区域免受逆向工程的影响&#xff0c;基于代码虚拟化的非常强大的混淆代码。 Code Virtualizer 会将您的原始代码&#xff08;Intel x86/x64 指令&#xff09;转换…

剑指 Offer day3, day4

剑指 Offer day3, day4 字符串和数组的操作。 剑指 Offer 05. 替换空格 剑指 Offer 05. 替换空格 - 力扣&#xff08;Leetcode&#xff09; 方法二&#xff1a;原地修改 在 C 语言中&#xff0c; string 被设计成「可变」的类型&#xff08;参考资料&#xff09;&#xff…

python海龟绘图

一、基础 &#xff08;一&#xff09;介绍 海龟绘图&#xff08;Turtle Graphics&#xff09;&#xff1a;“小海龟”turtle是Python语言中一个很流行的绘制图像的函数库&#xff0c;想象一个小乌龟&#xff0c;在一个横轴为x、纵轴为y的坐标系原点&#xff0c;(0,0)位置开始…

Git分支的合并策略有哪些?Merge和Rebase有什么区别?关于Merge和Rebase的使用建议

Git分支的合并策略有哪些&#xff1f;Merge和Rebase有什么区别&#xff1f;关于Merge和Rebase的使用建议1. 关于Git的一些基本原理1.1 Git的工作流程原理2. Git的分支合并方式浅析2.1 分支是什么2.2 分支的合并策略2.2.1 Three-way-merge&#xff08;三向合并原理&#xff09;2…

前端已死?我看未必,但「低代码」已剑指前端程序员

本文笔者会从以下几个方面分享&#xff0c;希望能够帮助正在迷茫的前端小伙伴提供一点思路&#xff01; 逛技术博客 不局限框架 全栈工程师兴起 关注前沿 写技术文章 录制前端视频 总结 2023第一季度快过去了&#xff0c;没工作的找到工作了吗&#xff1f;有工作的加薪了…

Hbase的基本概念与架构

一、Hbase的概念 HBase是Hadoop的生态系统&#xff0c;是建立在Hadoop文件系统&#xff08;HDFS&#xff09;之上的分布式、面向列的数据库&#xff0c;通过利用Hadoop的文件系统提供容错能力。如果你需要进行实时读写或者随机访问大规模的数据集的时候&#xff0c;请考虑使用H…

Canal数据同步配置

文章目录Canal数据同步配置0.canal工作原理1.**检查binlog功能是否有开启**2.如果显示状态为OFF表示该功能未开启&#xff0c;开启binlog功能3.**在mysql里面添加以下的相关用户和权限**4.下载安装Canal服务5.修改配置文件6.进入bin目录下启动7.idea中配置Canal数据同步配置 c…

记录第一次接口上线过程

新入职一家公司后&#xff0c;前三天一直在学习公司内部各种制度文化以及考试。 一直到第三天组长突然叫我过去&#xff0c;给了一个需求的思维导图&#xff0c;按照这个需求写这样一个接口&#xff0c; 其实还不错&#xff0c;不用自己去分析需求&#xff0c;按照这上面直接开…

工业机器人有哪些类型?如何利用工业网关集中监测管理?

工业机器人在制造业中的应用与日俱增&#xff0c;使用工业机器人&#xff0c;不仅提高了设备和场地的利用率&#xff0c;还能保持稳定的产品水平。随着工业机器人的大规模部署&#xff0c;对于数量众多、类型各异、功能不一的机器人的监测、管理和维护&#xff0c;也成为企业面…

Java 异常

文章目录1. 异常概述2. JVM 的默认处理方案3. 异常处理之 try...catch4. Throwable 的成员方法5. 编译异常和运行异常的区别6. 异常处理之 throws7. 自定义异常8. throws 和 throw 的区别1. 异常概述 异常就是程序出现了不正常的情况。 ① Error&#xff1a;严重问题&#xff…

Nessus: 漏洞扫描器-网络取证工具

Nessue 要理解网络漏洞攻击&#xff0c;应该理解攻击者不是单独攻击&#xff0c;而是组合攻击。因此&#xff0c;本文介绍了关于Nessus历史的研究&#xff0c;它是什么以及它如何与插件一起工作。研究了Nessus的特点&#xff0c;使其成为网络取证中非常推荐的网络漏洞扫描工具…

maven高级知识。

目录 一、分模块开发 1、分模块开发设计 2、依赖管理 二、继承和聚合 1、聚合 2、继承 三、属性 1、基本介绍 2、版本管理 四、多环境配置与应用 1、多环境开发 2、跳过测试 五、私服 1、私服安装 2、私服仓库分类 一、分模块开发 1、分模块开发设计 ▶ 示意图 …

【测绘程序设计】——计算卫星位置

本文分享了根据广播星历计算卫星于瞬时地固系下位置的计算程序(C#版)(注:瞬时地球坐标系坐标经极移改正即可获得协议地球坐标系坐标),相关源代码(完整工程,直接运行;包含实验数据)及使用示例如下。 目录 Part.Ⅰ 使用示例Part.Ⅱ 代码分析Chap.Ⅰ 数据结构Chap.Ⅱ 计…

原生javascript手写一个丝滑的轮播图

通过本文&#xff0c;你将学到: htmlcssjs 没错&#xff0c;就是html&#xff0c;css,js,现在是框架盛行的时代&#xff0c;所以很少会有人在意原生三件套&#xff0c;通过本文实现一个丝滑的轮播图&#xff0c;带你重温html,css和js基础知识。 为什么选用轮播图做示例&…

网络运维和网络安全运维有什么区别?就业前景如何?

随着互联网的高速发展&#xff0c;运维安全已经成了大多数企业安全保障的基石。在如今的信息时代&#xff0c;无论是网络运维还是网络安全运维都成了不可缺少的一部分。因此导致很多人都容易把两者弄混淆。首先我们来了解一下网络运维和网络安全运维有什么区别呢&#xff1f;网…