1、String类的概念
String类是Java中的一个类,用于表示字符串。它是Java中最常用的类之一,用于处理文本。
2、创建 String 对象的方法
最常用的有以下三种:
2.1、使用常量串构造
String s1 = "hello";
2.2、使用 new String 对象构造
String s2 = new String("hello");
2.3、使用数组进行构造
char[] chars = {'h','e','l','l','o'};
String s3 = new String(chars);
3、字符串常量池
字符串常量池(String Pool)是Java中的一个特殊区域,用于存储字符串常量。在Java中,字符串常量池是在编译过程中就把代码里涉及的字符串常量收集好,等到程序启动,就立刻把这些常量创建好对应的 String 对象,放在一起就构成了 字符串常量池 。
这种存储字符串对象的缓存机制,可以避免重复创建相同内容的字符串对象,提高内存利用率。
4、字符串内存存储
代码示例1:
public class Test {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "hello";
System.out.println(s1==s2);
}
}
这里创建了两个字面值常量 "hello" ,它就会被放在字符串常量池中,而字符串常量池里是不会有重复的,所以这里的 s1 和 s2 实际指向的是一个地址,可以通过 == 来验证
当使用 2.1 创建一个字符串常量时,Java会首先在字符串常量池中查找是否存在相同内容的字符串对象。如果存在,则直接返回该对象的引用;如果不存在,则在常量池中创建一个新的字符串对象,并将其引用返回。
代码实例2
public class Test {
public static void main(String[] args) {
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1==s2);
}
}
当使用 2.2 的方式创建一个字符串常量,程序会开辟的一个新的空间,内容是来自常量池中的一份拷贝,再通过 == 号去判断,可以看到引用的是两个不同的地址(所以这里更推荐使用 2.1 的写法,不容易对空间造成浪费)
由于字符串是不可变的,所以字符串常量池中的字符串对象一旦创建就无法修改。当我们对字符串进行连接、截取等操作时,实际上是创建了新的字符串对象,而原有的字符串对象仍然存在于字符串常量池中。
5、String类的核心方法
5.1 字符串的比较
比较相等关系:
分为两种,一个是对引用地址进行比较(只在学习语法时使用),另一个是对字符串的内容比较是否对应一致,需要使用到 equals 方法
语法格式:
字符串1.equals(字符串2)
//这里的字符串可以是变量名引用的,也可以是字面值常量
//equals 区分大小写
//相等返回ture,不相等返回false
代码示例:
//针对 String 引用进行比较
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1.equals(s2));
//执行结果:true
//针对 String 字面值常量进行比较
String s3 = "hello";
System.out.println(s3.equals("hello"));
//执行结果:true
比较大小关系:
用 compareTo 方法,可以通过 “字典序” 规则,对字符逐一判断
语法格式:
字符串1.compareTo(字符串2)
//比较汉字是无意义的
//返回结果
//<0 字符串1 > 字符串2
//>0 字符串1 < 字符串2
//=0 字符串1 == 字符串2
代码示例:
public class Test {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "hello";
System.out.println("hello".compareTo(s2));
}
}
//运行结果:
//0
public class Test {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "hell";
System.out.println("hello".compareTo(s2));
}
}
//运行结果:
//1
5.2 字符串的查找
主要分为下面三种
给定下标,获取对应的字符( charAt )
字符串1.charAt(字符串2)
代码示例:
public class Test {
public static void main(String[] args) {
String s1 = "hello";
System.out.println(s1.charAt(0));
System.out.println(s1.charAt(1));
}
}
//运行结果:
//h
//e
public class Test {
public static void main(String[] args) {
String s1 = "你好";
System.out.println(s1.charAt(0));
System.out.println(s1.charAt(1));
}
}
//运行结果:
//你
//好
indexOf:查找该字符串中某个子字符串(从左往右)
lastIndexOf:查找该字符串中某个子字符串(从右往左)
语法格式:
字符串1.indexOf(字符串2)
字符串1.lastIndexOf(字符串2)
//查找的子串在字符串中一定是连续的
//当查找到时,返回子串第一个字符所在的下标
//有多个子串时返回第一个子串所在的下标
//没有找到返回-1
代码示例:
public class Test {
public static void main(String[] args) {
String s1 = "abcdef";
System.out.println(s1.indexOf("bc"));
System.out.println(s1.lastIndexOf("bc"));
}
}
//运行结果:
//1
//1
public class Test {
public static void main(String[] args) {
String s1 = "abcabcabc";
System.out.println(s1.indexOf("abc"));
System.out.println(s1.lastIndexOf("abc"));
}
}
//运行结果:
//0
//6
5.3 字符串的转换
5.3.1、数字转字符串
一、Java中 String 的拼接,可以把其他类型自动转成 String
int n = 10;
String s = "" + n;
二、通过 valueOf 方法对字符串转换
valueOf 是 String 的类方法,通过 类名. 的方式进行调用,不需要创建实例
int n = 10;
String s = String.valueOf(n);
5.3.2、字符串转数字
使用 Integer.parseInt 可以转为整数
String s = "10";
int n = Integer.parseInt(s);
也可以转为 Double 类型
String s = "10.5";
Double n = Double.parseDouble(s);
5.3.3、字符串转大写
String s = "abcd";
System.out.println(s.toUpperCase());
5.3.4、字符串转小写
String s = "ABCD";
System.out.println(s.toLowerCase());
5.3.5、字符串转为字符数组
转化方式根据不同单位分为两种
转成字符数组:
public class Test {
public static void main(String[] args) {
String s = "你好";
char[] chars = s.toCharArray();
for(char c : chars){
System.out.println(c);
}
}
}
//运行结果
//你
//好
转成字节数组:
public class Test {
public static void main(String[] args) {
String s = "你好";
byte[] bytes = s.getBytes();
for(byte b : bytes){
System.out.printf("%x\n",b);
//通过十六进制来表示,一个16进制刚好对应一个字节
}
}
}
//运行结果
//e4
//bd
//a0
//e5
//a5
//bd
Java中一个汉字可以通过一个 char 来表示,一个 char 占2个字节,这里打印两个汉字却出来6个字节,这是因为编码方式的不同,使用 char 时,使用了 utf16 来表示,这时就是占2个字节,当字符串转成字节数组是,则使用 utf8 来进行表示,所以是3个字节
5.3.6、格式化字符串
让字符串使用特定格式输出
一、printf
int x = 10;
System.out.printf("x=%d",x);
二、format
int x = 10;
String s = String.format("x = %d\n",x);
System.out.println(s);
5.4 字符串的替换
replace:替换字符串中所有的字符
String s = "张同学,张同学";
System.out.println(s.replace('张','王'));
System.out.println(s.replace("张同学","王老师"));
//运行结果
//王同学,王同学
//王老师,王老师
replaceFirst:替换找到的第一个字符串
String s = "张同学,张同学";
System.out.println(s.replaceFirst("张","王讯"));
//运行结果
//王迅同学,张同学
5.5 字符串拆分
指定一个分隔符号,把一个字符串拆成多个部分,得到一个字符串数组
String s = "张同学,王同学,陈同学";
String[] students = s.split(",");
for(String student : students){
System.out.println(student);
}
//运行结果
//张同学
//王同学
//陈同学
当修改参数为"."时,就不会有任何的打印
String s = "张同学.王同学.陈同学";
String[] students = s.split(".");
for(String student : students){
System.out.println(student);
}
//运行结果
这是因为 split 传入的形参是 regex (正则表达式),是一种特殊的字符串,其中包含了一些特殊的字符,这些特殊字符有特定的含义,描述了字符串的“一系列特征”,“,后续就可以通过正则表达式这样的字符串来匹配其他的字符串
. ” 就是正则表达式中的特殊字符,要想使用原始的 " . " ,就需要进行转义
在Java中的字符串常量中,转义字符还需要被转义一下,也就是 \\
5.6 字符串截取
使用 substring 方法进行拆分,主要分为两种
String substring(int beginIndex) //从指定位置截取到末尾
String s = "abcdefg";
System.out.println(s.substring(2));
//运行结果
//cdefg
String substring(int beginIndex,int endIndex)
//截取指定区间[beg,end)
String s = "abcdefg";
System.out.println(s.substring(2,5));
//运行结果
//cde
5.7 去除左右两边的空白符
使用 trim 方法,可以去掉空格、换行、回车、制表等等,不会影响中间的空白符
String s = " hello \f \n \t ";
System.out.println(s.trim());
//运行结果
//hello
5.8 intern 方法
手动把字符串添加到常量池中
//这里创建的常量并不会添加到常量池里
String s = new String("hello");
//可以通过 == 来进行判断
System.out.println(s == "hello");
//运行结果
//false
这个时候就可以使用 intern 方法
String s = new String("hello");
String s2 = s.intern();
System.out.println(s2 == "hello");
//运行结果
//true
6、字符串的不可变性
注意:String 中的所有方法,都不会修改 String 本身,能修改的只有引用的位置
String类并没有提供任何一个 public 的,用来修改 value 数组的内容的方法
7、字符串修改
Java 还提供了另一个可变的字符串 StringBuilder ,用法和 String 非常相似,可以方便的和 String 相互转换