问题一:String,StringBuffer,StringBuilder 有啥区别
答案:三者底层都是用char数组存储字符串,string里的char 数组被final修饰,所以是不可变的
也不能被继承,每次对String的操作就是创建了新的String对象
StringBuffer和StringBuilder都继承了AbstrctStringBuilder类,都重写了这个类的append方法,但是
stringBuffer在重写的方法前加上了synchronized关键字,这个关键字就是为了保证多线程中的线程同步
和保证数据的准确性,所以StringBuffer是线程安全的
然后创建锁销毁锁也是需要时间的,所以单线程下StringBuilder最快
问题二:Object o =new Object()在堆内存中占了多少个字节
答案:对象在内存中的存储布局可以分为:对象头,实例数据,填充,对象头包括markword和类型指针
markword里存了锁相关的信息,占8个字节,java虚拟机通过这个类型指针知道这个对象是哪个类的对象
占4个字节,由于object对象里的成员变量为0,所以实例数据也不占字节,又由于jvm规定任何对象所占的
内存字节数必须是8的倍数,不够就用padding填充,所以object对象共占16个字节
jvm默认是64位操作系统的,所以指针也应该是64位,占8个字节,由于jvm开启了指针压缩
所以类型指针占4个字节,markword雷打不动8个字节,所以没有开启指针压缩也应该占8+8个字节