Java中的String类作为存储和操作文本数据的基本类型,是开发过程中最常用的类型。
String类型的声明及初始化与基本数据类型非常相似:
String name = "lcy";
但是String类型是引用类型,有着非常丰富的处理字符串的方法。正是因为其重要性,Sun公司针对String类型做了很多优化,使得String类型使用起来非常灵活、高效、简单。
作为Java程序员,不仅要掌握String类型的用法,还应该深入原理,领略其设计之妙和设计之美。
一,String介绍
1,初识String
官网API文档
-
String
类位于java.lang
包下,使用这个包下的类时,无需用import
显式导入 -
String
类被定义为final
类型,不能被继承,其方法不能被重写
Java中的String
类型实现了几个关键接口,这些接口赋予了String
特定的功能和行为,具体包括: -
实现了
Serializable
接口,表明String
对象是可以被序列化的,即它可以被转换成一系列字节,保存到磁盘上或通过网络进行传输,之后还能恢复成原来的状态 -
实现了
CharSequence
接口,这使得String对象具备处理组成字符串的单个字符的能力 -
实现了
Comparable
接口,String
对象可以直接与其他String
对象进行自然排序(基于字典顺序)。这使得字符串可以直接用于排序算法中,或者存储在需要排序的集合(如TreeSet
、TreeMap
)里,而无需额外提供比较器
这些接口的实现使得String
不仅能够作为基本的文本载体,还能够在更广泛的上下文中发挥功能,比如参与序列化操作、在泛型算法中作为字符序列被操作,以及在需要比较和排序的场合自动排序,体现了其设计的通用性和实用性。
2,不可变的字符串对象
API文档上明确说明String objects are immutable
,即字符串对象是不可变的,应该如何理解不可变
呢?
创建字符串对象后,字符串的值不能被修改
,String
不提供任何方法修改字符串的值。如下图,字符串对象创建后,堆内存中存储了字符串lcy
,那么除非整个对象被垃圾回收,否则无法通过String
的API
修改内存中的值,值始终都是lcy
。
有的同学会举分离,下面的代码可以改变字符串的值,你怎么解释呢?
name = name + " hello";
System.out.println(name);// 输出 lcy hello
上面代码表面上改变了name
的值,实际上 name + " hello"
这行代码会创建一个新对象,name
变量指向新对象002
,原来的对象001
是没有被修改的:
二,String方法
1,构造字符串对象
String类提供的构造方法比较多,常见的有以下几种:
1.1 字面量
通过字面量创建一个字符串对象:
String str = “Hello Java”;
1.2 空构造函数
String str = new String();
该字符串对象的值为空字符串"".
1.3 通过字符数组构造
char[] chars = {'H', 'e', 'l', 'l', 'o'};
String str = new String(chars);
1.4 通过字符数组的一部分构造
char[] chars = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd'};
String str = new String(chars, 0, 5); // 取前5个字符
1.5 通过字节数组构造
byte[] bytes = {72, 101, 108, 108, 111}; // ASCII编码的"Hello"
String str = new String(bytes);
2,遍历
for(char c : str.toCharArray()) {System.out.println(c);
}
3,截取
String subStr = str.substring(0, 5); // 获取前五个字符
4,替换
String replaced = str.replace("World", "Java"); // 将"World"替换为"Java"
5,查找
int index = str.indexOf("World"); // 返回"World"首次出现的位置
6,比较
boolean isEqual = str.equals("Hello, World!"); // 比较内容是否相等