字符串详解
一、字符串的概念(字符串是什么)
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 | public static void main(String[] args) { |
字符串虽然可以用+号实现拼接,但是如果我要循环1000000次重复拼接,你就会发现程序运行的时间会非常长。
1 | public static void main(String[] args) { |
那么为什么导致这样呢?
其实是因为字符串每次创建后是不能改变的。每次拼接其实都是新创造一个String对象。循环1000000次相当于创造了1000000个对象,当然运行时长就会更长,效率就会越低。
其实java也为我们想到了这点,所以特地给了我们StringBuilder类。
3.2StringBuilder类
StringBuilder类也叫做字符串缓冲区,其实就是一个存放String类型的容器。可以提高字符串的操作效率(可以看成一个长度可以变化的字符串)。
1 | public static void main(String[] args) { |
3.2.1StringBuilder类的底层原理
在使用StringBuilder时,内存中会有一个长度为16的数组,,它内容是可以改变的,每当有一个字符就存进一个索引中,不会创建新的字符串,如果存入的字符串超过了默认16的数组长度,它就会进行自动扩容。如此在内存中始终是一个数组,占用的空间少,那么效率也会比String类的要高
知道了底层原理后,我们来看看它的用法。
3.2.2StringBuilder类的用法
刚刚已经讲过了append方法,我们来看看其他的方法。
1、toString() 方法
作用:将一个StringBuilder类型的字符串转换为String类型
1 | public static void main(String[] args) { |
好处:转化为字符串后可以用字符串的成员方法。
2.reverse()方法
作用:将StringBuilder类型的字符串反转
1 | public static void main(String[] args) { |
在这里再拓展一下,jdk12过后java又定义了一个类叫stringJoiner。
3.3stringJoiner类
stringJoiner类似于stringBuilder,不过前者的构造方法不同。
如果大家对构造方法不理解可以看我之前的博客。
1 | public static void main(String[] args) { |
stringBuiderg构造方法很简单一个是无参的,另一个就是将输入的字符串当做参数的,这里就不过多介绍。
stringJoiner就可以快捷的将各个字符串间隔符号,或者结束或开始符号直接给出,更加高效。
1 | public static void main(String[] args) { |
3.4字符串的比较
1 | public static void main(String[] args) { |
作用:第一种常用于密码用户名比较
第二种常用于验证码比较
3.5字符串的截取
1 | public static void main(String[] args) { |
注意事项:
- 第二种截取方法参数包左不包右,包前不包后。
本篇博客就写到这里,我们下篇再见。