首页 > 其他 > 详细

String StringBuffer StringBuilder hashcode equal 的区别

时间:2020-05-31 14:46:15      阅读:50      评论:0      收藏:0      [点我收藏+]

String StringBuffer StringBuilder hashcode equal

String StringBuffer StringBuilder 的区别

  • String StringBuffer StringBuilder
    • 都是 final 类, 都不允许被继承
    • String 长度是不可变的, StringBuffer、StringBuilder 长度是可变的
    • StringBuffer 是线程安全的, StringBuilder 不是线程安全的, 但是它们两个中的所有方法都是相同, StringBuffer在StringBuilder的方法上添加了 synchronized 修饰, 保证线程安全
    • StringBuilder 比 StringBuffer 拥有更好的性能
    • 如果一个String 类型的字符串,在编译时就可以确定是一个字符串常量,则编译完成之后,字符串会自动拼接成一个常量,此时String的速度比StringBuffer 和StringBuilder 的性能好的多。

String 不可变?

1、String不可变? final?

  • final
    • 首先因为 String 不可变,如果String 不是final,那么就可以有子类继承String 类,然后子类覆盖其方法,使得这些方法修改字符串,这样就违背了String 的不可变性。
  • 不可变原因
    • 提高效率: 比如一个字符串 String s1 = “abc” , “abc” 被放到常量池里面去了,再定义一个变量 s2 = “abc” 并不会复制字符串“abc”, 只会多个引用指向原来那个常量,这样就提高了效率,而这一前提就是 string 不可变, 如果可变,那么多个引用改变字符串,然后其他引用指向同一个字符串常量,我就可以通过一个引用改变字符串,然后其他的引用就被影响了。
    • 安全: string 常被用来表示 url, 文件路径
    • string 不可变, 那么他的hashcode 就一样,不用每次都重新计算了
  • String不变性的理解
    • String 类是被 final进行修饰的, 不能被继承
    • 在用 + 号连接字符串的时候会创建新的字符串
    • String s = new String(“Hello world”); 可能创建两个对象,也可能创建一个对象,如果静态区中有 “Hello world” 字符串常量对象的话,则仅仅在堆中创建一个对象,如果静态区中没有“Hello world” 对象,则堆上和静态区中都需要创建对象
    • 在Java 中, 通过使用 + 符号来串联字符串的时候,实际上底层会转换成通过 StringBuilder 实例的 append()方法实现。

String 中的 hashcode 以及 toString

  • String 重写了Object 类的 hashcode 和 toString 方法
  • 当 equals 方法被重写时,通常有必要重写 hashCode方法,以维护HashCode方法的常规协定。
  • 重写equals不重写hashcode会出现什么问题
    • 在存储散列集合时(Set), Map中存了两个数值一样的key,这个问题很严重。所以在重写equals方法的时候,一定要重写hashCode方法。

在 Java 中, 通过使用 “+” 符号来串联字符串的时候, 实际上底层会转成 StringBuilder 实例的 append() 方法来实现

String StringBuffer StringBuilder hashcode equal 的区别

原文:https://www.cnblogs.com/ytcxy/p/12997317.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!