String

String

  1. String s=“1231”;
  2. String s2=“1231”
  3. s和s2都保存了方法区常量池中的“1231”的内存地址
  4. 所以== 为true
  5. String s= new String(“123”);
  6. String s1=new String(“123”);
  7. 一共创建三个对象,常量池中有一个"123",堆内存地址中分别有两个“123”对象
  8. 所以== 为false,但是由于String 重写了equals方法,只用比较值是否相等,所以equals为true

1、new了几个对象

image-20200702091001939

2、频繁拼接字符串带来的影响

image-20200702093036459

3、为什么String是不可变的而StringBuffer是可变的

  1. String是由一个byte[]数组实现的,前面用final修饰后成为了不可变的数组
  2. StringBuffer也是由一个byte[]数组实现的,但是当它的容量增加时,会调用数组的克隆重新将数组进行复制并扩大其容量

4、如何优化StringBuffer

  1. 在创建stringBuffer的时候就给定一个合适的初始化容量(稍大也可以)。
  2. 将少数组的扩容次数。提高程序的执行效率

5、StringBuffer与stringBuilder的区别

  1. StringBuffer是线程安全的、stringBuilder是线程不安全的
  2. 他们初始化的大小都是16
  3. StringBuilder适合单线程频繁追加操作
  4. StringBufferS适合多线程频繁追加操作

6、总结:

image-20200702104448292

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值