字符串常量池详解「建议收藏」

字符串常量池详解「建议收藏」字符串常量池详解文章所涉及的资料来自互联网整理和个人总结,仅作为个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!概述在JVM中,为了减少字符串对象的重复创建,维护了一块特殊的内存空间,这块内存空间就被称为字符串常量池。在JDK1.6及之前,字符串常量池存放在方法区中。到JDK1.7之后,就从方法区中移除了,而存放在堆中。一下是《深入理解虚Java虚拟机》第二版原文:对于HotSpot虚拟机,根据官方发布的路线图信息,现在也有放弃永久代并逐步改为采用NativeMemory来实

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

字符串常量池详解

文章所涉及的资料来自互联网整理和个人总结,仅作为个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!

概述

在JVM中,为了减少字符串对象的重复创建,维护了一块特殊的内存空间,这块内存空间就被称为字符串常量池。

JDK1.6及之前,字符串常量池存放在方法区中。到JDK1.7之后,就从方法区中移除了,而存放在中。一下是《深入理解虚Java虚拟机》第二版原文:

对于HotSpot 虚拟机,根据官方发布的路线图信息,现在也有放弃永久代并逐步改为采用Native Memory来实现方法区的规划了,在目前已经发布的JDK1.7 的HotSpot中,已经把原本放在永久代的字符串常量池移出。

根据查阅的资料显示在JDK1.7以后的版本中字符串常量池移到堆内存区域;同时在jdk1.8中移除整个永久代,取而代之的是一个叫元空间(Metaspace)的区域

创建字符串对象的两种方法

  1. 直接使用双引号声明出来的String对象会直接储存在常量池中。

    String s1 = "abc"
    
  2. 使用new方法创建出来的String对象,可以使用String提供的intern方法。intern 方法会从字符串常量池中查询当前字符串是否存在,若不存在就会将当前字符串放入常量池中

String s2 = new String("xyz");
public class Test1{ 
   
    public class void main(String[] args){ 
   
        String s1 = "abc";
        String s2 = "abc";
        System.out.println(s1);//abc
        System.out.println(s1 == s2);//true
        
        char[] charArray = { 
   'a','b','c'};
        String s3 = new String(charArray);
        System.out.println(s3);//abc
        System.out.println(s1 == s3);//false
        
        
        
    }
}

从结果看,两个布尔值的结果不相同,虽然两个输出两个字符串的结果相同,都为abc,但比较两者时则不同,这是因为引用类型比较时,比较的是其地址值;不同于基本数据类型比较的是其数据值。

采用直接创建String类型对象的方法创建对象时,JVM首先会去字符串常量池中查找是否存在”abc” 这个对象,如果不存在,则在字符串常量池中创建”abc“这个对象,然后将池中”abc“对象的引用地址返回给对象s1,这样s1的地址就在常量池中;

如果存在,则不创建任何对象,直接将存在的“abc”的地址返回给对象s2。这就是为什么s1等于s2的原因。

而通过new方法创建的String对象,其创建的字符串是放在堆当中的,将堆当中的字符串地址返回赋值给s3,s1和s3的存放地址不相同,一个在字符串常量池中,一个在堆当中,字符串常量池外,因此返回的值是false。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/164774.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java单例模式实现-3种方式

    java单例模式实现-3种方式java单例模式 java单例模式是java中经常使用到的一种情况,那么,要实现单例模式都有哪几种方法呢,下面介绍的是java单例模式的四种实现方法,分别是:懒汉式饿汉式双检锁静态内部类懒汉式 懒汉式故名思意就是懒,是等到需要使用的时候再创建单例。这就需要将构造函数私有化,在外部就不能创建对象,由内部创建。下面是懒汉模式的实现。/***懒汉式*单例模式的创建*/publicclassSingleDemo{publicstaticSingleDem

    2022年7月8日
    19
  • Python 数组截取

    Python 数组截取#数据源names=[‘a’,’b’,’c’,’d’,’e’,’f’]#正常获取print(names[1])#b#截取print(names[0:3])#[‘a’,’b’,’c’]print(names[3:10])#[‘d’,’e’,’f’]#截取:从指定开始直接到指定结尾print(names[3:])#[‘d’,’e’,’f’]print(names[:3])#[‘a’,’b’,’c’]#倒着切print(na

    2022年6月10日
    74
  • 微信公众平台-微信服务号开发

    文章目录背景:一、微信各个平台介绍二、公众平台介绍三、开发前准备四、服务器配置五、服务器验证六、消息接收七、客服消息八、获取素材九、相关工具十、最终效果展示总结背景:近期接到了涉及微信开放平台和微信公众平台相关的开发需求,开发过程中踩了许多坑,把相关问题整理记录下来以便巩固记忆,并把总结的经验分享出来,本篇分享微信服务号开发,希望可以给大家提供帮助一、微信各个平台介绍1、微信开放平台:面向开发人员,为网站、App提供微信第三方登录功能,为App提供支付功能。2、微信公众平台:对应的是公众号,包括订

    2022年4月12日
    173
  • 带求和符号的函数求导公式_幂级数如何求和函数

    带求和符号的函数求导公式_幂级数如何求和函数

    2022年10月10日
    5
  • ubuntu下安装中文输入法_ubuntu下载中文输入法

    ubuntu下安装中文输入法_ubuntu下载中文输入法文章目录前言基础准备ibus(IntelligentInputBus)fcitx(FlexibleInputMethodFramework)前言Ubuntu中安装中文输入法相比Windows上要复杂不少(其实也不算复杂,就是步骤上要稍微多一些)。这篇文章将基于UbuntuDesktop20.04进行中文输入法安装说明。基础准备首先要安装中文输入法的话ibus(IntelligentInputBus)fcitx(FlexibleInputMethodFramework)

    2022年9月26日
    4
  • MySQL——事务(Transaction)详解

    MySQL——事务(Transaction)详解该博客详解MySQL中的事务一、事务定义Transaction事务:一个最小的不可再分的工作单元;通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元)一个完整的业务需要批量的DML(insert、update、delete)语句共同联合完成事务只和DML语句有关,或者说DML语句才有事务。这个和业务逻辑有关,业务逻辑不同,DML语句的个数不同…

    2022年5月5日
    45

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号