zoukankan      html  css  js  c++  java
  • Java String的内存机制

    JVM运行时,会将内存分为两个部分:堆和栈。堆中存放的是创建的对象,而栈中存放的方法调用过程的局部变量或引用。而设计Java字符串对象内存实现的时候,在堆中又开辟了一块很小的内存,称之为字符串常量池,专门用来存放特定的字符串对象。

    创建Java字符串对象有两种常用的方式:

    String 引用变量名="字符串内容";
    String 引用变量名=new String(<参数序列>);

    我们先来看看创建字符串对象的第一种方式内存如何分配的,代码如下:

    String s1="osEye.net";
    String s2="osEye.net";


    如上图描述了引用对象的关系,以及内存的分配。Java实现的步骤如下:

    1. 查看字符串常量池中是否存在内容与“osEye.net”相同的字符串对象。
    2. 若没有,则新创建一个包含该内容的字符串对象,并让引用变量指向该对象。例如,创建字符串s1的时候,字符串常量池中没有,则创建一个新对象,并让引用s1指向该对象。
    3. 若已经存在包含该内容的字符串对象,则让字符串引用直接指向该对象。例如,在创建字符串s2的时候,字符串常量池中已经有包含该内容的对象了,所以引用s2直接指向已有的对象。

    在来看看第二种创建字符串对象的方式:

    String s1="osEye.net";
    String s2=new String("osEye.net");


    如上图描述了引用对象的关系,以及内存的分配。Java实现的步骤如下:

    1. 首先在堆(不是常量池)中创建一个包含指定内容的字符串对象,并将字符串引用指向该对象。例如上述代码中,使用new创建字符串s3,其会直接在堆中创建一个内容为“osEye.net”的字符串对对象,并将引用s3指向该对象。
    2. 去字符串常量池中查看,是否有包含该内容的对象。
    3. 若有,则将new出来的字符串对象与字符串常量池中内容相同的对象联系起来。例如,本例中s3所指向的对象与s1所指向的联系起来。
    4. 若没有,则在字符串常量池再创建一个包含该内容的字符串对象,并将堆中的对象与字符串常量池中新创建出来的对象联系起来。

    我们知道,new出来的字符串对象和字符串常量池中的对象是有联系的,可以通过intern方法来查看,方法签名:

    public String intern()

    此方法将指定的字符串引用在字符串常量池中对应的对象,若其指向的对象本身就在字符串常量池中,则直接将自己指向的对象返回;若该字符串引用指向的对象在堆中,则返回字符串常量池中与其联系的对象。实例如下:

    package net.oseye;
    public class ExceptionTest {
    
    	public static void main(String[] args) {
    		String s1="osEye.net";
    		String s2=new String("osEye.net");
    		
    		if(s1==s2){
    			System.out.println("字符串引用s1和字符串引用s2所指向的是同一个对象");
    		}else{
    			System.out.println("字符串引用s1和字符串引用s2所指向的不是同一个对象");
    		}
    		if(s1.intern()==s2.intern()){
    			System.out.println("字符串引用s1和字符串引用s2在字符串常量池中联系的是同一个对象");
    		}else{
    			System.out.println("字符串引用s1和字符串引用s2在字符串常量池中联系的不是同一个对象");
    		}
    	}
    }

    输出结果:

    字符串引用s1和字符串引用s2所指向的不是同一个对象
    字符串引用s1和字符串引用s2在字符串常量池中联系的是同一个对象
  • 相关阅读:
    WebApi之DOM的基本介绍
    Javascript常见数据类型API
    JavaScript作用域与对象
    Javascript数组与函数初识
    久等了,你要的 Python 书籍推荐,来了
    六种酷炫Python运行进度条
    python获取系统内存占用信息的实例方法
    在图像中隐藏数据:用 Python 来实现图像隐写术
    付费?是不可能的!20行Python代码实现一款永久免费PDF编辑工具
    Python数据分析实战:使用pyecharts进行数据可视化
  • 原文地址:https://www.cnblogs.com/zhaiqianfeng/p/4618247.html
Copyright © 2011-2022 走看看