zoukankan      html  css  js  c++  java
  • 008 String str="i"与 String str=new String(“i”)一样吗?

    String str="i"与 String str=new String(“i”)一样吗?(已更新)

    答:不一样。

    因为内存的分配方式不一样。String str="i"的方式,Java 虚拟机会将其分配到常量池中;而 String str=new String(“i”)方式,则会被分到堆内存中。
     

            String str1 = "i";
    	String str2 = "i";
    	String str3 = new String("i");
    	System.out.println(str1 == str2);//ture
    	System.out.println(str2 == str3);//false
    

     

    解释:

    1Java 虚拟机会将其分配到常量池中:常量池不会重复创建对象。

    • 在String str1="i"中,把i值存在常量池,地址赋给str1。假设再写一个String str2="i",则会把i的地址赋给str2,但是i对象不会重新创建,他们引用的是同一个地址值,共享同一个i内存。

    2分到堆内存中:堆内存会创建新的对象。

    • 假设再写一个String str3=new String(“i”),则会创建一个新的i对象,然后将新对象的地址值赋给str3。虽然str3和str1的值相同但是地址值不同。

    参考博文

    拓展:

    • 堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。

    • 常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。

    • == :引用数据类型比较地址值;

    • equals:引用类型,重写前比较两个对象地址值,重写后比较属性值。

  • 相关阅读:
    Nginx实现动静分离
    Nginx实现负载均衡
    Linux安装Kafka
    Linux安装RocketMQ
    转://ORA-00603,ORA-27501,ORA-27300,ORA-27301,ORA-27302故障案例一则
    CPU, PSU, SPU
    转://Oracle打补丁方法论
    转://Oracle数据库补丁分析实践
    转://Linux Multipath多路径配置与使用案例
    转://Oracle中定义者权限和调用者权限案例分析
  • 原文地址:https://www.cnblogs.com/ynzj123/p/12605917.html
Copyright © 2011-2022 走看看