C#--字符串常量池
在介绍字符串常量池之前,先看一段简单的代码:
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#--字符串常量池相关推荐
- JVM---StringTable(字符串常量池)
StringTable(字符串常量池) 字符串常量池 StringTable(字符串常量池) String的基本特性 String 的底层结构 String 的内存分配 String 的基本操作 字符 ...
- Java的字符串常量池
字符串对象创建过程 先看一道面试题 // 这段代码创建了几个对象? String s = new String("卓卓"); 使用new关键字创建对象时,Java虚拟机会先在字符串 ...
- java 常量字符串过长_90%的同学都没搞清楚的 Java 字符串常量池问题(图文并茂)
字符串问题可谓是 Java 中经久不衰的问题,尤其是字符串常量池经常作为面试题出现.可即便是看似简单而又经常被提起的问题,还是有好多同学一知半解,看上去懂了,仔细分析起来却又发现不太明白. 背景说明 ...
- 读取字符串字符时出错_JVM | 运行时常量池和字符串常量池及intern()
本文知识点 这一块的知识点,一直都是最为混乱的,网上很多博客有的都自相矛盾,因此,这一块需要深入学习,本文以JDK11为基础,尽量参考官方文档 静态常量池 运行时常量池及字符串的引用 各种String ...
- JVM - 深入剖析字符串常量池
文章目录 字符串常量池 位置的变更 JVM对字符串常量池的优化 字符串的常见创建方式 (1.7+) 直接赋值字符串 new String() intern 经典面试题 下列代码创建几个对象 案例 案例 ...
- 02.字符串常量池 ? class常量池? 运行时常量池?
java对象创建流程: 简介: 这几天在看Java虚拟机方面的知识时,看到了有几种不同常量池的说法,然后我就去CSDN.博客园等上找资料,里面说的内容真是百花齐放,各自争艳,因此,我好好整理了一下,将 ...
- JVM_04 字符串常量池(详解intern( ))
一.String的基本特性 String:字符串,使用一对""引起来表示. String sl = "hello"://字面量的定义方式 String s2 = ...
- 理解Java字符串常量池与intern()方法
理解Java字符串常量池与intern()方法 阅读目录 Java内存区域 两种创建方式在内存中的区别 解释开头的例子 intern()方法 参考资料 String s1 = "Hello& ...
- 常量池之字符串常量池String.intern()
运行时常量池是方法区(PermGen)的一部分. 需要提前了解: 1. JVM内存模型. 2. JAVA对象在JVM中内存分配 常量池的好处 常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现 ...
- 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 ...
最新文章
- 查看mysql是否安装成功和mysql的版本信息
- 明显调用的表达式前的括号必须具有指针函数类型_基于指针对象的方法
- 浅析 NodeJs 的几种文件路径
- vba编程把纯文本转换成html,如何将一列文本与html标签转换为Excel中的vba格式文本...
- Flutter AppBar 简述
- AttributeError: module 'tensorflow' has no attribute 'Session'
- 信号怎么用matlab分类,使用迁移学习做信号分类
- JAVA程序设计(学堂在线-清华大学) 课后练习题 已更新完毕
- OpenGL编程指南笔记第1章
- Java常见设计模式面试题及答案
- 计算机显示桌面图标不见了,电脑显示器桌面图标不见了怎么办
- R语言ggplot2边框背景去除
- mysql 触发器很慢_mysql之视图、触发器、事物、存储过程、函数、流程控制、索引与慢查优化...
- HeadFirst设计模式笔记——工厂模式
- (程序员必备技能)基于Python的鼠标与键盘控制实战扩展与源码
- Mitmproxy代理设置和证书安装
- 《信息安全保障》一1.3 信息系统安全保障概念与模型
- 使用视频作为网页背景的写法
- 用C#实现竖列转盘游戏
- python autocad 块属性_python autocad 块属性_python之模块的显要属性