2019独角兽企业重金招聘Python工程师标准>>>

文字常量区,在之前的一篇关于堆栈的文章中有所提及,今天在重点说一下文字常量区,在该区内存放常量字符串,为什么这么做了,就是节省内存资源,将所有的非静态常量都放置在该区域内,且该区域是共享的。

String是一个特殊的包装类数据。可以用: 
String str = new String("abc"); 
String str = "abc"; 
两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。 
而第二种是先在栈中创建一个对String类的对象指针str,然后查找文字常量区中有没有存放"abc",如果没有,则将"abc"存放进文字常量区,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。

比较类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用==,下面用例子说明上面的理论。 
String str1 = "abc"; 
String str2 = "abc"; 
System.out.println(str1==str2); //true 
可以看出str1和str2是指向同一个对象的。,都是文字常量区内存放“abc”的这个内存空间。

String str1 =new String ("abc"); 
String str2 =new String ("abc"); 
System.out.println(str1==str2); // false 
用new的方式是生成不同的对象。每一次生成一个。

因此用第一种方式创建多个”abc”字符串,在内存中其实只存在一个对象而已. 这种写法有利与节省内存空间. 同时它可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。

另一方面, 要注意: 我们在使用诸如String str = "abc";的格式定义类时,总是想当然地认为,创建了String类的对象str。担心陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的 对象。只有通过new()方法才能保证每次都创建一个新的对象。 
由于String类的immutable性质,当String变量需要经常变换其值时,应该考虑使用StringBuffer类,以提高程序效率。

转载于:https://my.oschina.net/liangtee/blog/126724

老生常谈:文字常量区的那点事相关推荐

  1. 栈区,堆区,全局区,文字常量区,程序代码区详解(程序中不同类型数据所在区)

    一.预备知识-程序的内存分配     一个由C/C++编译的程序占用的内存分为以下几个部分     1.栈区(stack)-   由编译器自动分配释放   ,存放函数的参数值,局部变量的值等.其   ...

  2. c语言中全局变量内存,C语言——全局变量和局部变量在内存中的区别——及编译后的内存分区【栈-堆-全局存储区-文字常量区-程序代码区】...

    目录: 一:全局变量 二:局部变量 三:C语言经过编译之后将内存分为以下几个区域 (1)栈(stack) (2)堆(heap) (3)全局(静态)存储区 (4)文字常量区 (5)程序代码区 四:区别 ...

  3. 程序的内存分配模式(堆栈以及静态存储区,文字常量区,代码区)

    程序的内存分配模式 一个由 C/C++编译的程序占用的内存分为以下几个部分: 1.栈区( stack )-由编译器自动分配释放,存放函数的参数值,局部变量的值 等.其操作方式类似于数据结构中的栈. 2 ...

  4. C语言中字符串定义与文字常量区

    C语言中字符串定义与文字常量区 C语言的内存组织方式1>代码区,存放可执行代码2>全局存储区,存放所有全局变量和静态变量3>文字常量区,常量字符串4>堆区,malloc,new ...

  5. 文字常量区与栈区分析

    由于网上介绍内存分配的比较简单 自己顺便写了一份 由于刚接触C  若有问题 请指出 欢迎讨论 编译环境为VS2005 编译为C文件... 首先看下下面这段: int main() {     char ...

  6. C++栈内存与文字常量区

    先看看以下测试demo char str1[] = "abc"; char str2[] = "abc"; const char str3[] = " ...

  7. 文字常量区和栈区考点

    求以下程序输出结果 #include <stdio.h>char * fun1() {char * str = "hello";return str; }char * ...

  8. C和指针之动态内存分配堆、栈、全局区(静态区)、常量区对比总结学习笔记

    一.各个区的介绍   1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap) - 一般由程序员分配释放, 若程序员不 ...

  9. C/C++堆区、栈区、常量区、静态数据区、代码区详解

    转自:http://blog.csdn.net/hackerain/article/details/7953261 http://blog.csdn.net/firefly_2002/article/ ...

最新文章

  1. datatables增删改查php,jQuery+datatables插件实现Ajax加载数据与增删改查功能示例_白峰_前端开发者...
  2. Zeal工具下载Elasticsearch离线文档
  3. java 中格式化小数位数
  4. 从Servlet 到ApplicationContext
  5. SAP Spartacus默认的货币列表currency是从源代码什么地方读取的
  6. 明天14点直播间见!5位业内大咖带您解锁数据库内核技术与行业应用
  7. 计算机专业学的东西其实很少,为什么计算机专业的学生要学习使用Linux系统?...
  8. mysqlbinlog初识
  9. 梦幻西游qq表情包YR
  10. webSocket和http长连接短连接
  11. HPE 3PAR StoreServ存储系统连接解决方案
  12. 我用Python爬了4400条淘宝商品数据,竟发现了这些“潜规则”
  13. 雷军语录:感谢“批评”让小米理性成长
  14. 8.10 12.1-12.5
  15. 企业级监控系统概述、监控类型及发展趋势
  16. 利用Python开发App
  17. 总结程序员的性格特点、生活习惯
  18. 画中画activity状态管理
  19. idea tomcat启动乱码������
  20. 基于ssm共享充电宝管理系统(java毕业设计)

热门文章

  1. SAP 关于EWM的WT增强简介
  2. 解读丨从自动驾驶到学习机器学习:科技发展的15大趋势
  3. Python 之 matplotlib (十一) 3D
  4. dgl库之高级用法dgl.DGLGraph.update_all
  5. Neural Tensor Network详细介绍
  6. Error(s) in loading state_dict
  7. 用肖像画追踪历史上的信任度变化 |《自然-通讯》论文
  8. 科技巨头纷纷从刷脸转向“刷手”,指纹如何扛起生物识别大旗?
  9. 柳叶刀发布陈薇团队新冠疫苗试验结果:安全,能诱导免疫反应
  10. AI人必看!89页全网最全清华知识图谱报告(附PDF)