字符串常量池
- 赋值一个字符串字面量时,JVM将首先检查字符串是否在字符串常量池中,存在将返回对现有对象的引用,并不是创建对象
String s1 = "Harry Potter";
String s2 = "The Lord of the Rings";
String s3 = "Harry Potter";
s1==s3; // true s1, s3 都是对字符串常量池的引用
- 当我们通过new 关键字创建的字符串时,都会在java堆中创建新的字符串对象 并且不会检查该对象是否在字符串常量池中
String.intern
intern 的作用 主动将常量池中还没有的字符串对象放入池中,并返回对象地址
String s5 = new String("好好学习").intern();
String s6 = "好好学习";
String s7= new String("天天向上");
String s8 = "天天向上";
System.out.println(s5==s6); // true
System.out.println(s7==s8); // false
字符串拼接
- 编译器优化
// 都是常量,前端编译期会进行代码优化
// 通过idea直接看对应的反编译的class文件,会显示 String s1 = "abc"; 说明做了代码优化
String s1 = "a" + "b" + "c";
String s2 = "abc";
// true,有上述可知,s1和s2实际上指向字符串常量池中的同一个值
System.out.println(s1 == s2);
字符串的常用方法
indexOf():返回指定字符的索引
charAt():返回指定索引处的字符
replace():字符串替换
trim():去除字符串两端空白
split():分割字符串,返回一个分割后的字符串数组
getBytes():返回字符串的 byte 类型数组
length():返回字符串长度
toLowerCase():将字符串转成小写字母
toUpperCase():将字符串转成大写字符
substring():截取字符串
equals():字符串比较
编码
ASCII
GBK 两个字节表示汉字
Unicode
UTF-8 用1个字节 表示英文字符 3个字节表示汉字