zoukankan      html  css  js  c++  java
  • java的String构造对象的几种方法以及内存运行过程

    String类创建对象的方法可以分为以下三种

    1.String a = "123";

    2.String b = new String("123");

    3.String c = "12" + "3";

    1程序执行时,会先去jvm的常量池(在方法区中)中寻找有没有“123” 的String 对象,如果已经存在,则无须新建对象,直接把常量池中的对象地址返回给栈中的引用 a (此时没有建立对象)

    如果没有存在,则在常量池中新建一个“123”的String对象。然后将其地址返回给栈中的引用 a(此时建立了一个对象)。

    2.程序执行时,首先去jvm的常量池中寻找有没有“123”的String对象,如果有,则在堆中新建一个String类型的对象“123”,然后将其地址返回给栈中的引用b。(此时只新建了一个对象)。

    如果没有,则先在常量池中新建一个“123”的String对象。然后再去堆中新建一个值为“123”的对象,并将堆中的对象地址返回给栈中的引用b。(此时建立了两个对象)

    那在这里就有一个有趣的问题,那就是常量池中的对象和堆中的对象到底是不是同一个?可以通过比较  a == b 的值可得出结论。楼主这边得到false。可知他们并不是一个对象。

    3.第三种构造方式比较复杂。网上也是众说纷纭。楼主在这里分为两种方式

    3.1第一种方式是: String a = "123"; String b = "1" + "2" + "3";如果是这样,由于全是b是由常量拼接起来的。那么,在编译期间就能确定值,编译器就会在编译期间就帮你进行拼接。那么,编译过后就成为:String b = "123";之后的判断和1一样。且 a == b = true

    3.2 String a = "123"; String b = "1"; String c = b + "2" + " 3";

    由于c中有引用的拼接,而在编译过程中是无法知道引用的具体值,那么编译器就不会默认帮你进行拼接。常量池中就要新建一个对象。这时, a == c =false;

  • 相关阅读:
    11.分类与监督学习,朴素贝叶斯分类算法
    14 深度学习-卷积
    13-垃圾邮件分类2
    12.朴素贝叶斯-垃圾邮件分类
    9、主成分分析
    8、特征选择
    7.逻辑回归实践
    6.逻辑归回
    5.线性回归算法
    15 手写数字识别-小数据集
  • 原文地址:https://www.cnblogs.com/exceptionblog/p/7849838.html
Copyright © 2011-2022 走看看