java面试-java基础(下)

文章目录

  • 一、==和equals区别?
  • 二、hashcode方法作用?两个对象的hashCode方法相同,则equals方法也一定为true吗?
  • 三、为什么重写equals方法就一定要重写hashCode方法?
  • 四、Java中的参数传递时传值呢还是传引用?
  • 五、深拷贝和浅拷贝?
  • 六、Java中创建对象的几种方式?
  • 七、Java对象初始化过程?(笔试)
  • 八、怎么精确表示任意精度的整数和任何精度的定点数或者货币?
  • 九、String是Java基本数据类型吗?可以被继承吗?
  • 十、String是不可变类吗?字符串拼接是如何实现的?
  • 十一、不同String创建方法分别创建了几个对象?
  • 十二、String为什么是不可变的?设计原因?
  • 十三、String、StringBuilder、StringBuffer 的区别?
  • 总结


一、==和equals区别?

  • ==:如果比较的对象是基本数据类型,则比较的是数值是否相等;如果比较的对象是引用数据类型,则比较的是对象的地址值是否相等
  • equals方法:没有重写相当于==,重写后比较两个对象的内容是否相等。String、Integer重写了

二、hashcode方法作用?两个对象的hashCode方法相同,则equals方法也一定为true吗?

  • hashCode 方法主要用来获取对象的哈希码,哈希码是由对象的内存地址或者对象的属性计算出来的,它是⼀个int类型的整数,重复率低,因此可以用来作为键值对的键,以提高查询效率。
  • 不一定。因为存在哈希冲突,不同的对象可能会有相同的哈希值,所以哈希值相等,并不一定能equals方法相等。为了解决哈希冲突的问题,在判断对象是否相等时,不仅会比较键对象的哈希码,还会使用 equals 方法。如果两个对象的哈希码相同,但通过equals方法比较结果为 false,那么这两个对象就不被视为相等。

三、为什么重写equals方法就一定要重写hashCode方法?

  • 保证在equals相同的情况下hashcode值必定相同:如果只重写equals方法,那么被认为相等的对象可能会有不同的哈希码(默认是对象的地址,因此所有对象都是不同的哈希码),存储在集合不同的位置,导致集合出现重复元素或者无法找到对应元素(因为equals是根据对象的特征进行重写)
  • 提升性能:hashCode能提高hashmap等集合去重的性能,如果没有重写hashCode()方法,那么集合每次添加元素都要遍历已有元素调用equals方法,性能太差,重写hashcode能减少equals方法调用次数

四、Java中的参数传递时传值呢还是传引用?

  • java基本类型作为参数被传递时是值传递;引用类型作为参数被传递时也是值传递,参数值是对象的引用。

五、深拷贝和浅拷贝?

  • 浅拷贝仅拷贝被拷贝对象的基本数据类型变量的值和引用数据类型变量的地址值,而对于引用类型变量指向的堆中的对象不会拷贝
  • 深拷贝完全拷贝一个对象,拷贝被拷贝对象的成员变量的值,堆中的对象也会拷贝一份。
  • 浅拷贝需要实现Cloneable接口并重写Object类中的clone()方法;
  • 深拷贝需要实现Serializable接口,通过对象的序列化和反序列化,或者使所有引用类型属性实现Cloneable接口

六、Java中创建对象的几种方式?

  • 使用new关键字
A a = new A();
  • 使用Class类的newInstance方法,Class.forName.newInstance()
Class clazz = Class.forName("A");
A a = (A) clazz.newInstance();
  • 使用clone方法
A a = new A();
A a2= (A) a.clone();
  • 反序列化,比如调用ObjectInputStream类的readObject()方法
A a= new A();
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("a.txt"));
oos.writeObject(a);
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("a.txt"));
A a2 = (A) ois.readObject();

七、Java对象初始化过程?(笔试)

  • 父类静态属性
  • 父类静态代码块
  • 子类静态属性
  • 子类静态代码块
  • 父类非静态属性
  • 父类构造代码块
  • 父类构造方法
  • 子类非静态属性
  • 子类构造代码块
  • 子类构造方法

八、怎么精确表示任意精度的整数和任何精度的定点数或者货币?

  • BigInteger任意精度的整数
  • BigDecimal任何精度的定点数->货币
  • 转成分用int运算

九、String是Java基本数据类型吗?可以被继承吗?

  • 引用类型,String被final修饰不能被继承

十、String是不可变类吗?字符串拼接是如何实现的?

  • String是不可变的,1.8以前+的拼接操作,如果字符串在常量池中不存在,则会生成新的对象。1.8时被优化为基于StringBuilder的append方法进行处理

十一、不同String创建方法分别创建了几个对象?

String str1 = "abc";//1
String str2 = new String("abc")//2 
  • 1在内存的字符串常量池中存储abc字符串对象
  • 2在内存的字符串常量池中找abc字符串对象,没有则创建;在堆中创建str2对象,引用指向abc字符串对象

十二、String为什么是不可变的?设计原因?

  • 不可变:一旦String对象被创建,它所包含的字符串内容是不可改变的。
  • 不可变是因为引用的char数组(jdk1.9后改为byte数组)被final修饰。字符串的值本身不能改变,但引用字符串的变量中记录的地址值是可以改变的。每次修改操作(如拼接、替换等)都会产生新对象。
  • 避免内存浪费:当创建一个String对象时,如果字符串值在常量池中已经存在则不会创建,只是引用已经存在的对象
  • 性能优化:字符串不变性保证了hash码的唯一性,允许String对象缓存频繁使用的HashCode(如HashMap),不必每次都去计算新的哈希码
  • 安全性:String被许多的Java类用来当做参数,例如:网络连接地址URL、文件路径path、反射机制的String参数等, 如果String不是固定不变的,将会引起各种安全隐患。

十三、String、StringBuilder、StringBuffer 的区别?

  • String:类的对象是不可变的;适用于字符串内容不经常改变的场景。在使用字符串常量或进行少量的字符串操作时使用。每次对String对象进行修改操作(如拼接、替换等)实际上都会生成一个新的String对象,而不是修改原有对象。大量字符串连接情况下,产生太多对象浪费内存。线程安全
  • StringBuilder:适用于单线程环境下需要频繁修改字符串内容的场景,比如在循环中拼接或修改字符串,使用字符数组char[]保存字符串,可变类,每次对String对象进行修改操作(如拼接、替换等)都是直接在原有字符串对象的底层数组上进行,不产生新对象,线程不安全;效率高
  • StringBuffer:适用于多线程环境下需要频繁修改字符串内容的场景,使用字符数组char[]保存字符串,可变类,方法加同步锁synchronized,线程安全;效率低
  • 多线程强制使用StringBuilder()
public class StringBuilderHolder {private final StringBuilder sb;public StringBuilderHolder(int capacity) {sb = new StringBuidler(capacity);}//3.避免重复构造String,重用StringBuilderpublic StringBuilder resetAndGetStringBuilder() {sb.setLength(0);return sb;}
}
//2.ThreadLocal避免多线程冲突
private static final ThreadLocal<StringBuilderHolder> threadLocalStringBuilderHolder = new ThreadLocal<StringBuilderHolder>() {protected StringBuilderHolder initialValue() {//1.设置好初始长度,超过char[]默认16调用System.arraycopy成倍复制扩容太浪费资源return new StringBuilderHolder(256);}
}StringBuilder sb = threadLocalStringBuilderHolder.get().resetAndGetStringBuilder();

总结

本文介绍了的java面试之java基础(下),如有问题欢迎私信和评论

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

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

相关文章

期末上分站——计组(3)

复习题21-42 21、指令周期是指__C_。 A. CPU从主存取出一条指令的时间 B. CPU执行一条指令的时间 C. CPU从主存取出一条指令的时间加上执行这条指令的时间。 D. 时钟周期时间 22、微型机系统中外设通过适配器与主板的系统总线相连接&#xff0c;其功能是__D_。 A. 数据缓冲和…

数据库可视化管理工具dbeaver试用及问题处理。

本文记录了在内网离线安装数据库可视化管理工具dbeaver的过程和相关问题处理方法。 一、下载dbeaver https://dbeaver.io/download/ 笔者测试时Windows平台最新版本为&#xff1a;dbeaver-ce-24.1.1-x86_64-setup.exe 二、安装方法 一路“下一步”即可 三、问题处理 1、问…

【深度学习】vscode 命令行下的debug

其实我一直知道vscode可以再命令行下进行debug。 比如 python aaa.py --bb1 --cc2 以前的做法是 去aaa.py 写死bb和cc 然后直接debug。 直到今天我遇到这个&#xff1a; hydra hydra.main(version_baseNone, config_name/home/justin/Desktop/code/python_project/WASB-SBDT-m…

Truffle学习笔记

Truffle学习笔记 安装truffle, 注意: 虽然目前truffle最新版是 5.0.0, 但是经过我实践之后, 返现和v4有很多不同(比如: web3.eth.accounts; 都获取不到账户), 还是那句话: “nodejs模块的版本问题会搞死人的 !” 目前4.1.15之前的版本都不能用了, 只能安装v4.1.15 npm instal…

新手学Cocos报错 [Assets] Failed to open

两个都在偏好设置里面调&#xff08;文件下面的偏好设置&#xff09;&#xff1a; 1.设置中文&#xff1f; 2.报错 [Assets] Failed to open&#xff1f; 这样在点击打开ts文件的时候就不会报错&#xff0c;并且用vscode编辑器打开了&#xff0c; 同样也可以改成你们自己喜欢…

LabVIEW在图像处理中的应用

abVIEW作为一种图形化编程环境&#xff0c;不仅在数据采集和仪器控制领域表现出色&#xff0c;还在图像处理方面具有强大的功能。借助其Vision Development Module&#xff0c;LabVIEW提供了丰富的图像处理工具&#xff0c;广泛应用于工业检测、医学影像、自动化控制等多个领域…

Apache Seata应用侧启动过程剖析——RM TM如何与TC建立连接

本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 Apache Seata应用侧启动过程剖析——RM & TM如何与TC建立连接 前言 看过官网 README 的第…

Android最近任务显示的图片

Android最近任务显示的图片 1、TaskSnapshot截图1.1 snapshotTask1.2 drawAppThemeSnapshot 2、导航栏显示问题3、Recentan按键进入最近任务 1、TaskSnapshot截图 frameworks/base/services/core/java/com/android/server/wm/TaskSnapshotController.java frameworks/base/cor…

IPython 性能评估工具的较量:%%timeit 与 %timeit 的差异解析

IPython 性能评估工具的较量&#xff1a;%%timeit 与 %timeit 的差异解析 在 IPython 的世界中&#xff0c;性能评估是一项至关重要的任务。%%timeit 和 %timeit 是两个用于测量代码执行时间的魔术命令&#xff0c;但它们之间存在一些关键的差异。本文将深入探讨这两个命令的不…

2786. 访问数组中的位置使分数最大

2786. 访问数组中的位置使分数最大 题目链接&#xff1a;2786. 访问数组中的位置使分数最大 代码如下&#xff1a; //参考链接:https://leetcode.cn/problems/visit-array-positions-to-maximize-score/solutions/2810335/dp-by-kkkk-16-tn9f class Solution { public:long …

vue-router 4汇总

一、vue和vue-router版本&#xff1a; "vue": "^3.4.29", "vue-router": "^4.4.0" 二、路由传参&#xff1a; 方式一&#xff1a; 路由配置&#xff1a;/src/router/index.ts import {createRouter,createWebHistory } from &quo…

探索 WebKit 的缓存迷宫:深入理解其高效缓存机制

探索 WebKit 的缓存迷宫&#xff1a;深入理解其高效缓存机制 在当今快速变化的网络世界中&#xff0c;WebKit 作为领先的浏览器引擎之一&#xff0c;其缓存机制对于提升网页加载速度、减少服务器负载以及改善用户体验起着至关重要的作用。本文将深入探讨 WebKit 的缓存机制&am…

代码随想录leetcode200题之额外题目

目录 1 介绍2 训练3 参考 1 介绍 本博客用来记录代码随想录leetcode200题之额外题目相关题目。 2 训练 题目1&#xff1a;1365. 有多少小于当前数字的数字 解题思路&#xff1a;二分查找。 C代码如下&#xff0c; class Solution { public:vector<int> smallerNumb…

卷积神经网络(CNN)和循环神经网络(RNN) 的区别与联系

卷积神经网络&#xff08;CNN&#xff09;和循环神经网络&#xff08;RNN&#xff09;是两种广泛应用于深度学习的神经网络架构&#xff0c;它们在设计理念和应用领域上有显著区别&#xff0c;但也存在一些联系。 ### 卷积神经网络&#xff08;CNN&#xff09; #### 主要特点…

解决C++编译时的产生的skipping incompatible xxx 错误

问题 我在编译项目时&#xff0c;产生了一个 /usr/bin/ld: skipping incompatible ../../xxx/ when searching for -lxxx 的编译错误&#xff0c;如下图所示&#xff1a; 解决方法 由图中的错误可知&#xff0c;在编译时&#xff0c;是能够在我们指定目录下的 *.so 动态库的…

python函数和c的区别有哪些

Python有很多内置函数&#xff08;build in function&#xff09;&#xff0c;不需要写头文件&#xff0c;Python还有很多强大的模块&#xff0c;需要时导入便可。C语言在这一点上远不及Python&#xff0c;大多时候都需要自己手动实现。 C语言中的函数&#xff0c;有着严格的顺…

Java基础(六)——继承

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 ⚡开源项目&#xff1a; rich-vue3 &#xff08;基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL&#xff09; &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1…

【Web】

1、配仓库 [rootlocalhost yum.repos.d]# vi rpm.repo ##本地仓库标准写法 [baseos] namemiaoshubaseos baseurl/mnt/BaseOS gpgcheck0 [appstream] namemiaoshuappstream baseurlfile:///mnt/AppStream gpgcheck0 2、挂载 [rootlocalhost ~]mount /dev/sr0 /mnt mount: /m…

QT操作各类数据库用法详解

文章目录 创建内存SQLITE数据库QSqlTableModel操作数据库表连接国产数据库多线程数据处理不指定数据库名打开数据库QT对各种数据库的支持情况处理数据库表名QT连接各种数据库Qt提供了一个名为QtSQL模块的强大组件, 使得在Qt应用程序中连接和操作多种类型的数据库变得相对简单。…

Vulnhub-Os-hackNos-1(包含靶机获取不了IP地址)

https://download.vulnhub.com/hacknos/Os-hackNos-1.ova #靶机下载地址 题目&#xff1a;要找到两个flag user.txt root.txt 文件打开 改为NAT vuln-hub-OS-HACKNOS-1靶机检测不到IP地址 重启靶机 按住shift 按下键盘字母"E"键 将图中ro修改成…