对象创建过程
对象的创建过程,最好是能记住,并且能知道每一步在做什么。
对象构成
HotSpot 虚拟机中,对象在内存中的布局可以分为三块区域:
-
对象头:对象头中包含两部分信息,
- 第一部分用于存储对象自身运行时数据(哈希码,GC 分代年龄,锁状态标志),
- 另一部分是类型指针,即指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。
- 实例数据:存储的对象的有效信息。
- 对齐填充:对齐填充起到的是占位的作用。
对象的访问定位
- 句柄
- 直接指针
补充
String str1 = "abcd";
String str2 = new String("abcd");
System.out.println(str1==str2);//false
这两种方式创建的对象是有差别的,第一种方式是在常量池中,第二种方式是在堆内存中。
直接使用双引号声明创建出来的 String 对象会直接存储在常量池中。
注: String.intern() 是一个 Native 方法,它的作用是:如果运行时常量池中已经包含一个等于此 String 对象内容的字符串,则返回常量池中该字符串的引用;如果没有,则在常量池中创建与此 String 内容相同的字符串,并返回常量池中创建的字符串的引用。存在变量可重用的可能,因此不能用于作为锁对象。









网友评论