zoukankan      html  css  js  c++  java
  • 清晰了解String

    1. class StringTest {   
    2.     public static void main(String[] args){   
    3.         String s=new String("abc");   
    4.         String s1="abc";   
    5.         String s2=new String("abc");   
    6.         System.out.println(s==s1);   
    7.         System.out.println(s1==s2);   
    8.         System.out.println(s==s2);   
    9.     }   
    10. }  

    大伙儿都知道内存中有两块儿存储区域,分别是栈和堆,加上JAVA字符串是由字符串池管理的,所以,我们的内存可以这样划分:

    清晰了解String

    程序开始前所有区域都是空的,现在我们执行第一条语句:

    1. String s=new String("abc"); 

     JAVA执行流程是这样的。首先判断字符串池里有没有值为"abc"的对象,由于这行语句实在程序第一句,字符串池是空的,所以,它会现在字符串池里构造一个值为"abc"的对象,然后执行new语句后,再把“abc”拷贝到堆里面。如图:

    清晰了解String

    所以说,执行完这一行代码后生成了两个对象,一个是在字符串池里,一个是在堆里

    然后看第二句:

    String s1="abc";  

     执行到这一句时又产生了几个对象?答案是一个也没产生!执行是这样的,当程序看到"abc"后,会先到字符串池里找看有没有"abc",由于执行完第一行语句后字符串池里已经有"abc"了就不再创建,注意这里并没有new的操作,而是直接常量赋值,所以s1会直接指向这个"abc"而不会在堆里产生新的对象,如图

    清晰了解String

    程序接着往下走

    String s2=new String("abc"); 

    这次又产生了几个对象,一个!程序还是会现在字符串池里找"abc",发现有,就不再字符串池里产生新的对象了,接着执行new操作,记着,在JAVA中,只要出现new操作,一定会有新的对象产生,不管这个对象是否存在多少次,所以它又会在堆里生成一个内容为"abc"的对象,如图

    清晰了解String

    好了,只剩下比较了,注意这里是用的是==,在JAVA中,==永远是比较两个引用是否指向同一个对象的,看到上图,答案不用再揭晓了

  • 相关阅读:
    AVR开发 Arduino方法(六) 内存子系统
    AVR开发 Arduino方法(五) 模数转换子系统
    AVR开发 Arduino方法(四) 串行通信子系统
    AVR开发 Arduino方法(三) 定时/计数器子系统
    AVR开发 Arduino方法(二) 中断子系统
    2014.5.17—所谓生活,就是让自己变得更好
    2014.5.10—做事分清时间地点
    2014.5.7—社交网络用户心理分析
    2014.5.7—20岁这几年
    2014.5.5—反向绑定域名,无需工信部备案
  • 原文地址:https://www.cnblogs.com/lzhat/p/4422742.html
Copyright © 2011-2022 走看看