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

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.kler.cn/news/359401.html

相关文章:

  • 【Flutter】Dart:异常
  • 大数据-178 Elasticsearch Query - Java API 索引操作 文档操作
  • 深入解析Vue中的双向数据绑定机制
  • HCIP——以太网交换安全(四)DHCP Snooping
  • 设计模式——装饰者模式(8)
  • Go语言实现黑马点评项目
  • 子比主题美化-独立下载页美化样式
  • 【算法题】数组中只出现一次的两个数字
  • 一款基于 Vue 3 的现代化数据可视化组件库,功能强大,颜值爆表,开发者必备!(带私活源码)
  • MATLAB针对模型外表面画出机械臂喷涂轨迹
  • 1.计算机网络_基本知识
  • jenkins添加新服务
  • Vue2的依赖注入(跨级通信)基本使用
  • 【从零开始的LeetCode-算法】945. 使数组唯一的最小增量
  • 五款最佳免费解压软件APP推荐:手机端高效解压工具盘点
  • SHELL脚本之循环语句的for循环以及中断循环的语句
  • 暖水毯/取暖毯语音识别控制芯片IC方案
  • 使用Verilog设计分频模块(2Hz)
  • 外贸商城源码,进出口跨境电商平台电脑端+移动端网站+客服系统 网站设计及源码输出
  • 基于Java+Springboot+Vue开发的体育用品商城管理系统