字符串初始原理
JVM在启动过程中,有一个类加载的过程,会进行一系列的初始化(包括类的加载,静态变量的初始化)会初始化字符串常量池中。JVM一启动,整个字符串直接全部扫描到字符串常量池中。
源码:
字符串一旦创建是不可变的。
final说明String类不能被继承了
看private final byte[] value;
将"abc"字符串传入,byte数组存储的是Ascll码,97,98,99。数组长度是3,确定的,不可变的。finall修饰的变量指的是一旦指定一个对象,不能指向别的对象,所以说"abc"一旦赋值给vaule,就变不了,只能指向"abc"。
原因总结:String类的底层源码中定义字符串常量,用private final修饰的数组,所以内容和长度一旦赋值均不可变。
final知识点
final
变量:一旦赋值后不可更改。 -
final
方法:不能被子类重写。
final
类:不能被继承。comparable接口
String实现comparable接口,重写了compareTo()方法,表示String类是一个可以比较的类。
参数:该方法接收一个与当前对象同类型的对象作为参数。
返回值:返回负整数:当前对象小于指定对象。
返回零:当前对象等于指定对象。
返回正整数:当前对象大于指定对象。
字符串的拼接
String类常用的构造方法
①char数组转换为字符串②char数组部分转换成字符串
③byte数组转换成字符串,
字节码取值范围:-128~127
小知识点:原码,反码,补码
正数的原码反码补码都是相同的:例如127的三种码都是01111111;
④字节码数组部分转换成字符串
⑤有的时候我们不知道字符集的编码方式,所以用到⑤的构造方法。如果知道编码方式,采用⑥
调用Charset.defaultCharset()方法动态获取平台的编码方式。
⑥可以参考String乱码的截图
⑦不建议使用的
String乱码
乱码的本质:在进行编码和解码没有使用同一个字符编码方式。
编码字符集设定的是UTF-8,解码设定的是JDK,互补相同,所以用到的规则不同,导致乱码。
字符串常用方法
①返回索引处的值
//输出结果为:"点"。
②获取字符串长度
③判断字符串是不是空字符串。
④、⑤判断字符串是否相等。
⑥判断字符串是否包含某个字符串
⑦、⑧判断是否开头结尾
⑨、⑩相对于数组来说,字符串实现了comparable接口。
11~12
输出的结果是:9
从下标10开始找java出现的下标
13~14
和11,12同理
还有其他方法 ,看API帮助文档
正则表达式
常见符号
String正则相关方法