zoukankan      html  css  js  c++  java
  • String str = new String("xyz") 会创建几个对象

    转载:https://blog.csdn.net/andychen314/article/details/50857313

    答案是 两个对象,要理解这个,就要知道string类的工作原理。下面来慢慢分析一下:

    1. public class StringTest {
    2. public static void main(String[] args){
    3. String s1="Hello";
    4. String s2="Hello";
    5. String s3=new String("Hello");
    6. System.out.println("s1和s2 引用地址是否相同:"+(s1 == s2));
    7. System.out.println("s1和s2 值是否相同:"+s1.equals(s2));
    8. System.out.println("s1和s3 引用地址是否相同:"+(s1 == s3));
    9. System.out.println("s1和s3 值是否相同:"+s1.equals(s3));
    10. }
    11. }
    输出结果:

    s1和s2 引用地址是否相同:true
    s1和s2 值是否相同:true
    s1和s3 引用地址是否相同:false
    s1和s3 值是否相同:true

           上面程序中的"=="是判断两个对象引用的地址是否相同,也就是判断是否为同一个对象,s1与s2 返回为true,s1与s3返回则是false。说明s1与s2 引用的同一个对象的地址,s3则与其它两个引用不是同一个对象地址。

           原因是Java为了避免产生大量的String对象,设计了一个字符串常量池。工作原理是这样的,创建一个字符串时,JVM首先为检查字符串常量池中是否有值相等的字符串,如果有,则不再创建,直接返回该字符串的引用地址,若没有,则创建,然后放到字符串常量池中,并返回新创建的字符串的引用地址。所以上面s1与s2引用地址相同。那为什么s3与s1、s2引用的不是同一个字符串地址呢? String s3=new String("Hello"); JVM首先是在字符串常量池中找"Hello" 字符串,如果没有创建字符串常量,然后放到常量池中,若已存在,则不需要创建;当遇到 new 时,还会在内存(不是字符串常量池中)上创建一个新的String对象,存储"Hello",并将内存上的String对象引用地址返回,所以s3与s1、s2引用的不是同一个字符串地址。

           说到这里,可能有同学会问,放在常量池中会不会存在线程安全的问题?Java的工程师们早就考虑到了,String类是一个不可变对象,其它有两层意思:一是String类是一个final类,不能产生一个String的子类;二是在String类中提供的所有方法中,如果有String返回值就会创建一个String对象,不对原对象进行修改,这就保证了原对象不可改变。

           了解了String类的工作原理,回归问题本身。

           在String的工作原理中,已经提到了,new 一个String对象,是需要先在字符串常量中查找相同值或创建一个字符串常量,然后再在内存中创建一个String对象,所以 String str = new String("xyz"); 会创建两个对象。


  • 相关阅读:
    python中关于操作时间的方法(一):使用time模块
    size_t类型
    批量下载网络图片并zip打包
    遇到的java面试题
    jsp中button与submit的用法
    springmvc json字符串转化成json对象
    Cas 介绍及使用
    java中post时中文乱码
    mybatis使用generator生成对应的model、mapping配置文件、dao
    移动端接口:java写get方式访问数据(springmvc+spring。。。)
  • 原文地址:https://www.cnblogs.com/lirenhe/p/9774457.html
Copyright © 2011-2022 走看看