String
- String s=“1231”;
- String s2=“1231”
- s和s2都保存了方法区常量池中的“1231”的内存地址
- 所以== 为true
- String s= new String(“123”);
- String s1=new String(“123”);
- 一共创建三个对象,常量池中有一个"123",堆内存地址中分别有两个“123”对象
- 所以== 为false,但是由于String 重写了equals方法,只用比较值是否相等,所以equals为true
1、new了几个对象
2、频繁拼接字符串带来的影响
3、为什么String是不可变的而StringBuffer是可变的
- String是由一个byte[]数组实现的,前面用final修饰后成为了不可变的数组
- StringBuffer也是由一个byte[]数组实现的,但是当它的容量增加时,会调用数组的克隆重新将数组进行复制并扩大其容量
4、如何优化StringBuffer
- 在创建stringBuffer的时候就给定一个合适的初始化容量(稍大也可以)。
- 将少数组的扩容次数。提高程序的执行效率
5、StringBuffer与stringBuilder的区别
- StringBuffer是线程安全的、stringBuilder是线程不安全的
- 他们初始化的大小都是16
- StringBuilder适合单线程频繁追加操作
- StringBufferS适合多线程频繁追加操作
6、总结:
7、重写toString方法的原因
- 不写:输出对象的内存地址。
- 写了:输出对象的值
8、hashCode
- 不重写则new一个对象就是他的存储地址。new一百个就是一百个hashCode
- 重写后,经过特殊的算法可以使相同内容的对象的hashCode相等
9、hashCode与equals
- 在Object类中
- hashCode返回的是地址值
- equals比较的也是地址值
- 在其他对象中
- 没有重写hashCode与equals方法时,会直接继承Object类中的方法
- 重写后:
- 两个对象,equals相等,那么他们的hashCode一定相等
- 两个对象,equals不相等,不能说明hashCode一定不相等
- 如果重写equals不重写hashCode
- 会造成equals永远是false,因为当你每new一个对象,就会开辟新的内存空间,而判断两个对象是否相等,是先判断hashCode值是否相等,当你没有重写的时候,它返回的是内存地址。所以一定为false