【几分钟教会你如何使用字符串(包括stringBuider等详细讲解)】
一、字符串的概念(字符串是什么)
java字符串就是Unicode字符序列。java没有内置的字符串类型,而是在标准java类库中提供了一个预定义类,人们自然的就叫做String。
字符串的底层是一个被final修饰的数组,不能改变
ini
String s = "java"//等号右边其实就是创建了一个"java"的字符串对象
注意事项:
- 每次用双引号括起来的字符串都是string类的一个对象。
- 字符串是常量。他的内容不能改变,他的对象创建也不能更改。
那么肯定就有人疑问什么是Unicode。
1.1Unicode字符
Unicode 是国际标准字符集,它将世界各种语言的每个字符定义一个唯一的编码,以满足跨语言、跨平台的文本信息转换
Unicode 字符集的编码范围是 0x0000 - 0x10FFFF , 可以容纳一百多万个字符, 每个字符都有一个独一无二的编码,也即每个字符都有一个二进制数值和它对应,这里的二进制数值也叫 码点 , 比如:汉字 "中" 的 码点是 0x4E2D , 大写字母 A 的码点是 0x41 , 具体字符对应的 Unicode 编码可以查询 Unicode字符编码表
二、字符串的意义(为什么要用字符串)
当我们登录社交软件和游戏时的用户名、密码、验证码等,这些其实都是字符串。同时在登录时还有一系列操作。比如:注册,忘记密码等。
这些在程序员眼里其实都是针对于字符串的操作。如果没有字符串我们用字符数组也能实现,但是太过于复杂,并且浪费时间和空间,所以java就帮我们直接提供了这样的一个类。
三、字符串的用法(字符串怎么用)
在这里我们介绍一些常用的字符串用法。
我们首先想到第一个字符串的用法应该是拼接。
3.1字符串的拼接
typescript
public static void main(String[] args) {
String s = "abc"+"def";//java语言允许使用+号来实现拼接
}
字符串虽然可以用+号实现拼接,但是如果我要循环1000000次重复拼接,你就会发现程序运行的时间会非常长。
ini
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类型的容器。可以提高字符串的操作效率(可以看成一个长度可以变化的字符串)。
arduino
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类型
typescript
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类型的字符串反转
typescript
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,不过前者的构造方法不同。
如果大家对构造方法不理解可以看我之前的博客。
java
public static void main(String[] args) {
StringJoiner sj1 = new StringJoiner(间隔符号);
StringJoiner sj2 = new StringJoiner(间隔符号,开始符号,结束符号);
}
stringBuiderg构造方法很简单一个是无参的,另一个就是将输入的字符串当做参数的,这里就不过多介绍。
stringJoiner就可以快捷的将各个字符串间隔符号,或者结束或开始符号直接给出,更加高效。
csharp
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字符串的比较
ini
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字符串的截取
typescript
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
}
注意事项:
- 第二种截取方法参数包左不包右,包前不包后。
本篇博客就写到这里,我们下篇再见。