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