String v1="a";//(1)
String v2=new String("a");//(2)
String v3="a";//(3)
String v4="ab";
String v5=v4.subString(0,1);
第一种方式的定义,先在栈中 定义一个变量v1,然后在常量池未找到"a"的常量定义,然后生成一个“a”的常量,最后v1指向这个常量的地址。
第二张方式的定义,先在栈中 定义一个变量v2,然后在堆中new一个String类型的对象,赋值为"a",最后v2指向这个堆上的内存。
第三种方式的定义,因为内存区域内已经有了一个"a"的常量,v3直接指向这个常量。
综上,v1和v3的地址空间相同,v2是另外的一个地址空间。
v4指向的是"ab"的常量,subString实现的时候,除了对startIndex endIndex做了越界处理,就是调用了new String。所以v5是虽然值也是a,但是是另外一个new的对象。
v1==v3//true
v1==v2//false
v1==v5//false
//
以上问题涉及到java的内存分配问题。变量,常量 都存在栈上,new 的对象,数组存在堆上。
String 类型 地址空间
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
相关阅读更多精彩内容
- 弗洛伊德算法适用于为图中每一个顶点求最短路径,思路如下 检查图中任何一个 到 任何另一个点能否通过第一个点降低最短...
- 市场研究公司 IDC 发布的最新数据预测,2015年第二季度,Apple Watch 全球的销量为360万。这个数...