String 是和字符串相关的类,这个类是一个final类,表示不可变的字符序列。
public final class String
implements java.io.Serializable, Comparable<java.lang.String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
}
由String的定义可以看出String的值是不可以改变的,底层是一个定义为final的字符数组。下面来验证一下这个不可变性,拿一个普通类和String类进行对比。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o8oyZuHz-1659924489628)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807154755996.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FgFwMxOM-1659924489630)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807155531181.png)]
由上图可知,s1属性值随着s2的改变而变成了18。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Z2f1709-1659924489631)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807155944902.png)]
由上面的图可以看到,s2的值变了,但是s1的值没有变。这就是字符串的不可变性。还有通过连接的方式证明字符串的不可变性。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-96BNGQF4-1659924489632)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807160901934.png)]
本来s1和s2指向同一个字符串对象,s1进行了连接操作,如果是一般的类,此时s2的值是会改变的,但是此时s2没有改变,说明字符串对象具有不可变性。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tKVIp4fU-1659924489633)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/%E5%82%A8%E5%AD%98%E5%8E%9F%E7%90%86.png)]
(ps:图画得比较丑,凑合着理解就好了)
字符串在内存中的解析。
而且字符串常量池是不会存储相同内容的字符串的。一般来说,对于引用数据类型**==**比较的是对象的内存地址,此时s1与s2是相等的,说明此时指向的都是同一个对象,所以字符串常量池是不会存储相同内容的字符串的。

方式一:通过字面量的方式来定义
String s = "hello";
方式二:通过new构造器的方式来定义
String s = new String("hello");
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ivDjUkVU-1659924489635)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807172339666.png)]
这是很常见的String面试题。上面的结论是:
- 常量与常量之间的拼接结果在常量池中,且常量池中不会存在相同内容的常量。
- 只要有一个是变量,那么结果就在堆中。
- 如果拼接的结果调用intern()方法,返回值在常量池中。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oVKDgrpw-1659924489636)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807174740387.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3sjtUZfd-1659924489639)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807175807131.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0iGHF4sq-1659924489639)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807180118878.png)]
值得注意的是,源码中的toLowerCase()方法是最后返回的是new的对象,而不是直接在原字符串中修改。
return new String(result, 0, len + resultOffset);
可能会有面试题会问的:
"HELLO".toLowerCase() == "hello";
这种情况结果是false,因为一个是字面量在常量池中,一个是new String()在堆里面。两个是不会相等的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zV2PiYkv-1659924489640)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807181610241.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KuPcbbXa-1659924489641)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807182225499.png)]
这个方法一般用于用户的输入,避免用户误操作使用的。比如用户在注册时候,按键盘不小心按到了空格键,由于是前导或者后省很难发现,直接将该值弄到数据库中,用户登陆时又会出错。给用户一种很差的体验,所以一般会使用此方法避免用户误操作。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SPkUZrsQ-1659924489642)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807183128724.png)]
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SwYKaLGB-1659924489643)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807213505820.png)]
作用效果和连接符**+**等价。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FV4gXtjo-1659924489644)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807214006047.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p84l5AjY-1659924489645)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807214736053.png)]
这个需要知道的就是左闭右开,左边的索引是包含的,右边的索引是不能包含的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bejXiTvM-1659924489645)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807215149119.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WgnjL6iO-1659924489646)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807215630082.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-faX0qHKi-1659924489646)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807220130297.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YrMa7iNV-1659924489647)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220807220358194.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FShF63gX-1659924489648)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220808080526226.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nS0wpHjp-1659924489648)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220808081618778.png)]
正则表达式需要知道每个代表什么意思,面试的时候别人问你答得出来就行了。不需要死记硬背把每一个正则都背下来,网上所有的正则表达式都有,直接copy就行了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LuOUU6pT-1659924489649)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220808082628322.png)]
笔试中的一道题:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wjhTRwqC-1659924489650)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220808082909575.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6zKlMiic-1659924489650)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220808090317561.png)]
通过调用包装类的parseXXX()方法将字符串转为基本数据类型。然后由于包装类跟基本数据类型之间有自动装箱和自动拆箱。所以也可以直接转换为包装类。

通过调用String类的valueOf()的方式将数变为字符串。
有时候笔试题会比较刁钻,会拿一个float的数来问最后得到的字符串是咋样的:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t5BH90XA-1659924489651)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220808092538542.png)]

通过调用字符串的toCharArray()来讲字符串转换为字符数组。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yf2AlFGw-1659924489652)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220808093131754.png)]
通过使用new创建对象的方式来将字符型数组转为字符串类型。
一般来说,将字符串转为字节数组的过程称为编码,将字节数组转为字符串的过程称为解码。这个一般用于IO流,特别重要!!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uzTYURyo-1659924489653)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220808093952839.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HcDjoo7V-1659924489654)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220808094534570.png)]
可以看到,使用不同的编码集会产生不同的结果。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l4EbA7Rc-1659924489654)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220808094933778.png)]
从右下角可以看到我使用的字符集是utf-8,而编码使用的是GBK。所以导致了乱码的问题。(一般乱码大概率是因为字符集的问题)所以一般在写代码的过程中都会设定字符集,从前端到后端再到数据库都使用相同的字符集,甚至有的设置了默认字符集之后还会在代码中指定用哪种方式编码,哪种解码,降低bug风险。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P9JQ4xjt-1659924489654)(https://cdn.jsdelivr.net/gh/yuzesheng/markdownpictures@main/img/image-20220808100411455.png)]