• java字符串对象存储机制


    String s1="abc";创建了几个String对象 ?

    String s2 = new String("abc");创建了几个String对象?

    s1==s2?

    首先需要明确下面的知识点:
    1、引用变量与对象的区别;
    2、字符串文字"abc"是一个String对象; 
    3、文字池(pool of literal strings)和堆(heap)中的字符串对象。

    一、引用变量与对象

    A aa;
    这个语句声明一个类A的引用变量aa[我们常常称之为句柄],而对象一般通过new创建。所以题目中s1仅仅是一个引用变量,它不是对象。

    二、堆内存和常量池中的字符串对象 是不同的对象,有着不同的地址(回答第三个问题)

      

      String ss1="abc";
    String s1=new String("abc");
    
     System.out.println("s1==ss1="+s1==ss1);
     

    输出结果为false。

    三、字符串对象的创建(回答第一个问题)

    由于字符串对象的大量使用(它是一个对象,一般而言对象总是在heap分配内存),Java中为了节省内存空间和运行时间(如比较字符串时,==比equals()快),在编译阶段就把所有的字符串文字放到一个文字池(pool of literal strings)中,而运行时文字池成为常量池的一部分。文字池的好处,就是该池中所有相同的字符串常量被合并,只占用一个空间。
    下面利用一个程序实例,来演示相同的字符串占用同一个空间:

     1 import java.util.*;
     2 import java.io.*;
     3 public class Test{
     4  public static void main(String args[]){
     5   String s1=”abc“;
     6 
     7   String s2=”abc“;    
     8   System.out.println(s1==s2);
     9  }
    10 }

    上面的程序段执行时会输出true,这表明s1和s2占用相同的内存空间。此时便可以回答第一个问题了,

    String s="abc"定义了一个或0个对象。定义s1时pool中还没有"abc",所以它定义了一个对象"abc"并将其放入到pool中;

    定义s2时pool中已经有"abc"了,所以它定义了0个对象。(注:在采用这种形式的表达式定义s时,他只在pool中定义对象,不会在heap中定义)

    四、第二个问题的答案

    首先将结论告诉读者,String s=new String("abc")定义了两个或者一个对像。

    下面对其进行分析

    import java.util.*;
    import java.io.*;
    public class Test{
     public static void main(String args[]){
      String s1=new String("abc");
      String ss1="abc";
      String s2=new String("abc");
      String ss2="abc";
      
      System.out.println(s1==s2);
      System.out.println(ss1==ss2);
    
     System.out.println("s1==ss1="+s1==ss1);
    
     }
    }
    

      

    这个程序会依次输出False和true和false;对于s1,对其定义时pool中没有"abc",String s1=new String("abc")会先后在pool中和heap中定义"abc",所以它创建了两个对象;而对于s2,它只在heap中定义了一个"abc",所以它创建了一个对象;而对于ss1和ss2,他们定义的时候pool中已经有了"abc",所以定义了0个对象。





  • 相关阅读:
    size_t类型
    sudo 安装 ——Debian 6
    Ubuntu10.10 上海交大及其他教育网更新源
    Linux 命令解决小问题
    VMware Player tools for linux 安装
    内核总结之内存管理api (转)
    volatile的使用
    二叉树层次遍历队列实现
    Ubuntu 11.04 下OpenCV安装
    Ubuntu 添加教育网更新源【转】
  • 原文地址:https://www.cnblogs.com/smellpawn/p/10748316.html
Copyright © 2020-2023  润新知