目录
❝
对象的创建,内存布局以及访问定位,推导String必问面试题答案
❞
packagecom.kuaizhan.web.utils;
/**
*@authorbyzengzhiqin
*2020-07-15
*/
classPerson{
Stringname;
publicvoidsay(Stringname){
System.out.println("hello" name);
}
}
publicclassTestPerson{
publicstaticvoidmain(String[]args){
Personperson;
person=newPerson();
person.say("特朗普");
}
}
以此为例,结合之前说到的类生命周期来说(不懂的朋友可以看前面的文章Java类的生命周期,不懂这个都不好意思和别人说我是搞JAVA的 ),当执行到 new Person 的时候:
具体的划分方式根据各家垃圾收集器不同也采用不同的划分方式,主要两种:
方式一:指针碰撞(假设JAVA堆内存是整整齐齐的,用过的站一起,没用过的站一起,那么在中间分界地方放个指针,每次新分配往没用过的那边移动一点就好了。这种方式需要垃圾收集器维护这个用过的和没用过的内存,因为运行过程中可能中间随时有使用过的内存被回收了就出现了缺口,需要垃圾收集器进行整理内存)
方式二:空闲列表(JAVA堆空闲内存之间是这里缺一块那里缺一块的,虚拟机维护一个空闲内存列表,记录下来哪些空闲哪些占用了,分配的时候从空闲列表里面找)
还是这段代码:
packagecom.kuaizhan.web.utils;
/**
*@authorbyzengzhiqin
*2020-07-15
*/
classPerson{
Stringname;
publicvoidsay(Stringname){
System.out.println("hello" name);
}
}
publicclassTestPerson{
publicstaticvoidmain(String[]args){
Personperson;
person=newPerson();
person.say("特朗普");
}
}
代码对应对象调用的内存
调用过程:
注意:
JVM堆、栈和方法区
局部变量 person 其实就是一个reference引用,说白了就是一个类似 0x11 的地址,存在于局部变量表里面(局部变量表在栈区,不记得的朋友可以看看上一篇讲JVM内存分布的文章Java跨平台根本原因,面试必问JVM内存模型白话文详解来了)。
引用指向关系: 0x11 => 0x22 => 0x33
reference1 就是局部变量person,指向堆区的实例;然后 new Person() 指向方法区里面的 Person类元数据信息包括sayHello方法。
当调用sayHello的时候,步骤如下三步:
String 面试高频题,其实都是靠推导出来的,记永远是记不清的:
Stringstr="1" "2" "3";
答案:一个对象,编译时候会进行字符串折叠,算是一个优化,以前确实是四个对象,“1”,“2”,“3”,“123”
字符串折叠:如果是常量相加,通俗理解就是先加,然后去常量池找,有直接返回,没有就创建
Strings1="hello";
Strings2="world";
Strings3="helloworld";
System.out.print(s3=="hello" "world")
true,根据上面的分析,都是比较常量池的值,是同一个,true
System.out.print(s3==s1 s2);
false,变量相加,只要有一个变量,那么都要先给变量开空间,就成了地址比较
String str2 = new String("Trump"); 创建了几个对象?
Stringstr1="Trump";
直接去常量池创建一个Trump,栈里面保存引用直接指向常量池”Trump“
Stringstr2=newString("Trump");
创建几个对象分情况(String不可变):
1.一个对象(如果常量池中已经存在”Trump”,堆里面创建个对象就可以,栈里面来个引用指向堆)
2.两个对象(如果常量池中不存在”Trump“,先在常量池里面创建”Trump“,然后堆里面new一个对象,最后栈里面来个引用指向堆)
System.out.print(str1==str2);
比较的栈里面的引用地址,指向的东西都不一样怎么可能是一样的,果断false
System.out.print(str1.equals(str2));
比较的常量池里面的值,都是Trump,true
公众号下篇内容预告: 垃圾回收,JAVA程序员的福音呐
往期推荐:
Java跨平台根本原因,面试必问JVM内存模型白话文详解来了
从JVM设计者的角度来看.class文件结构,一文弄懂.class文件的身份地位
Java类的生命周期,不懂这个都不好意思和别人说我是搞JAVA的
欢迎批评指正,有收获的朋友点个在看或者分享鼓励一下吧,十分感谢~
关注我,一起成长
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved