栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java中String的解析

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java中String的解析

在使用Java进行开发时,用到最多的类莫过于String对象了,在jdk1.8之前,其内部使用了char数组来保存字符串信息。到了jdk1.9之后又变成了byte数组。

根据上图所知,String类是final修饰的保证了其不可继承,且不可变的,因此它是线程安全的,其中value数组就是用来保存String的值信息的,而hash值主要用于在HashMap中生成Key的。

1,字符串常量池StringPool

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

2,线程安全

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

3,String的“==”和equals

关于这两个对比,在面试中进程会被问道,“==”比较时,如果是基本类型是比较的是值,引用类型比较的是内存地址,Java中的基本数据类型一共有8种,byte、short、int、long、float、double、char、Boolean。同时为了面向对象操作的一致性,这些基本类型都有相应的封装类型:Integer、Short、Long、Byte、Float、Double、Character等。
在String中的equals是被重写了,比较的是两个对象的字符序列值是否相等。

如下图中,只要字符串序列相等,equals的值就永远是true,而等号的结果就不同了。

在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"
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/886188.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号