一、字符串的概念(字符串是什么)

java字符串就是Unicode字符序列。java没有内置的字符串类型,而是在标准java类库中提供了一个预定义类,人们自然的就叫做String。

字符串的底层是一个被final修饰的数组,不能改变

1
String s = "java"//等号右边其实就是创建了一个"java"的字符串对象

注意事项:

  • 每次用双引号括起来的字符串都是string类的一个对象。
  • 字符串是常量。他的内容不能改变,他的对象创建也不能更改。

那么肯定就有人疑问什么是Unicode。

1.1Unicode字符

Unicode 是国际标准字符集,它将世界各种语言的每个字符定义一个唯一的编码,以满足跨语言、跨平台的文本信息转换

Unicode 字符集的编码范围是 0x0000 - 0x10FFFF , 可以容纳一百多万个字符, 每个字符都有一个独一无二的编码,也即每个字符都有一个二进制数值和它对应,这里的二进制数值也叫 码点 , 比如:汉字 “中” 的 码点是 0x4E2D, 大写字母 A 的码点是 0x41, 具体字符对应的 Unicode 编码可以查询 Unicode字符编码表

二、字符串的意义(为什么要用字符串)

当我们登录社交软件和游戏时的用户名、密码、验证码等,这些其实都是字符串。同时在登录时还有一系列操作。比如:注册,忘记密码等。

这些在程序员眼里其实都是针对于字符串的操作。如果没有字符串我们用字符数组也能实现,但是太过于复杂,并且浪费时间和空间,所以java就帮我们直接提供了这样的一个类。

三、字符串的用法(字符串怎么用)

在这里我们介绍一些常用的字符串用法。

我们首先想到第一个字符串的用法应该是拼接

3.1字符串的拼接

1
2
3
public static void main(String[] args) {
String s = "abc"+"def";//java语言允许使用+号来实现拼接
}

字符串虽然可以用+号实现拼接,但是如果我要循环1000000次重复拼接,你就会发现程序运行的时间会非常长。

1
2
3
4
5
6
7
public static void main(String[] args) {
String s = "abc";//初始化
for (int i = 0; i < 1000000; i++) {
s = s + "xyz";//重复拼接“xyz”
}
System.out.println(s);
}

那么为什么导致这样呢?

其实是因为字符串每次创建后是不能改变的。每次拼接其实都是新创造一个String对象。循环1000000次相当于创造了1000000个对象,当然运行时长就会更长,效率就会越低。

其实java也为我们想到了这点,所以特地给了我们StringBuilder类。

3.2StringBuilder类

StringBuilder类也叫做字符串缓冲区,其实就是一个存放String类型的容器。可以提高字符串的操作效率(可以看成一个长度可以变化的字符串)。

1
2
3
4
5
6
7
8
9
10
11
public static void main(String[] args) {
//创造了一个stringBuidr的对象
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000000; i++) {
//append方法是stringBuider里的添加方法
//为sb重复拼接“xyz ”
sb.append("xyz");

}
System.out.println(sb);
}

3.2.1StringBuilder类的底层原理

在使用StringBuilder时,内存中会有一个长度为16的数组,,它内容是可以改变的,每当有一个字符就存进一个索引中,不会创建新的字符串,如果存入的字符串超过了默认16的数组长度,它就会进行自动扩容。如此在内存中始终是一个数组,占用的空间少,那么效率也会比String类的要高

知道了底层原理后,我们来看看它的用法。

3.2.2StringBuilder类的用法

刚刚已经讲过了append方法,我们来看看其他的方法。

1、toString() 方法

作用:将一个StringBuilder类型的字符串转换为String类型

1
2
3
4
5
6
7
8
9
public static void main(String[] args) {
//创造对象
StringBuilder sb = new StringBuilder();
//添加字符串
sb.append("我在玩托儿索");
//将StringBuilder类型的字符串转换为String类型
String s = sb.toString();
System.out.println(s);
}

好处:转化为字符串后可以用字符串的成员方法。

2.reverse()方法

作用:将StringBuilder类型的字符串反转

1
2
3
4
5
6
7
8
9
10
11
public static void main(String[] args) {
//创造对象
StringBuilder sb = new StringBuilder();
//添加字符串
sb.append("我在玩托儿索");
//反转
sb.reverse();
//将StringBuilder类型的字符串转换为String类型
String s = sb.toString();
System.out.println(s);
}

在这里再拓展一下,jdk12过后java又定义了一个类叫stringJoiner。

3.3stringJoiner类

stringJoiner类似于stringBuilder,不过前者的构造方法不同。如果大家对构造方法不理解可以看我之前的博客

1
2
3
4
public static void main(String[] args) {
StringJoiner sj1 = new StringJoiner(间隔符号);
StringJoiner sj2 = new StringJoiner(间隔符号,开始符号,结束符号);
}

stringBuiderg构造方法很简单一个是无参的,另一个就是将输入的字符串当做参数的,这里就不过多介绍。

stringJoiner就可以快捷的将各个字符串间隔符号,或者结束或开始符号直接给出,更加高效。

1
2
3
4
5
6
7
8
9
10
11
public static void main(String[] args) {
//创造对象,并且给出间隔符号", ",开始符号"[",结束符号"]"
StringJoiner sj1 = new StringJoiner(", ","[","]");
//添加方法
sj1.add("1");
sj1.add("2");
sj1.add("3");
sj1.add("4");
System.out.println(sj1);
//打印结果为“[1, 2, 3, 4]”
}

3.4字符串的比较

1
2
3
4
5
6
7
8
9
10
11
12
public static void main(String[] args) {
String s1 = "12345abc";
String s2 = "12345abc";
String s3 = "d35f";
String s4 = "D35f";
//比较返回类型为boolean类型,如果俩字符串一样返回true,反之false
boolean result1 = s1.equals(s2);
System.out.println(result1);//true
//该方法可以比较(忽略大小写)
boolean result2 = s3.equalsIgnoreCase(s4);
System.out.println(result2);//true
}

作用:第一种常用于密码用户名比较

第二种常用于验证码比较

3.5字符串的截取

1
2
3
4
5
6
7
8
9
10
11
12
public static void main(String[] args) {
String s1 = "12345abc";
//subtring方法重载了俩种
//只传一个参数的是从该索引到末尾全部截取
String s2 = s1.substring(1);
//传俩个参数的是从该索引截取到后索引的前一位
String s3 = s1.substring(1, 3);
System.out.println(s1);//12345abc
System.out.println(s2);//2345abc
System.out.println(s3);//23

}

注意事项:

  • 第二种截取方法参数包左不包右,包前不包后。

本篇博客就写到这里,我们下篇再见。