从堆和栈的角度看String对象

本文深入探讨Java中String对象的内存分配方式,包括其在堆和栈中的存储机制,以及字符串常量池的作用。通过具体示例解释了如何使用==操作符比较String对象。
String对象问题曾困扰我很长时间,总是不太明白它与基本数据类型之间的区别,看了java内存分配,得到了一点启发,下面从堆和栈的角度看一下String对象在内存中是如何操作的。

首先看一下堆和栈的区别

栈:栈中存放的是基本类型的变量或者引用类型的变量。其中局部变量是通过数组的索引来访问,操作数栈通过栈操作才实现。局部变量有利于内存空间的高效利用, 方法运行完就回收,而对于类成员变量,只要对象还在,即使方法运行结束,成员变量还是存在。

堆:存放通过new关键字新建的对象和数组。声明的对象是在堆内存中初始化,对象的数据存放在堆中,不可以直接访问。引用变量保存了堆中对象的地址,它保存在栈中,用来引用堆中的对象。

栈代表了运行的逻辑,堆代表了运行时的数据。

我们对堆和栈有了基本的理解,现在我们步入正题,String对象。
首先我们从一个例子来看。

String s1 = "hello";
String s2 = new String("hello");
String s3 = "hello";
String s4 = new String("hello");
System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s2 == s4);


答案是:false, true, false
首先我们看一下 String s2 = new String("hello"), 和正常的创建对象一样,通过new String("hello") 在堆内存中创建了一个String对象,堆给这个对象分配内存空间,对象的内容是”hello“,记住对象保存在堆中。唯一不同的是JVM为string设置了一个常量池,用new关键字的同时,在常量池中也会产生一个“hello”对象,也就是说 new String("hello")会在堆和字符串常量池中分别创建一个对象。s2就是所谓的引用变量,s2是保存在栈中,它里面的内容是这个对象在堆中的内存地址,正如上面所说对象是不能直接调用的,只能通过引用变量来调用。并且new一次,堆就会给这个对象分配内存空间。对于==操作符,只有当两个引用变量指向同一个对象时才返回true,因此s2 == s4返回false。

对于String s1 = "hello", 它首先会在字符串常量池中寻找是否有‘’hello”,如果存在,就把指向“hello”的引用变量里面的值赋值给新的引用变量,在这个例子中就是把s1里面的内容赋值给s3,他们实际上是指向的同一个对象,因此s1 == s3返回true。如果字符串常量池中不存在“hello”,此时首先在常量池中创建一个对象,然后让当然的引用变量指向这个地址。对于这个例子,s1指向的是常量池里的“hello”,s2指向的是堆中的“hello”,因此s1 == s2返回false。JVM是为了提高效率才设计了这样的操作。如果每次都用new关键字,会造成内存的浪费。

个人的一点体会,如有错误的地方希望大家指出!
采用PyQt5框架与Python编程语言构建图书信息管理平台 本项目基于Python编程环境,结合PyQt5图形界面开发库,设计实现了一套完整的图书信息管理解决方案。该系统主要面向图书馆、书店等机构的日常运营需求,通过模块化设计实现了图书信息的标准化管理流程。 系统架构采用典型的三层设计模式,包含数据存储层、业务逻辑层用户界面层。数据持久化方案支持SQLite轻量级数据库与MySQL企业级数据库的双重配置选项,通过统一的数据库操作接口实现数据存取隔离。在数据建模方面,设计了包含图书基本信息、读者档案、借阅记录等核心数据实体,各实体间通过主外键约束建立关联关系。 核心功能模块包含六大子系统: 1. 图书编目管理:支持国际标准书号、中国图书馆分类法等专业元数据的规范化著录,提供批量导入与单条录入两种数据采集方式 2. 库存动态监控:实时追踪在架数量、借出状态、预约队列等流通指标,设置库存预警阈值自动提醒补货 3. 读者服务管理:建立完整的读者信用评价体系,记录借阅历史与违规行为,实施差异化借阅权限管理 4. 流通业务处理:涵盖借书登记、归还处理、续借申请、逾期计算等标准业务流程,支持射频识别技术设备集成 5. 统计报表生成:按日/月/年周期自动生成流通统计、热门图书排行、读者活跃度等多维度分析图表 6. 系统维护配置:提供用户权限分级管理、数据备份恢复、操作日志审计等管理功能 在技术实现层面,界面设计遵循Material Design设计规范,采用QSS样式表实现视觉定制化。通过信号槽机制实现前后端数据双向绑定,运用多线程处理技术保障界面响应流畅度。数据验证机制包含前端格式校验与后端业务规则双重保障,关键操作均设有二次确认流程。 该系统适用于中小型图书管理场景,通过可扩展的插件架构支持功能模块的灵活组合。开发过程中特别注重代码的可维护性,采用面向对象编程范式实现高内聚低耦合的组件设计,为后续功能迭代奠定技术基础。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值