Java中String的解读

在使用Java进行开发时,用到最多的类莫过于String对象了,在jdk1.8之前,其内部使用了char数组来保存字符串信息。到了jdk1.9之后又变成了byte数组。
Java中String的解读_第1张图片
根据上图所知,String类是final修饰的保证了其不可继承,且不可变的,因此它是线程安全的,其中value数组就是用来保存String的值信息的,而hash值主要用于在HashMap中生成Key的。

1,字符串常量池StringPool

在开发中,我们大量的使用了字符串,官方为了提升性能,减少内存占用,就在引入了字符串常量池的概念,相当于设计模中的享元模式,所有的字符串,都会放到常量池中,使用时直接从常量池中取。
如果一个String对象已经创建了,则会从String pool中取的引用,其内部保存着所有的字符串字面量,这些字面量在编译期就已确认。可以通过intern()函数,在运行期过程中将字符串添加到String pool中

2,线程安全

1)String 因使用final修饰,具有不可变性,所以是线程安全的
2)StringBuilder,内部使用了建造者模式,在多线程中使用它进行字符串的拼接,不是线程安全的
3)StringBuffer,内部使用了synchronized的对象锁,所以其是线程安全的
Java中String的解读_第2张图片

3,String的“==”和equals

关于这两个对比,在面试中进程会被问道,“==”比较时,如果是基本类型是比较的是值,引用类型比较的是内存地址,Java中的基本数据类型一共有8种,byte、short、int、long、float、double、char、Boolean。同时为了面向对象操作的一致性,这些基本类型都有相应的封装类型:Integer、Short、Long、Byte、Float、Double、Character等。
在String中的equals是被重写了,比较的是两个对象的字符序列值是否相等。
Java中String的解读_第3张图片
如下图中,只要字符串序列相等,equals的值就永远是true,而等号的结果就不同了。
Java中String的解读_第4张图片
在Java中使用String test = new String (“abc”) 会创建两个对象,其一是字符串常量池中的字面量"abc",其二是,new关键字在堆中创建的一个String对象,所以不要使用或尽量少的使用new的方式,减少对象的创建,降低内存的使用,毕竟大量的使用这种方式导致堆内存膨胀触发GC,导致用户体验不友好(GC时会暂停当前所有执行的线程任务的执行)。

4,字符串的组合StringJoiner

在Java中如果使用字符串加上符号的拼接,可以使用 StringJoiner。

String [] names = ["A","B","C","D"]
StringJoiner sj = new StringJoiner(",")
for(String name:names){
    sj.add(name)
}
System.out.println(sj)
//打印结果
"A,B,C,D"

你可能感兴趣的:(JAVA笔记,java,“==”和equals,String,StringJoiner)