java知识面试day3
1. 2个integer用==比较不相等的原因

观察源码:
Integer创建的对象,如果是在-129-127之间,会放入缓存中,下次再使用时候从缓存取出。
2.String为什么不可变
观察源码可得:字符串通过final的char数组进行储存。且是不提供任何append这样的操作方法。对原本的字符串进行操作实际就是在堆内存中建立新对象然后指向它。

这样做的理由:
- 线程安全。同一个字符串会被多个线程共享,因为字符串不可变,所以线程是安全的。
- 字符串常量优化,String字符串创建后,会在字符串常量池池缓存,下次再建立同样的对象时候,直接返回缓存的引用。
3.jdk9后为什么将String的底层原理由char[]改成byte[]
为了节约String占用的内存。每个char占据2字节,如果字符串仅需要2字节,也按照2字节分配,出现浪费内存。jdk9之后,对于每个字符串,会判断是不是latin-1字符,是则按照1字节,不是则按照2字节。
4.什么是StringJoiner
StringJoiner是java8新增的一个api,基于StringBuilder实现,用于实现字符串加分隔符的拼接场景。

5.介绍String的常用方法
- indexOf 返回指定字符的索引
- charAt返回指定索引处的字符
- split分隔字符串
- toLowerCase,UperCase转为大写和小写
- SubString 截取字符串
- replace:字符串替换
6.new String("dabin")会创建几个对象
前提字符串常量池中没有
没有的话会在字符串常量池建立一个,然后在堆建立一个,字符串指向的是堆中的。
如果是String s=“abc"则是直接在字符串常量池中建立一个对象。两者是有区别的。
7.介绍字符串常量池
用于储存所有字符串的字面量,这些字面量在编译时期就确定,字符串常量池储存在堆中,所以会具有线程之间的共享。
8.String的最大长度是多少
String提高了一个length方法,返回值为int类型,而int的取值上限为2-32-1.此时是用char维护,一个char2字节,则占用空间会是4gb。但是当String在常量池中,其长度就是无符号的16位也就是2-16-1
9.Object常用方法有哪些
- toString() 默认输出对象的地址
- equeal() 默认比较2个引用对象是否指向同一个内存地址
- clone() 是复制对象的引用,获得了对象副本
10.深拷贝和浅拷贝
拷贝对象和原始对象的引用类型指向的是同一个对象

深层拷贝

11.两个对象的hashcode相同,equals是否为true
如何equals返回true则hashcode一定相同,如果hashCode相同,它们不一定相同。但可以通过hashcode提高效率。
12.为什么重写equals一定要重写hashCode
一般的equals也是直接比较地址,String是特殊的。
为了保证equals在比较内容情况下返回true,要保证hashcode的值也是true。这样当对象作为键保存到hashMap中,可以通过hashcode完成正确的映射
13.JAVA创建对象有几种方法
- 通过new语句
- 通过反射,使用ClassInstance创建对象
- 调用对象的clone方法
- 通过反序列化。调用java.io.ObjectInputStream对象的readObject()方法。
14.说说类实列化的顺序
1.静态属性,静态代码块
2.普通属性,普通代码块
3.构造方法
15.equals和==的区别
对于基本数据类型,比较的是他们的值,基本数据类型没有equal的方法。对于符合数据类型,比较的是2者的地址值

浙公网安备 33010602011771号