文章目录
- 一、String 类概述
- 二、String 创建对象的方式
- 2.1 创建对象的两种方式
- 2.2 面试:两种方式的区别 ★
- 2.3 常见面试题 ★
- 三、String 类常用方法
- 3.1 字符串内容比较
- 3.2 常用 API:遍历、截取、替换、分割
- 四、StringBuilder 字符串操作类
- 4.1 构造器
- 4.2 常用方法
- 4.3 String 拼接字符串原理 ★
- 4.4 StringBuilder 提高效率原理图
一、String 类概述
java.lang.String 类代表字符串,它定义的变量可以指向一个字符串对象。同时 String 类提供了很多操作字符串的功能,我们可以直接使用。
String 是不可变字符串:String 变量每次的修改其实都是产生并指向了新的字符串对象,而原来的字符串对象都是没有改变的,所以称不可变字符串。
如下方程序,首先在字符串常量池中,创建 “传智” 对象,并指向该对象。当执行 name+=“教育” 时,首先在常量池中创建 “教育” 对象,并将 “传智” 与 “教育” 两个对象拼接生成 “传智教育” 对象,并指向该对象。以此类推…
每当用 + 符号,拼接生成新的字符串时,原来的字符串都没有改变,因此 String 是不可变字符串。
二、String 创建对象的方式
2.1 创建对象的两种方式
-
方式一:直接使用 " " 定义(推荐方式)
String name = “黑马”;
-
方式二:通过 String 类的构造器创建对象
2.2 面试:两种方式的区别 ★
- 双引号 " " 给出的字符串对象,存在于堆内存中的常量池中,相同内容只会存储一份。
- new 字符串对象,每new一次都会在堆内存中产生一个字符串对象。
2.3 常见面试题 ★
-
下列代码的运行结果是?
String s2 = new String(“abc”);
:先去常量池中创建对象,然后再通过 new 创建对象。
String s1 = “abc”;
:由于常量池中有对象,所以不需创建对象。
扩展: 若先执行String s1 = “abc”;
,再执行String s2 = new String(“abc”);
,则 s1 与 s2 分别创建一个对象。
-
下列代码的运行结果是?
s3 不在常量池中,即不是双引号直接给出的,不会放在常量池中。
扩展: 程序总共创建五个对象,其中常量池中分别有:“abc”、“ab”、“c”,不在常量池中String类型变量 “abc” 以及 StringBuilder 类型变量 “abc”。(具体看后文)
- 下列代码的运行结果是?
java 存在编译优化机制,程序在编译时,自动将 “a”+“b”+“c” 直接转换成 “abc”。
三、String 类常用方法
3.1 字符串内容比较
== 判断字符串对象是判断地址的,这样会引起很多业务问题。推荐使用 equals 方法比较:
注:基本数据类型用 == 比较。
3.2 常用 API:遍历、截取、替换、分割
举例:
String str = "abcdefg";
String s1 = "cde";
String s2 = "ggg";
String replaceStr = str.replace(s1, s2);
System.out.println(replaceStr); // abgggfg
四、StringBuilder 字符串操作类
StringBuilder 是一个可变的字符串的操作类,我们可以把它看成是一个对象容器。
作用:提高字符串的操作效率,如拼接、修改等。
4.1 构造器
4.2 常用方法
4.3 String 拼接字符串原理 ★
String 拼接字符串底层使用的是 StringBuilder。在拼接前,首先会在堆内存中创建 StringBuilder 对象,然后调用 toString 方法将 StringBuilder 转换为 String,并赋值给 String 类变量。
4.4 StringBuilder 提高效率原理图
对比 String ,StringBuilder 在拼接字符串时,其不会去创建额外对象,而是在原来的地址中进行动态添加。
结论:当需要进行字符串操作的时候,应该选择 StringBuilder 来完成,性能更好。
注意:StringBuilder 只是拼接字符串的手段,最终的目的还是要恢复成 String 类型。
StringBuilder stb = new StringBuilder();
String str = stb.toString();
文章参考:Java入门基础视频教程,java零基础自学就选黑马程序员Java入门教程(含Java项目和Java真题)