String为什么要设计成不可变?
主要有以下几点原因:
-
为了线程安全。同一个字符串实例可以被多个线程共享
-
字符串支持hash映射和缓存。因为String的hash值经常会使用到,比如作为 Map集合中的键,不可变的特性使得 hash 值也不会改变,不需要重新计算。
-
出于安全考虑。网络地址URL、文件路径path、密码通常情况下都是以String类型进行保存,假若String可变,将会引起各种安全隐患。
String的equals() 和 Object的equals() 有何区别?
Object
的 equals
方法如果不重写,比较的是对象的内存地址
String
中的 equals
方法是被重写过的,比较的是 String 字符串的值是否相等。
String, StringBuffer 和 StringBuilder区别
1. 可变性
String 不可变
StringBuffer 和 StringBuilder 可变
2. 线程安全
String 不可变,因此是线程安全的
StringBuilder 不是线程安全的
StringBuffer 是线程安全的,内部使用 synchronized 进行同步
什么是StringJoiner?
StringJoiner是 Java 8 新增的一个 API,它基于 StringBuilder 实现,用于实现对字符串通过分隔符拼接的场景。
StringJoiner 有两个构造方法,第一个构造要求依次传入分隔符、前缀和后缀。第二个构造则只要求传入分隔符即可。
String类的常用方法有哪些
indexOf():返回指定字符的索引。
charAt():返回指定索引处的字符。
replace():字符串替换
split():分割字符串,返回一个分割后的字符串数组。
equals():比较两个字符串是否相等
getBytes():返回字符串的 byte 类型数组。
length():返回字符串长度。
toLowerCase():将字符串转成小写字母。 toUpperCase():将字符串转成大写字符
substring():截取字符串
equals():字符串比较
String s1 = new String(“abc”);这句话会创建几个字符串对象?
取决于字符串常量池中是否有对象“abc”的引用
如果字符串常量池中不存在字符串对象“abc”的引用,那么它会在堆上创建两个字符串对象,其中一个字符串对象的引用会被保存在字符串常量池中。
如果字符串常量池中已存在字符串对象“abc”的引用,则只会在堆中创建 1 个字符串对象“abc”。
什么是字符串常量池?
字符串常量池用来存储字符串常量。
在创建字符串时,JVM首先会检查字符串常量池,如果该字符串已经存在池中,则返回其引用,如果不存在,则创建此字符串并放入池中,并返回其引用