【1】直接使用,无需导包
【2】形象说一下字符串的含义:
字符串就代表把字符串起来。
【3】
String str = “abc”;
“abc”就是String类下的一个具体的对象
【4】字符串是不可变的:
【5】这个String类不可以被继承,不能有子类:
【6】字符串底层是一个char类型的数组:
验证:
String类的常用方法
【1】构造器:底层就是给对象底层的value数组进行赋值操作。
源码
本质上都是赋值操作。
【2】常用方法:
【3】equals方法:
源码:
【4】compareTo方法:
String这个类实现了Comparable,里面有一个抽象方法叫compareTo,所以String中一定要对这个方法进行重写:
源码:
.
【6】常用方法:
输出结果:
输出结果:
输出结果:
输出结果:
输出结果:
输出结果:
用谁在调用toString()方法,它会把当前的字面效果返回给你。
输出结构:
输出结果:
String的内存分析
【1】字符串拼接
public class Text02 { public static void main(String[] args) { String s1 = "a"+"b"+"c"; String s2 = "ab"+"c"; String s3 = "a"+ "bc"; String s4 = "abc"; String s5 = "abc"+""; } }
上面的字符串,会进行编译器优化,直接合成并成为完整的字符串,我们可以反编译验证:
然后在常量池中,常量池的特点是第一次如果没有这个字符串,就放进去,如果有这个字符串,就直接从常量池中取:对应的内存分析:
【2】new关键字创建对象:
内存分析:开辟两个空间(1.字符串常量池中的字符串 2.堆中的开辟的空间)
【3】有变量参与的字符串拼接:
a变量在编译的时候不知道a是”abc“字符串,所以不会进行编译期优化,不会直接合并为”abcdef“
反汇编过程:为了更好的帮我分析字节码文件是如何进行解析的:
利用IDEA中的控制台: