目录
面试题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 】
- 生成对象的散列码:通过hashcode()可生成对象的散列码(一个32位的整型),散列码可作为对象的一种特征标识,在底层为哈希表的集合中,可用来快速定位对象。
- 提高查找和检索效率,在底层为散列的集合中,通过哈希码,可以快速定位到对象可能存在的位置(O(1)时间复杂度),从而显著减少查找所需要的时间。
- 通过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-------------------------
才疏学浅,谬误难免,欢迎各位批评指正。