Java重修笔记 第三十二天 String类
String类特性
1. 一个字符占两个字节,不管是英文还是中文
2. 字符串本质是由字符数组存储的一组数据 private final char value[];
由双引号所定义的字符串对象,在内存层次上其引用直接指向底层常量池中的内存地址;当该地址不存在时,则会自动创建
由JavaScript新操作符new生成的字符串对象,在内存分配过程中会在堆内存中为该字符串对象预留一个存储空间,并将其引用与之绑定;其中包含一个名为value的数组属性,在该数组内部存放着与字符相关的数据;这个数组引用将指向底层常量池中的对应地址;若常量池中不存在对应的资源,则会自动生成相应的数据单元以满足需求
5. 当两个双引号引用的String对象进行相加操作时(例如,在代码中使用如String str = "abc" + "def";的情况下),编译器会将其优化为一个单独的字符串(例如 String str = "abcdef";)。因此,在方法区只会创建一个单独的对象。
当发生两个字符串常量进行连接操作时(即相加)的情况下,则会先生成一个空StringBuilder实例,并通过调用其append方法将两个字符串逐个添加进去。随后系统会自动调用String构造器将该StringBuilder转换为一个新的完整String对象。整个过程中总共会产生三个独立的对象:即初始的StringBuilder实例、存储在内存中的最终结果String对象以及该对象内部的字符数组指针指向的方法区标识符"abcdef"的对象
由于String类内部存储的是字符串常量,在每次进行字符串更新操作时都需要为新字符串预先分配空间(通过new StringBuild和new String对象),这使得大批量String字符串的拼接操作在性能上显得不够理想。不过,在实际应用中使用String类来进行配置文件的配置或表示固定常量值等方面仍然非常便捷
String类的常用方法
1. public boolean equals(Object anObject)
忽略大小写的区分情况下
2. public boolean equalsIgnoreCase(String anotherString)
不区分大小写,其余和equals方法相同
3. public int indexOf(String str, int fromIndex)
在字符串中从指定起始位置fromIndex开始搜索特定字符序列,并返回其首次出现的位置索引。如果未找到,则返回-1。
4. public int lastIndexOf(String str, int fromIndex)
在目标子串中被查询结果为末次出现的位置,并在截止位置fromIndex之前进行查找;如果未找到则返回-1
5. public String substring(int beginIndex)
返回指定索引beginIndex开始到结束的字符串
6. public String substring(int beginIndex, int endIndex)
返回指定索引beginIndex开始到endIndex - 1的字符串,左开右闭
7. public String toUpperCase()
将字符串转换为大写返回
8. public String toLowerCase()
将字符串转换为小写返回
9. public String concat(String str)
将字符串拼接在末尾后返回
10. public String replace(CharSequence target, CharSequence replacement)
将老字符串替换为新字符串后返回,但对源字符串对象不产生影响
11. public String[] split(String regex)
将字符串分割并返回
12. public char[] toCharArray()
将字符串转换为字符数组
13. public int compareTo(String anotherString)
比较两个给定的字符串S1和S2时,在以下情况下计算它们之间的差异:当S1等于S2时结果返回0;当两者的前缀完全相同时结果返回这两个字符串长度之差;当两者的前缀存在差异时结果返回这两个字符串在Unicode编码下的差异。
14. public static String format(String format, Object... args)
占位符%s表示字符串类型;占位符%d标识整数值;占位符%.2用于表示双精度浮点型数值,并且经过四舍五入处理至小数点后两位;占位符%c标识字符类型
