【不会编程的麦兜】-Java基础:聊聊String存储管理

  • 浅谈java内存
  • 实例说明一切

浅谈java内存

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

例如:

     String str1 = new String("Timo");//存放在堆中String str2 = "Timo";//存放在字符串常量中

Java堆(Java Heap)是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域。在此区域的唯一目的就是存放对象实例,几乎所有的对象实例都是在这里分配内存,但是这个对象的引用却是在栈(Stack)中分配。因此,执行String s = new String(“s”)时,需要从两个地方分配内存:在堆中为String对象分配内存,在栈中为引用(这个堆对象的内存地址,即指针)分配内存

实例说明一切

public class czTest {public static void main(String[] args) {String str1 = new String("Timo");String str2 = "Timo";String str3 = new String("Timo");System.out.println(str1 == str2);System.out.println(str1.equals(str3));System.out.println(str3 == str2);}
}

问题:(1)代码的执行过程?分别写出。(2)写出输出结果。
解析:
1.程序执行到"String str1 = new String(“Timo”)“时,首先在String常量池中查找有没有字符常量“Timo”。因为没有所以创建“Timo”对象,当执行new String(“Timo”)时,则在Java的堆中创建一个”Timo”对象,而str1是该对象的引用,因此共计创建2个对象。
2. 执行到"String str2 = “Timo”",首先在String常量池中查找有没有字符串常量“Timo",有则直接将str2作为String常量池中“Timo”的一个引用,当你重新声明一个String型变量为“Timo”时,将使用串池里原来的那个“Timo",而不用重新分配内存,也就是说,str1与str2将会指向同一块内存,因此,此时没有创建任何对象。
3. 执行到"String str3 = new String(“Timo”)",依次在String常量池中查找有没有字符串常量“Timo”,有则不进行再次创建,由于这里用了new关键字(有new就有对象),所以在Java堆中又创建了一个“Timo”对象(地址与第一句在堆中创建的地址不同),而str3则是这个对象的引用,因此执行此句时,创建了1个对象。
4. 执行到"System.out.println(str1 == str2)", “==”是判断对象的,由于str1指向的是Java堆中的“Timo”对象,而str2指向的是String常量池中的“Timo”对象,所以返回值为false。
5. 执行到"System.out.println(str1.equals(str3))",由于String类中的equals判断的是对象的内容而不是内存地址,由于所有内容都是Timo,所以返回值为true。

 本文是从网上各个博客总结改动完成,以此作为个人随笔,时刻记忆,时刻理解。

程序员麦兜【编程笔记】-String存储管理相关推荐

  1. 黑马程序员并发编程笔记(二)--java线程基本操作和理解

    3.java进程的基本操作 3.1.创建进程 方法一,直接使用 Thread // 构造方法的参数是给线程指定名字,,推荐给线程起个名字(用setName()也可以) Thread t1 = new ...

  2. 如何向新手程序员介绍编程?

     如何向新手程序员介绍编程? 学习Java,他们都说很easy. 作为一名刚从斯康星大学麦迪逊分校计算机科学系毕业的大学生,我通过一些编程课程认识了很多使用Java的朋友.现在很多学校都在从别的编 ...

  3. 程序员的数学笔记3--迭代法

    第三节课程,介绍的是迭代法. 前两节笔记的文章: 程序员的数学笔记1–进制转换 程序员的数学笔记2–余数 03 迭代法 什么是迭代法 迭代法,简单来说,其实就是不断地用旧的变量值,递推计算新的变量值. ...

  4. 程序员的数学笔记2--余数

    上一节程序员的数学笔记1–进制转换是介绍了进制,特别是十进制和二进制之间的转换,移位操作和逻辑操作. 今天介绍的是余数,看完本节笔记,你会发现生活中有很多东西都有余数的影子. 余数 余数的特性 整数是 ...

  5. 程序员面试宝典笔记1-基本概念预处理,const与sizeof

    程序员面试宝典笔记1-基本概念&预处理,const与sizeof 基本概念 赋值语句: i++: 类型转换 运算符问题 a,b交换与比较 其他 预处理 const sizeof 基本概念 赋值 ...

  6. c++ 读陈黎娟的《C、C++实践进阶之道,写给程序员的编程书》所感--关于变量的类型与引用

    最近在看陈黎娟的书<C.C++实践进阶之道,写给程序员的编程书>,其中第十一章讲的是变量和类型,现做笔记如下: 数据存储区域分只读数据区(存储常量和恒值,正常情况下不做修改).全局/静态存 ...

  7. python好学吗 老程序员-使用 Python 会降低程序员的编程能力吗?

    某些情况下会降低编程能力,某些情况下会提升编程能力,要看你怎么理解"编程能力". 1.使用 Python 会降低程序员的编程能力,这个假设成立的情形 如果强行要说使用Python可 ...

  8. 好程序员大数据笔记之:Hadoop集群搭建

    好程序员大数据笔记之:Hadoop集群搭建在学习大数据的过程中,我们接触了很多关于Hadoop的理论和操作性的知识点,尤其在近期学习的Hadoop集群的搭建问题上,小细节,小难点拼频频出现,所以,今天 ...

  9. c语言为什么有这么多的编程环境?_为什么98%的程序员学编程都会从C语言开始?...

    在互联网蓬勃发展的时代,有一类人做出了巨大的贡献,这一群人被大家称之为程序员,怎样才能成为一名优秀的程序员呢,为什么每一个程序员都需要学习C语言呢? 就让我来跟大家分享分享: 壹 第一:相比较其他的编 ...

  10. C/C++程序员的编程修养

    关注.星标公众号,不错过精彩内容 作者:陈浩 转自:嵌入式云IOT技术圈 什么是好的程序员?是不是懂得很多技术细节?还是懂底层编程?还是编程速度比较快?我觉得都不是.对于一些技术细节来说和底层的技术, ...

最新文章

  1. neo4j安装_基于Neo4j的知乎关系爬虫
  2. VTK:图片之ImageLaplacian
  3. 分享一个帮助用户全屏阅读的jQuery插件 - jQuery fullscreen
  4. 窗口类的注册生成和消息循环
  5. HALCON示例程序bottle.hdev、bottlet.hdev瓶体字符OCR的训练和检测
  6. 前端学习(1556):ng-blnd指令
  7. 如何命令行远程连接centos_如何使用windows远程控制centOS桌面
  8. 假期第7天……想和测试人聊聊这个问题
  9. CentOS 6.5源码编译安装MySQL 5.6
  10. 将ClearCase的客户端编码设置为UTF-8
  11. MAML++:HOW TO TRAIN YOUR MAML论文精读
  12. oracle查看表空间物理路径,oracle查看表空间物理文件的名称,路径及大小
  13. 初识Django 笔记
  14. 学习强国-为中华崛起而学习
  15. 应对机器学习中类不平衡的10种技巧
  16. 拼图、jquery拼图、javascript拼图
  17. 【JAVA8】Set排序四种写法-倒序
  18. mac地址储存在计算机的内存,mac地址通常存在计算机的
  19. 全志 H6 Orange Pi Lite 2 Android 7.0 去除无用配置
  20. 高级语言的程序被翻译的过程

热门文章

  1. admui 如何选择适合我的前端源码?
  2. java事务 Dao层_spring事务到底用于service层还是dao层
  3. Keil5在Debug的时候,有些地方无法打断点(问题已解决)
  4. 短视频如何写出吸引人的标题?学会这几招,让你的标题更有说服力
  5. ChatBot framework 开发实践
  6. mysql报错max_prepared_stmt_count的解决过程
  7. Neo4j-APOC扩展与使用
  8. 世界编程语言与大学_学习新世界语言的最佳免费在线大学课程
  9. 阶跃函数组合响应matlab,matlab在时域分析中的应用
  10. Java Map 键值对排序 按key排序和按Value排序