Java常用类String&StringBuilder
目录
String类
1、String概述
String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。 字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。
String的成员变量
String的构造方法
2、创建字符串对象方式
直接赋值方式创建对象是在方法区的常量池
通过构造方法创建字符串对象是在堆内存
. 内存图分析
构造方法实例化方式的内存图:String str = new String("Hello");
当我们再一次的new一个String对象时:
两种实例化方式的区别
1. 直接赋值(String str = "hello"):只开辟一块堆内存空间,并且会自动入池,不会产生垃圾。
2. 构造方法(String str= new String("hello");):会开辟两块堆内存空间,其中一块堆内存会变成垃圾被系统回收,而且不能够自动入池,需要通过public String intern();方法进行手工入池。
3. 在开发的过程中不会采用构造方法进行字符串的实例化。
String类对象一旦声明则不可以改变;而改变的只是地址,原来的字符串还是存在的,并且产生垃圾
3、String常用的方法
1、String的判断
2、String的截取
3、String的转换
4、其他方法
4、String的不可变性
String不可变的好处
- 可以实现多个变量引用堆内存中的同一个字符串实例,避免创建的开销。
- 我们的程序中大量使用了String字符串,有可能是出于安全性考虑。
- 大家都知道HashMap中key为String类型,如果可变将变的多么可怕。
- 当我们在传参的时候,使用不可变类不需要去考虑谁可能会修改其内部的值,如果使用可变类的话,可能需要每次记得重新拷贝出里面的值,性能会有一定的损失。
5、字符串常量池
常量池表(Constant_Pool table)
Class文件中存储所有常量(包括字符串)的table。这是Class文件中的内容,还不是运行时的内容,不要理解它是个池子,其实就是Class文件中的字节码指令。
运行时常量池(Runtime Constant Pool)
JVM内存中方法区的一部分,这是运行时的内容。这部分内容(绝大部分)是随着JVM运行时候,从常量池转化而来
字符串常量池(String Pool)
这部分也在方法区中,但与Runtime Constant Pool不是一个概念,String Pool是JVM实例全局共享的,全局只有一个。
StringBuilder 和 StringBuffer
1、概述
StringBuilder 是一个可变的字符序列。它继承于AbstractStringBuilder,实现了CharSequence接口。
StringBuffer 也是继承于AbstractStringBuilder的子类;但是,StringBuilder和StringBuffer不同,前者是非线程安全的,后者是线程安全的。
查看源码及API文档
2、常用方法
1、insert
2、append
3、replace
4、delete
5、index
6、其他API
3、StringBuffer
和StringBulider用法差不多
4、小结
String、StringBuffer、StringBuilder之间的区别
String 字符串常量
StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)
在大多数情况下三者在执行速度方面的比较:StringBuilder > StringBuffer > String
对于三者使用的总结:
- 如果要操作少量的数据用 = String
- 单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
- 多线程操作字符串缓冲区 下操作大量数据 = StringBuffer