当前位置: 首页 > news >正文

Java全栈经典面试题剖析4】JavaSE高级 -- 包装类,String, 类方法

目录

面试题3.1  什么是自动装箱与拆箱?用什么方式来装箱与拆箱?

面试题3.2  int和Integer有什么区别?

面试题3.3  Integer常量池

面试题3.4  字符串常量池

面试题3.5  这句代码创建了几个对象?  String str1 = new String("xyz");

面试题3.6  String和StringBuffer的区别?StringBuffer和StringBuilder区别?

面试题3.7  String是基本数据类型吗?我可不可以写个类继承于String?

面试题3.8  数字转字符有多少种方式,分别是什么

面试题3.9  数组中有没有length()方法,String中有没有length()方法?

面试题3.10  ==和equals的区别?

面试题3.11  为什么要有hashCode?

面试题3.12  hashCode的作用是什么

计算hashCode的计算方法

面试题3.13  采用Hash的好处,什么是碰撞(不同对象可能算出同一哈希值)

面试题3.14  有没有可能两个不相等的对象有有相同的 hashcode?

面试题3.15  两个相同的对象会有不同的hashcode吗?可以在hashcode()中使用随机数字吗?

面试题3.16  hashCode()与equals()的相关规定

面试题3.17  hashcode和equals的区别


面试题3.1  什么是自动装箱与拆箱?用什么方式来装箱与拆箱?

【技术难度: 2    出现频率: 1 】

一:

自动拆箱就是将基本数据类型自动转换成对应的包装类对象,自动拆箱就是将包装类对象自动转换为基本数据类型。

二:

自动拆箱在需要一个包装类但传入了一个对应的基本类型时发生。

自动拆箱可以在包装类型和基本类型比较大小时、包装类型参与运算时、三目运算符中使用包装类型时发生。

自动装箱:valueOf()当数值i在 -128 ~ 127 之间时 会从cache缓冲区中取出对应的Integer对象当数值不在这个范围内时会new一个新的Integer对象
自动拆箱:intValue()直接把Integer类保存的返回

面试题3.2  int和Integer有什么区别?

【技术难度:  1   出现频率:1  】

1.int是基本数据类型Integer是引用类型数据,Integer是int的包装类,具有类的性质,有自己的属性和方法。

2.Integer变量必须实例化后才能使用,int变量不需要;

3.Integer变量存的是对象的引用,int变量是直接存储数据值;

4.Integer变量的默认值是null,int变量的默认值是0。

拓:简单说一下包装类和原生类。
原生类:就是基本数据类型 比如:int 不具有类的特征(属性和方法)默认值是0
包装类:是java根据基本类型做封装 目的是让基本类型具有类的特征(让其拥有自己的属性和方法)

面试题3.3  Integer常量池

【技术难度: 1    出现频率:1  】

Integer自动装箱时,会使用valueOf()方法,-128~127之间的值直接从该包装类的常量数组(cache缓冲区)中获取现成对象。

面试题3.4  字符串常量池

【技术难度:   2  出现频率: 1】

1. jdk1.7之前字符串常量池在方法区,jdk1.7后在堆中(这一变化的主要原因是方法区的内存空间较小,而堆空间相对较大,可以更好地容纳字符串常量池。)

2. ""声明的字符串对象,保存在字符串常量池中;

3. 用""声明字符串时,如果能在字符串常量池中找到直接返回内存地址,如果不能就创建字符串返回内存地址。(所以:System.out.println("123" == "123");//true)

面试题3.5  这句代码创建了几个对象?  String str1 = new String("xyz");

【技术难度:2     出现频率:1  】

2个,"xyz"在字符串常量池,new String()在堆中。Str1在局部变量表中。

面试题3.6  String和StringBuffer的区别?StringBuffer和StringBuilder区别?

【技术难度: 2    出现频率:1  】

1.String是不可变的,对String类对象的任何改变都会返回一个新的String对象,另外两个类是可变的,对他们的内容修改都是当前这个对象;

2.String类重写了equals()和hashcode()方法另外两个类没有重写

3.双引号创建的String字符串保存在字符串常量池,其他是在堆中创建对象;

4.StringBuffer是线程安全的,StringBuilder是非线程安全的,不考虑线程安全使用StringBuilder效率更高。

5.String,Stringbuilder,StringBuffer的底层都是一个char[],但是String的char[]使用了final进行修饰。

6.Stringbuilder,StringBuffer提供了修改字符串的append()方法

在Java中,String、StringBuilder和StringBuffer都用于处理字符串,但它们之间有一些关键的区别。

不可变性:

String:字符串在Java中是不可变的。这意味着每当你对字符串进行操作(如连接、替换等),都会生成一个新的字符串对象,而原始字符串保持不变。这种不可变性提供了线程安全,但可能导致大量的中间对象创建,这在处理大量字符串操作时可能会导致性能问题。

StringBuilder和StringBuffer:这两者都是可变的,允许你在不创建新对象的情况下修改字符串。这通常可以提高处理大量字符串操作的性能。

线程安全性:

String:由于其不可变性,String自然是线程安全的。

StringBuilder:不是线程安全的。它应该只在单线程环境中使用,以避免并发修改导致的问题。

StringBuffer:是线程安全的。它的方法(如append()、insert()等)都是同步的,这意味着在多线程环境中,你可以安全地使用它而不用担心数据不一致。

性能:

对于简单的字符串操作,String可能足够快,并且由于其不可变性,它在某些情况下(如字符串常量)是理想的选择。

对于需要大量字符串连接或修改的场景,StringBuilder通常比String更高效,因为它避免了不必要的对象创建和垃圾收集。

StringBuffer在性能上通常略低于StringBuilder,因为它需要同步,这增加了额外的开销。但是,如果你在多线程环境中工作,并且需要线程安全,那么这种开销是值得的。

用途:

String:适用于不需要修改的字符串操作,如日志记录、简单的文本处理等。

StringBuilder:适用于单线程环境中需要大量字符串连接或修改的场景,如构建复杂的SQL查询、生成动态HTML等。

StringBuffer:适用于多线程环境中需要线程安全的字符串操作。

面试题3.7  String是基本数据类型吗?我可不可以写个类继承于String?

【技术难度:2     出现频率:1  】

不是,String是引用类型;String是final修饰的类,不可被继承。
String\StringBuilder\StringBuffer都是最终类(被final修饰)不能被继承。

面试题3.8  数字转字符有多少种方式,分别是什么

【技术难度: 1    出现频率:1  】

1.String.valueOf(123);//String类的valueOf()方法。

2.""+123;

3.Integer.toString(123)。//包装类的toString()方法。

面试题3.9  数组中有没有length()方法,String中有没有length()方法?

【技术难度:1     出现频率: 1 】

数组没有lenth()方法,有lenth属性,String中有length()方法

面试题3.10  ==和equals的区别?

【技术难度: 2    出现频率:2  】

1.对于==来说,如果两边是基本数据类型做的是值的比较,如果两边是引用数据类型做的是内存地址的比较;

2.Object类的equals()方法,默认是使用==判断2个对象的内存地址是否相等,重写以后按照自定义规则比较2个对象;

3.基本类型只能用==,没有equals()方法。

面试题3.11  为什么要有hashCode?

面试题3.12  hashCode的作用是什么

【技术难度:2     出现频率:1  】

  1. 生成对象的散列码:通过hashcode()可生成对象的散列码(一个32位的整型),散列码可作为对象的一种特征标识,在底层为哈希表的集合中,可用来快速定位对象。
  2. 提高查找和检索效率,在底层为散列的集合中,通过哈希码,可以快速定位到对象可能存在的位置(O(1)时间复杂度),从而显著减少查找所需要的时间。
  3. 通过hashcode可以快速判断对象的重复性;
计算hashCode的计算方法:

Integer类型的hashcode \ string类型的hashcode \ 对象类型的hashcode

面试题3.13  采用Hash的好处,什么是碰撞(不同对象可能算出同一哈希值)

【技术难度:  2   出现频率:1  】

1.Hash算法可以将把任意长度数据变换成固定长度的标志,此标志和源数据每个字节都有紧密关系并很难找到逆向规律,使用Hash算法可以提高空间利用率、数据查询效率等;

2.不同对象可能算出同一哈希值,这种现象称碰撞(或称哈希冲突)。

面试题3.14  有没有可能两个不相等的对象有有相同的 hashcode?

【技术难度:2     出现频率:1  】

可能会相同,因为哈希算法存在哈希冲突的问题,对不同的内容可能算出同一哈希值,这可能导致两个不同对象的hashCode相同。 

面试题3.15  两个相同的对象会有不同的hashcode吗?可以在hashcode()中使用随机数字吗?

【技术难度: 2    出现频率:1  】

如果是Java中自带的hashcode方法就不会。
可以这么写,但不推荐。根据java底层规范和标准,不允许发生这样的情况,对象相等应保证他们的hashcode相等,否则会导致使用hash的对象发生错误。

面试题3.16  hashCode()与equals()的相关规定

【技术难度: 2    出现频率: 1 】

第一层:

1.如果两个对象相等,hashcode⼀定相等,而且对两个对象分别调用equals()方法都应返回true;

2.若两个对象的hashcode相等,两个对象不⼀定相等;

3.若需重写,必须一起重写equals()和hashCode()方法,保证对象equals()相等的情况下,hashcode也要相等;

第二层:

4.hashCode()默认用对象内存地址计算一个哈希值,equals() 默认用==比较2个对象的内存地址是否相等,如果没有重写这两个方法,则该类的两个不同地址的对象无论如何都不会相等(即使这两个对象的属性是相同的数据)。

面试题3.17  hashcode和equals的区别

【技术难度:2     出现频率:1  】

hashCode()默认用对象内存地址计算并返回一个整型值,不同内存地址可能算出相同的hashcode (哈希冲突),equals()默认用==比较2个对象的内存地址是否相等。

简单说:

两个对象equals()相等,hashcode()一定相等

两个对象equals()不相等,hashcode()可能相等

两个对象的hashcode()不相等,equals()一定不相等


------------------------END-------------------------

才疏学浅,谬误难免,欢迎各位批评指正。


http://www.mrgr.cn/news/56047.html

相关文章:

  • Linux虚拟化软件与操作系统与SSH客户端
  • Unity--AssestBundles--热更新
  • 面向对象与设计模式第二课:设计模式实战
  • CISP/NISP二级练习题-第一卷
  • 如何计算表格中重复项有多少?
  • 大模型的检索增强生成综述研究
  • 多线程初阶(九):线程池 ThreadPoolExecutor 工厂模式
  • 03:【HAL库】外部中断的使用
  • YOLOv11算法解析
  • Java全栈经典面试题剖析6】JavaSE高级 -- 文件、IO流、序列化
  • 【Fargo】11: pacing 参数不生效:同步调整采集码率
  • 【代码随想录Day48】图论Part01
  • 永恒之蓝漏洞
  • 华为od面试手撕代码真题题型6——传统双指针
  • 贝叶斯决策论
  • 【vue2.7.16系列】手把手教你搭建后台系统__provider绑定类标识(11)
  • 【C#】调用本机AI大模型流式返回
  • typescript 中的类型推断
  • 「C/C++」C++ STL容器库 之 std::string 字符串类
  • 银行软件测试有哪些测试点?一般银行的软件测试工作流程有哪些?
  • 2226733-37-3,Mal-amido-PEG24-NHS是一种结合了马来酰亚胺和聚乙二醇的活性酯化合物
  • 医疗健康行业获客难?来看这位区域总经理的业绩增长破局之道
  • sql获取时间差
  • WebGl 使用平行矩阵实现图像平移
  • 浪潮云启操作系统(InLinux)bcache缓存实践:理解OpenStack环境下虚拟机卷、Ceph OSD、bcache设备之间的映射关系
  • 太极0.5