一、简图
二、类加载器子系统
1、加载
(1)获取定义此类的二进制流
(2)将字节流代表的静态存储结构转化成方法区的数据结构
(3)内存中生成一个代表类的class对象
2、连接
(1)验证
保证被加载类的正确性,不会危害虚拟机自身,主要包括:文件格式验证、元数据验证、字节码验证、符号引用验证
(2)准备
为变量分配内存和设置默认值,常量在编译时就会显示初始化(final修饰)
(3)解析
将符号引用转换成直接引用
3、初始化
执行类构造器方法clinit(),不需要定义
String-- jdk1.7后 字符串常量池 放在堆空间中
1、new String("ab")会创建几个对象 -- 2个
一个对象- new出来的
另一个对象常量池中
2、new String("a") + new String("b")会创建几个对象
对象1 new StringBuffer()
对象2 new String("a");
对象3 常量池a
对象4 new String("b");
对象5 常量池b
对象6 常量 new String("ab")
toString() 的调动- 再常量池中不生成对应字符
String str1 = new String("1");//常量池中已经存在“1”
str1.intern();
String str2 = "1";
System.out.println(str1 == str2);//false
String str3 = new String("1") + new String("1");//字符串常量池中不存在 “11”
str3.intern();//常量池中生成“11"
String str4 = "11";//1.7以后 常量池中没有创建“11”,而是创建一个对象引用 new String("11")的对象
System.out.println(str3 == str4);//true
3、intern() - jdk1.7以后 将字符串对象尝试放入串池中
如果以有 则不放入 返回已有的串池中的对象地址
如果没有 则会把对象的引用地址复制一份放入串池中,并返回串池中的引用地址