JavaSE阶段面试题(一)

目录

1.int a = 1, int b = 1, Integer c = 1, Integer d = 1;四个区别和联系,以及c和d是同一个吗?

2.为什么重写HashCode必须重写euqals,两者之间的关系?

3.创建对象的方式有哪些

4.重写和重载的区别

5.抽象类和接口的区别

6.String的不可变原则

7.浅拷贝和深拷贝


本专栏全是博主自己收集的面试题,仅可参考,不能相信面试官就出这种题目。

       

1.int a = 1, int b = 1, Integer c = 1, Integer d = 1;四个区别和联系,以及c和d是同一个吗?

   a 和 b 是基本数据类型 int 的 变量,它们直接存储在栈(stack)上,并且每个变量都有自己的存储空间。

        c 和 d 是 Integer 类型的 对象,它们存储在堆(heap)上,。多个 Integer 对象被创建并且它们的值相同,Java 可能会使它们引用相同的对象,从而节省内存。因此cd 可能会引用相同的 Integer 对象。所以可能是同一个

联系c 和 d 都是通过自动装箱从基本数据类型 int 转换而来的 Integer 对象。

区别:a、b是变量,存储在栈上;c和d是对象,是Integer类的实例,可以调用方法。

2.为什么重写HashCode必须重写euqals,两者之间的关系?

        解答问题之前,回忆一下,什么是HashCode和equals,及其作用

        HashCode是在Java中用于获取对象的唯一标识符的方法。它是根据对象的内容生成的一个整数值。对象的hashCode()方法被调用时,它返回的是对象内存地址的哈希码。哈希码可以用于在哈希表等数据结构中快速定位对象

注意点:

  1. 每一次运行对象内容即使一致,但hash值不一定一致
  2. 运行过程里,new的两个对象,内容相等 ≠ 哈希码相等
  3. 不同的对象可能会生成相同的哈希码,概率极低

那么为什么需要重写hashcode呢?

我也不太清楚,但是重写hashcode可以让两个内容相同的对象拥有同一个哈希码

例子:

public class Student {int age;String sex;String name;@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + this.age;result = prime * result + (this.sex == null ? 0 : this.sex.hashCode());result = prime * result + (this.name == null ? 0 : this.name.hashCode());return result;}

        在回忆一下equals,在Java中,equals() 方法被设计用来比较对象的用于比较对象的内容或状态是否相等!

        因此,疑问出来了,既然equals()方法比较的是内容或状态,那么是否hashCode()值相等,两个对象通过 equals() 方法被认为是相等吗?

解析:

        在 Java 中,当我们重写 hashCode() 方法时,通常需要同时重写 equals() 方法,这是为了维护 hashCode()equals() 方法之间的协定,确保对象在集合(如哈希表)中正确地工作。

  1. hashCode() 值相等

    • 如果两个对象的 hashCode() 值相等,那么根据 Java 的约定,这是 equals() 方法返回 true 的必要条件。也就是说,如果两个对象通过 equals() 方法相等,它们的 hashCode() 值必须相等。
  2. hashCode() 值不相等

    • 如果两个对象的 hashCode() 值不相等,那么按照 Java 的规定,这两个对象不应该通过 equals() 方法返回 true。即使 equals() 方法返回 true,也会违反 hashCode() 方法的契约,这可能导致在使用哈希集合(如 HashMapHashSet 等)时出现不一致的行为,甚至会导致数据结构的错误操作。

总结:HashCode()方法,HashCode方法通过内容一致得出相同的哈希码

           equals()方法,通过内容判断对象是否相同。

概述:一个类有三个属性,原本只通过一个属性重写了hashcode()和equals()方法,但是我将hashcode()方法,通过2个属性得出该对象的哈希值,可equals()方法还是根据一个属性判断,这并不安全,也会出现bug。

3.创建对象的方式有哪些

一般有5种:

第一种:常见的使用构造方法new对象

第二种:使用工厂设计模型,根据你需要的,自动创建出来。

// 定义汽车类
class Car {private String model;private int year;public Car(String model, int year) {this.model = model;this.year = year;}// 省略 getter 和 setter 方法
}// 定义汽车工厂类
class CarFactory {// 工厂方法,根据型号和年份创建汽车对象public static Car createCar(String model, int year) {//----- 判断条件 -----return new Car(model, year);}
}// 在主程序中使用工厂方法创建对象
public class Main {public static void main(String[] args) {// 使用工厂方法创建汽车对象Car myCar = CarFactory.createCar("Toyota Camry", 2023);}
}

第三种:克隆

克隆又分两种,一种浅克隆、一种深克隆,使用接口Cloneable和方法clone()

区别在于一个类中如果含有其他类,那么浅克隆,只能克隆表面,包含的类无法克隆,反之,深克隆可以做到!

class Teacher  implements Cloneable{private String name;private  int age;private Student student;
}
public class Test1 {public static void Shallow_cloning(){Teacher teacher = new Teacher();teacher.setAge(19);teacher.setName("李华");Student student = new Student();student.setName("喜喜");teacher.setStudent(student);Teacher teacher1 = teacher.clone();
}

第四种:通过反射

        反射机制允许在运行时检查类的信息,并动态地创建类的对象,可以调用类的构造方法来实现对象的创建

Class<?> clazz = Class.forName("指定的被反射的类");
类名 obj = (类名) clazz.getDeclaredConstructor().newInstance();

第五种:反序列化

        通过反序列化可以从存储设备(如文件、数据库)中读取对象的字节流,并将其转换回对象

ObjectInputStream in = new ObjectInputStream(new FileInputStream("文件名"));
MyClass obj = (MyClass) in.readObject();

4.重写和重载的区别

        重写:在面向对象的继承中,子类可以通过重写父类的方法来实现自己的版本。重写指的是子类定义了一个与父类中相同名称和参数列表(签名)的方法,并且返回类型和抛出的异常类型也必须与父类中的方法一致。重写的方法需要加上 @Override 注解(可选),这样可以让编译器帮助检查是否正确地重写了父类的方法

        重载:重载是指在同一个类中,可以定义多个方法名相同但参数列表不同(包括参数类型、参数个数或参数顺序)的方法。重载的方法彼此之间的签名必须不同,返回类型可以不同,但通常情况下只有返回类型不同是不够的。

总结

  • 重写发生在子类继承父类的过程中,用于实现多态性,要求方法签名相同。
  • 重载发生在同一个类中,用于提供多个同名方法以应对不同的参数情况,要求方法签名不同。

5.抽象类和接口的区别

抽象类:不能被实例化,都是被继承使用,可以有抽象方法(没有具体实现的方法),也可有具体的实现方法,可以有构造方法,被子类调用。

接口:定义了一组没有具体实现的方法,一个类可以实现多个接口,

  • 接口中的方法默认是 public abstract 的,属性默认是 public static final 的(Java 8 之后接口中可以有默认方法和静态方法)。
  • 类通过 implements 关键字来实现接口,并提供接口中定义的所有方法的具体实现。

6.String的不可变原则

        在Java中,String 类被设计为不可变的。有人说,我一开始让String类型指向"abc",然后再指向"wer" 不是发生了改变吗?

        不不不,实际上是创建了一个新的字符串对象,而不是修改原来的对象。旧的字符串对象将被Java的垃圾回收机制清理掉。

为什么是不可变的呢?

 线程安全角度:字符串不可变性确保了字符串对象在多线程环境下是安全的,不需要额外的同步操作。因为字符串一旦创建,它的值不会改变,所以不会出现多个线程同时修改一个字符串对象的情况。

哈希值:字符串被广泛用作 HashMap 和 HashSet 的键。由于字符串不可变,可以安全地缓存它们的哈希值,提高了哈希表的性能。

安全敏感操作:在安全敏感的环境中,不可变字符串确保了关键信息(如密码)不会被意外修改。

或许有人说,如果需要频繁更改,岂不是很麻烦!

不不不,因为字符串池(String Pool)存在。字符串池是一种特殊的内存区域,用于存储字面量字符串,以便多个字符串引用可以共享相同的实例,从而节省内存。

7.浅拷贝和深拷贝

        之前我们在描述创建对象的时候,以及提及到了浅拷贝和深拷贝

拷贝:将一组数据原封不动的转移到另容器。

例如:字符串拷贝和数组拷贝

String original = "Hello";
String copied = new String(original);String original = "Hello";
String copied = original.substring(0); // 从索引0开始,复制到字符串末尾int[] original = {1, 2, 3, 4, 5};
int[] copied = original.clone();  //用数组的 clone() 方法

但是对象也是一组数据,因此也可以拷贝

浅拷贝:通过对象实现了 Cloneable 接口,重写clone()方法

class Teacher2  implements Cloneable{private String name;private  int age;@Overrideprotected Teacher2 clone(){Teacher2 t1 = null;try {t1 = (Teacher2) super.clone();// 克隆引用类型t1.setStudent(t1.getStudent().clone());} catch (CloneNotSupportedException e) {throw new RuntimeException(e);}return t1;}
}public static void Shallow_cloning(){Teacher2 teacher = new Teacher();teacher.setAge(19);teacher.setName("李华");//克隆Teacher2 teacher1 = teacher.clone();
}

而所谓的深克隆就是针对一种类的有其他对象的存在,例如:

class Teacher  implements Cloneable{private String name;private  int age;private Student student;   //存在一个对象Student}

这种情况下,即使克隆,其中的student还是原来的,只是共享了数据。

解决方法有三种:

  1. 所有引用属性都实现克隆,整个对象就变成了深克隆。
  2. 使用 JDK 自带的字节流序列化和反序列化对象实现深克隆。(略)
  3. 使用第三方工具实现深克隆,比如 Apache Commons Lang 库。(略)

引用属性都实现克隆方法:

public class CloneDemo {public static void main(String[] args) {Person p1 = new Person();p1.setName("张三");p1.setAge(18);// 引用类型Address address = new Address();address.setCity("北京");p1.setAddress(address);// 克隆 p1 对象Person p2 = p1.clone();// 对比引用类型的地址值是否相同System.out.println(p1.getAddress() == p2.getAddress()); // false}
}@Getter
@Setter
class Person implements Cloneable {private String name;private int age;private Address address; // 引用类型@Overridepublic Person clone() {Person person = null;try {person = (Person) super.clone();// 克隆引用类型person.setAddress(person.getAddress().clone());} catch (CloneNotSupportedException e) {e.printStackTrace();}return person;}
}@Getter
@Setter
class Address implements Cloneable {private String city;@Overridepublic Address clone() {Address address = null;try {address = (Address) super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return address;}
}

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

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

相关文章

day02-广播机制

广播机制 广播是numpy对不同形状的数组进行数值计算的方式&#xff0c;对数组的算术运算通常在相应的元素上进行 1.如果两个数组a和b形状相同&#xff0c;即满足a.shape b.shape&#xff0c;那么a*b的结果就是a与b数组对应位相乘。这要求维数相同且各维度的长度相同 a np.a…

七大排序算法的深入浅出(java篇)

&#x1f341; 个人主页&#xff1a;爱编程的Tom&#x1f4ab; 本篇博文收录专栏&#xff1a;Java专栏&#x1f449; 目前其它专栏&#xff1a;c系列小游戏 c语言系列--万物的开始_ 等等 &#x1f389; 欢迎 &#x1f44d;点赞✍评论⭐收藏&#x1f496;三连支…

【高级篇】第9章 Elasticsearch 监控与故障排查

9.1 引言 在现代数据驱动的应用架构中,Elasticsearch不仅是海量数据索引和搜索的核心,其稳定性和性能直接影响到整个业务链路的健康度。因此,建立有效的监控体系和掌握故障排查技能是每一位Elasticsearch高级专家的必备能力。 9.2 监控工具:洞察与优化的利器 在Elastics…

乘用车副水箱浮球式液位计传感器

浮球式液位计概述 浮球式液位计是一种利用浮球在液体中浮动的原理来测量液位的设备&#xff0c;广泛应用于各种工业自动化控制系统中&#xff0c;如石油化工、水处理、食品饮料等行业。它通过浮球的上下运动来测量液位的高低&#xff0c;具有结构简单、安装方便、测量范围广、…

如何选择适合自己的虚拟化技术?

虚拟化技术已成为现代数据中心和云计算环境的核心组成部分。本文将帮助您了解如何选择适合自己需求的虚拟化技术&#xff0c;以实现更高的效率、资源利用率和灵活性。 理解虚拟化技术 首先&#xff0c;让我们了解虚拟化技术的基本概念。虚拟化允许将一个物理服务器划分为多个虚…

【Linux】多线程(一万六千字)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 文章目录 前言 线程的概念 线程的理解(Linux系统为例) 在Linux系统里如何保证让正文部分的代码可以并发的去跑呢&#xff1f; 为什么要有多进程呢&#xff1f; 为…

Osg中的智能指针和观察指针

目录 1 设计 内容 1 设计 osg中能够使用智能指针的对象都继承自引用计数类Referenced&#xff0c;观察指针(observer_ptr)与智能指针之间通过ObserverSet相互关联&#xff0c;其中obserserver_ptr直接依赖ObeserverSet。 Referenced不直接依赖ObserverSet类&#xff0c;但可…

pdf合并,pdf合并成一个pdf,pdf合并在线网页版

在处理pdf文件的过程中&#xff0c;有时我们需要将多个pdf文件合并成一个pdf文件。作为一名有着丰富计算机应用经验的技术博主&#xff0c;我将为您详细介绍如何将多个pdf文件合并成一个pdf文件。 pdf合并方法&#xff1a;使用&#xff0c; “轻云处理pdf官网” 打开 “轻云处…

【高中数学/基本不等式】已知:x,y皆大于1,且x+2y=4 求:1/(x-1)+1/(y-1)的最小值为?

【问题来源】 https://www.ixigua.com/7025123539728466469?logTag1c2fd2e305d60e6277ab 之第一题 【问题】 已知&#xff1a;x,y皆大于1&#xff0c;且x2y4 求&#xff1a;1/(x-1)1/(y-1)的最小值为&#xff1f; 【解答】 解&#xff1a; 若将(x2y)/41代入目标式&…

学习笔记(linux高级编程)11

进程间通信 》信号通信 应用&#xff1a;异步通信。 中断&#xff0c;&#xff0c; 1~64&#xff1b;32应用编程。 如何响应&#xff1a; Term Default action is to terminate the process. Ign Default action is to ignore the signal. wait Core Default action is …

番外篇 | 斯坦福提出即插即用二阶优化器Sophia :相比Adam实现2倍加速,显著节省大语言模型训练成本

前言:Hello大家好,我是小哥谈。大模型的预训练成本巨大,优化算法的改进可以加快模型的训练时间并减少训练开销。目前大模型的训练优化器基本上都采用Adam及其变体,并且Adam的应用已经有9个年头了,在模型优化方面相当于霸主的地位。但是能否够在优化器方面提高模型预训练效…

医院挂号系统:基于JSP和MySQL的现代化医疗预约平台

开头语&#xff1a;您好&#xff0c;我是专注于医疗系统开发的IT学长。如果您对医院挂号系统感兴趣&#xff0c;欢迎联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSP技术&#xff0c;B/S架构 工具&#xff1a;Eclipse&#xff0c;MyEclips…

中国企业消费管理,驶入“降本”大潮

在足够明晰的成本优化方案之上&#xff0c;能看到除了美团企业版的产品和需求理解能力&#xff0c;更本质的恰在于其最核心的原子能力——即强供应链底座。 这种兼备深度和广度的能力的最终呈现也就是如今美团为企业提供的多元、优质、满足需求的成本考校和计算方案。 作者…

【Python】成功解决TypeError: ‘float‘ object cannot be interpreted as an integer

【Python】成功解决TypeError: ‘float’ object cannot be interpreted as an integer 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主…

客户端渗透

1.一键可执行程序 2.给程序加壳 3.宏病毒感染文档 4.Android apk 利用 1.一键可执行程序 介绍&#xff1a;我们要进行客户端渗透&#xff0c;我们生成一个可执行程序&#xff0c;也是简单粗暴&#xff0c;MSF建立监听&#xff0c;把它发给受害者&#xff0c;只要受害者点击…

VQ-VAE中如何解决梯度截断(不可导)问题?直通估计、(stop gradient,停止梯度)

&#xff08;stop gradient&#xff0c;停止梯度&#xff09;运算 它简称为sg 也就是说&#xff0c;前向传播时&#xff0c;&#x1d460;&#x1d454;里的值不变(sg1)&#xff1b;反向传播时&#xff0c;&#x1d460;&#x1d454;按值为0求导(sg0)&#xff0c;即此次计算无…

Qt Q_ASSERT详解

Q_ASSERT详解 引言一、基本用法二、深入了解三、参考链接 引言 Q_ASSERT是 Qt 框架中的一个宏&#xff0c;用于在调试时检查某个条件是否为真。它是程序调试中的一个重要工具&#xff0c;有助于开发者在开发过程中及时发现并修复潜在的错误。 一、基本用法 只在使用 Qt 的 D…

干货:科技论文写作保姆级攻略

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。科技论文是报道自然科学研究或技术开发工作成果的论说文章。通常基于概念、判断、推理、证明或反驳等逻辑思维体系&#xff0c;使用实验调研或理论计算等研究手段&#xff0c;按照特定格式撰写完成。 科技论文可以粗略分为…

UiPath+Appium实现app自动化测试

一、环境准备工作 1.1 完成appium环境的搭建 参考&#xff1a;pythonappiumpytestallure模拟器(MuMu)自动化测试环境搭建_appium mumu模拟器-CSDN博客 1.2 完成uipath的安装 登录官网&#xff0c;完成注册与软件下载安装。 UiPath业务自动化平台&#xff1a;先进的RPA及自动…

vue组件深入介绍之插槽

了解插槽之前请先了解vue组件基础及注册 Vue2官网介绍 Vue3官网介绍 1、vue2插槽介绍 在2.6.0中&#xff0c;具名插槽和作用域插槽引入了一个新的统一语法&#xff08;v-slot指令&#xff09;。它将取代slot和slot-scope&#xff1b; Vue 实现了一套内容分发的 API&#xf…