Android应用开发之Android冷知识——Java中的字符串常量池
凌雪 2018-09-21 来源 :网络 阅读 668 评论 0

摘要:本文将带你了解Android应用开发之Android冷知识——Java中的字符串常量池,希望本文对大家学Android有所帮助。

本文将带你了解Android应用开发之Android冷知识——Java中的字符串常量池,希望本文对大家学Android有所帮助。


字符串常量池
      JVM为了减少字符串对象的重复创建,其内部维护了一个特殊的内存,这段内存被成为字符串常量池(方法区中)。实际上还有整型常量池、浮点型常量池等等。字符串常量池存放的是对象的引用,而不是对象。Java中字符串对象创建有两种形式:字面量形式和创建对象形式。
    1、字面量形式
    字面量的体现形式String str = "Hello",简单理解为去字符串常量池中拿对象
    当代码中出现字面量形式创建字符串对象时,JVM首先会对这个字面量进行检查,如果字符串常量池中存在相同内容的字符串对象的引用,则将这个引用返回,否则新的字符串对象被创建,然后将这个引用放入字符串常量池,并返回该引用。
    2、创建对象形式
    创建对象的体现形式String str = new   String("Hello");,简单理解为直接在堆内存空间中创建新的对象
    当代码中出现了new来构造字符串对象的时候,不管字符串常量池中有没有相同内容的对象的引用,新的字符串对象都会创建。虽然存放的内容相同,但它是一个全新的字符串对象,其对象存放在堆当中,且拥有新的内存地址。
    问题抛出
    问:求解下面的输出语句的结果并解释原因
    ?1234567891011121314151617String s1 = "Hello";String s2 =   "Hello";String s3 = "Hel" + "lo";String s4 =   "Hel" + new String("lo");String s5 = new   String("Hello");String s6 = s5.intern();String s7 =   "H";String s8 = "ello";String s9 = s7 + s8; // ==   :比较两个对象是否为同一对象System.out.println(s1 == s2);  //   trueSystem.out.println(s1 == s3);  // trueSystem.out.println(s1 ==   s4);  // falseSystem.out.println(s1 == s9);  //   falseSystem.out.println(s4 == s5);  // falseSystem.out.println(s1 ==   s6);  // true
    问题分析
    1、s1==s2
    s1和s2在赋值时,均使用的字符串字面量。在编译期间,这种字面量会直接放入常量池中,从而实现复用。在载入运行时常量池后,s1和s2指向的是同一个内存地址。
    2、s1==s3
    s3是动态拼接出来的字符串,但是所有参与拼接的部分都是已知的字面量。在编译期间,这种拼接会被优化,编译器直接帮你拼好,因此s3会被优化成String   s3 = "Hello"。
    3、s1==s4
    s4是动态拼接出来的字符串,但new String("lo")这部分不是已知字面量,是一个不可预料的部分。在编译期间,编译器不会优化,必须等到运行时才可以确定结果。
    4、s1==s9
      s7和s8在赋值的时候使用的字符串字面量,但是拼接成s9的时候,s7和s8作为两个变量,都是不可预料的。编译器毕竟是编译器,不可能当解释器用,所以不做优化。等到运行时,s7和s8拼接成的新字符串,在堆中地址不确定,不可能与方法区常量池中的s1地址相同。
    5、s4==s5
    s4和s5都创建出了字符串对象,两者都存在于堆中,但地址不相同。
    6、s1==s6
      对于使用new创建的字符串对象,如果想将这个对象的引用加入到字符串常量池,可以使用intern方法。调用intern后,首先检查字符串常量池中是否有该对象的引用,如果存在,则将这个引用返回给变量,否则将引用加入并返回给变量。很显然,s1和s6都已经是字符串常量池中的一员,且值是相等的,所以引用的地址也相等。    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注移动开发之Android频道!

本文由 @凌雪 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程