在介绍字符串常量池之前,先看一段简单的代码:

using System;namespace ConsoleApplication1
{class Program{static void Main(string[] args){string a = "123";string b = "123";if (ReferenceEquals(a, b)){Console.WriteLine("相同");//输出相同}Console.ReadLine();}}
}

CLR是公共语言运行库(Common Language Runtime)和Java虚拟机一样也是一个运行时环境,它负责资源管理(内存分配和垃圾收集等)。

CLR为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池。字符串常量池不在堆中也不在栈中,是独立的内存空间管理,在内存的常量区。

基本原理:
当我们定义了a和b的字符串,然后CLR内部机制去字符串常量池中找,如果存在相同内容的字符串对象的引用,则将这个引用返回。否则新的字符串对象被创建,然后将这个引用放入字符串常量池,并返回该引用。

因此,上面的代码就会输出引用相同。

以下三种情况会查询暂存池(若查询不到就将其存入暂存池),使用ReferenceEquals() 判断,string a,string b,string c引用相同:

  • 利用字面量值创建string对象,例如string a = "123";
  • 利用string.Intern()创建string对象,例如string b = string.Intern("123");
  • 字面量值+字面量值拼接创建string对象, 例如string c = "12" + "3";

注意:不是所有的字符串都放在暂存池中,运行时期动态创建的字符串不会被加入到驻留池中。

关于字符串常量池的更深理解:

1. 驻留池由CLR来维护,其中的所有字符串对象的值都不相同。

2. 只有编译阶段的文本字符常量会被自动添加到驻留池。

3.运行时期动态创建的字符串不会被加入到驻留池中。

4.string.Intern()可以把动态创建的字符串加入到驻留池中。

C#--字符串常量池相关推荐

  1. JVM---StringTable(字符串常量池)

    StringTable(字符串常量池) 字符串常量池 StringTable(字符串常量池) String的基本特性 String 的底层结构 String 的内存分配 String 的基本操作 字符 ...

  2. Java的字符串常量池

    字符串对象创建过程 先看一道面试题 // 这段代码创建了几个对象? String s = new String("卓卓"); 使用new关键字创建对象时,Java虚拟机会先在字符串 ...

  3. java 常量字符串过长_90%的同学都没搞清楚的 Java 字符串常量池问题(图文并茂)

    字符串问题可谓是 Java 中经久不衰的问题,尤其是字符串常量池经常作为面试题出现.可即便是看似简单而又经常被提起的问题,还是有好多同学一知半解,看上去懂了,仔细分析起来却又发现不太明白. 背景说明 ...

  4. 读取字符串字符时出错_JVM | 运行时常量池和字符串常量池及intern()

    本文知识点 这一块的知识点,一直都是最为混乱的,网上很多博客有的都自相矛盾,因此,这一块需要深入学习,本文以JDK11为基础,尽量参考官方文档 静态常量池 运行时常量池及字符串的引用 各种String ...

  5. JVM - 深入剖析字符串常量池

    文章目录 字符串常量池 位置的变更 JVM对字符串常量池的优化 字符串的常见创建方式 (1.7+) 直接赋值字符串 new String() intern 经典面试题 下列代码创建几个对象 案例 案例 ...

  6. 02.字符串常量池 ? class常量池? 运行时常量池?

    java对象创建流程: 简介: 这几天在看Java虚拟机方面的知识时,看到了有几种不同常量池的说法,然后我就去CSDN.博客园等上找资料,里面说的内容真是百花齐放,各自争艳,因此,我好好整理了一下,将 ...

  7. JVM_04 字符串常量池(详解intern( ))

    一.String的基本特性 String:字符串,使用一对""引起来表示. String sl = "hello"://字面量的定义方式 String s2 = ...

  8. 理解Java字符串常量池与intern()方法

    理解Java字符串常量池与intern()方法 阅读目录 Java内存区域 两种创建方式在内存中的区别 解释开头的例子 intern()方法 参考资料 String s1 = "Hello& ...

  9. 常量池之字符串常量池String.intern()

    运行时常量池是方法区(PermGen)的一部分. 需要提前了解: 1. JVM内存模型. 2. JAVA对象在JVM中内存分配 常量池的好处 常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现 ...

  10. 12.JDK1.8 JVM运行时数据区域概览、各区域介绍、程序计数器、Java虚拟机栈、本地方法栈、堆、堆空间内存分配(默认情况下)、字符串常量池、元数据区、jvm参数配置

    12.JDK1.8 JVM运行时数据区域概览 12.1.JDK1.8 JVM运行时数据区域概览 12.2.各区域介绍 12.3.各区域介绍 12.3.1.程序计数器 12.3.2.Java虚拟机栈 1 ...

最新文章

  1. 查看mysql是否安装成功和mysql的版本信息
  2. 明显调用的表达式前的括号必须具有指针函数类型_基于指针对象的方法
  3. 浅析 NodeJs 的几种文件路径
  4. vba编程把纯文本转换成html,如何将一列文本与html标签转换为Excel中的vba格式文本...
  5. Flutter AppBar 简述
  6. AttributeError: module 'tensorflow' has no attribute 'Session'
  7. 信号怎么用matlab分类,使用迁移学习做信号分类
  8. JAVA程序设计(学堂在线-清华大学) 课后练习题 已更新完毕
  9. OpenGL编程指南笔记第1章
  10. Java常见设计模式面试题及答案
  11. 计算机显示桌面图标不见了,电脑显示器桌面图标不见了怎么办
  12. R语言ggplot2边框背景去除
  13. mysql 触发器很慢_mysql之视图、触发器、事物、存储过程、函数、流程控制、索引与慢查优化...
  14. HeadFirst设计模式笔记——工厂模式
  15. (程序员必备技能)基于Python的鼠标与键盘控制实战扩展与源码
  16. Mitmproxy代理设置和证书安装
  17. 《信息安全保障》一1.3 信息系统安全保障概念与模型
  18. 使用视频作为网页背景的写法
  19. 用C#实现竖列转盘游戏
  20. python autocad 块属性_python autocad 块属性_python之模块的显要属性

热门文章

  1. 学习笔记 - CFA 权益
  2. 建筑行业转型,这4点很重要!
  3. 《计算机网络》——几种编码形式
  4. ChatGPT炒股:自动批量下载萝卜投研网站上的股票研报
  5. 【解决方案】监狱/看守所如何通过EasyCVR搭建智慧监管安防视频系统?
  6. 从零开始学USB(二十六、usb鼠标驱动驱动实例分析[1]简介)
  7. 社交网络大数据建模的框架探索
  8. 不妙,2023年浙大mpa的复试形势比想象的更严峻,又在突突突涨……
  9. 汇编语言Test指令
  10. 简单的Windows程序设计