• 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;

  • 相关阅读:
    数组字符串
    return语句
    函数
    js流程控制语句
    js数据类型
    精进:如何成为一个很厉害的人---书摘(转)
    生成随机的数字和字母组合
    modelAndView重定向到外网
    mysql. 替换数据库中某个字段
    java中对于时间的处理
  • 原文地址:https://www.cnblogs.com/exceptionblog/p/7849838.html
Copyright © 2020-2023  润新知