Java 字符串String 在堆,栈,常量池中

news2024/11/26 2:00:19

一、Java程序的运行会涉及以下的内存区域:

  1. 寄存器:JVM内部虚拟寄存器,存取速度非常快,程序不可控制。

  2. 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中。

  3. 堆:存放new出来的对象,注意创建出来的对象只包含各自的成员变量,不包括成员方法。

  4. 常量池:存放常量,如基本类型的包装类(Integer、Short)和String,注意常量池位于堆中。

  5. 代码段:用来存放从硬盘上读取的源程序代码。

  6. 静态域:用来存放static修饰的静态成员。

二、字符串的使用

 2.1 字符串常量:

String s1 = "hello";

String s2 = "hello";

s2 = "world";

说明:

     String s1 = "hello"; 是在栈中创建一个字符串类型的变量s1,并且变量s1直接指向常量池中的字符串对象”hello”,省去了中间的堆内存中的对象。

     注意的是,String s1 = "hello",这行代码被执行的时候,java虚拟机首先在字符串池中查找是否已经存在了值为"hello"这么一个对象,它的判断依据是String类equals(Object obj)方法的返回值。如果有,则不再创建新的对象,直接返回已存在对象的引用;如果没有,则先创建这个对象,然后把它加入到字符串池中,再将它的引用返回 。

2.2 字符串存储

String s1 = "hello";

String s2 = "hello";

String s3 = "world";

String s4 = new String("hello");

String s5 = new String("world");

说明:

   实例化:String s4 = newString("hello"); 创建了两个对象,一个是在常量池中,一个是在堆内存中,常量池的为"hello",堆内存中为new String()。变量s4指向该new string()对象,而该对象又指向在常量池中的字符串常量”hello”。注意的是,在new的时候java虚拟机先去内存的常量池中查找”hello”这个对象,如果有就不创建了,直接把堆中的对象指向该字符串。

总结:

  字符串常量存储在字符串常量池,目的是共享
  字符串非常量对象存储在堆中。

2.3 字符串比较:

String s1 = "JAVA";
String s2 = "JAVA";
String s3 = new String("JAVA");
String s4 = new String("JAVA");
System.out.println(s1 == s2);//true
System.out.println(s1 == s3);//false
System.out.println(s1 == s4);//false
System.out.println(s3 == s4);//false

2.4 字符串对象

Student stu1 = new Student("Mike",18);
Student stu2 = new Student("Mike",18);
System.out.println(stu1.name == stu2.name);//true

2.5 String使用的陷阱 

  String s1 = "a";
说明:在字符串常量池中创建了一个字面量为"a"的字符串。


 s1 = s1 + "b";
说明:实际上原来的“a”字符串对象已经丢弃了,现在在堆空间中产生了一个字符
串s1+"b"(也就是"ab")。如果多次执行这些改变串内容的操作,会导致大量副本
字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响
程序的性能。


 String s2 = "ab";
说明:直接在字符串常量池中创建一个字面量为"ab"的字符串。


 String s3 = "a" + "b";
说明:s3指向字符串常量池中已经创建的"ab"的字符串。


String s4 = s1.intern();
说明:堆空间的s1对象在调用intern()之后,会将常量池中已经存在的"ab"字符串
赋值给s4。
 

 2.6 字符串的特性

String s1 = "hello";
String s2 = "world";
String s3 = "hello"+"world";
String s4 = s1+"world";
String s5 = s1+s2;
String s6 = (s1+s2).intern;
System.out.println(s3 == s4);//false
System.out.println(s3 == s5);//false
System.out.println(s4 == s5);//false
System.out.println(s3 == s6);//true

结论:
 常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。
 只要其中有一个是变量,结果就在堆中
 如果拼接的结果调用intern()方法,返回值就在常量池中 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/393645.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全同态加密:FHEW

参考资料: Micciancio D, Peikert C. Trapdoors for Lattices: Simpler, Tighter, Faster, Smaller[C]//Eurocrypt. 2012, 7237: 700-718.Alperin-Sheriff J, Peikert C. Faster bootstrapping with polynomial error[C]//Advances in Cryptology–CRYPTO 2014: 34…

css盒模型详解

一、引言 盒模型是网页开发中的一个基本概念,它描述了网页元素的外观和大小。盒模型由内容区域、内边距、边框和外边距四个部分组成,这些部分的大小和位置都可以通过CSS进行控制。在本文中,我们将介绍盒模型的概念和作用,并提出本…

一、SpringMVC概述

1.什么是SpringMVC 基于MVC开发模式的框架,用来优化控制器.它是Spring家族的一员.它也具备IOC和AOP. 什么是MVC?   一种开发模式,模型视图控制器的简称.所有的web应用都是基于MVC开发.   M:模型层,包含实体类,业务逻辑层,数据访问层   V:视图层,html,javaScript,vue等都…

MySQL安装和配置

下载官网下载mysql解压版本:配置环境变量下载完成后直接解压到需要放的文件夹,根据文件夹来配置环境变量;新建系统变量,变量名自取,值是MySQL的目录编辑path环境变量,加上MySQL的bin目录 %MYSQL_HOME%\bin配…

【python】序列(列表、元组)、字典、集合的初步认识

一、序列 序列类型(sequence):一组有序的数据集,特点是数据之间存在先后关系,通过序号访问 序列包含以下三种类型: 1.字符串(str)不可修改 2.列表(list)可修改 3.元组(t…

基于java的高校辅导员工作管理系统

摘 要网络技术的快速发展给各行各业带来了很大的突破,也给各行各业提供了一种新的管理模块,对于高校辅导员工作管理将是又一个传统管理到智能化信息管理的改革,设计高校辅导员工作管理系统的目的就是借助计算机让复杂的班级信息、学籍信息等管…

如何使用JSR 303 进行后台数据校验?

文章目录一、JSR 3031、什么是 JSR 303?2、为什么使用 JSR 303?3、JSR 303 常见操作?二、使用 JSR 303 相关注解处理逻辑1、JSR 303 注解处理逻辑1.1 使用步骤1.2 实际应用2 、JSR 303 分组校验2.1 为什么使用 分组校验?2.2 使用步…

软件设计师教程(八)计算机系统知识-软件工程基础知识

软件设计师教程 软件设计师教程(一)计算机系统知识-计算机系统基础知识 软件设计师教程(二)计算机系统知识-计算机体系结构 软件设计师教程(三)计算机系统知识-计算机体系结构 软件设计师教程(…

【C++】list迭代器的深度剖析及模拟实现(感受类封装,类和对象的思想)

早点睡兄弟,别一天到晚就熬夜。 文章目录一、通过list迭代器来感受类和对象以及类封装的思想1.迭代器的特征和本质是什么?(两大特征:类的内嵌类型,行为像指针。本质:内置类型定义的变量或自定义类型实例化…

Linux命令·less

less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大。less 的用法比起 more 更加的有弹性。在 more 的时候,我们并没有办法向前面翻, 只能往后面看,但若使用了 less …

Java Stream 如何提高遍历集合效率?

目录什么是 Stream?Stream 如何优化遍历?Stream 源码实现内部实现Stream 并行处理什么是 Stream? Stream 的聚合操作与数据库 SQL 的聚合操作 sorted、filter、map 等类似。我们在应用层就可以高效地实现类似数据库 SQL 的聚合操作了&#x…

Spring MVC 详解(连接、获取参数、返回数据)

在之前我们先简单那谈谈Spring、SpringBoot以及Spring MVC框架之间有什么关系?首先Spring是一个框架,SpringBoot脚手架是为了快速开发Spring框架而创造的技术。可以理解为SpringBoot又在Spring上面包了一层壳子,是基于Spring的,是…

xxl-job调度中心、执行器源码详解

文章目录简介调度中心一.程序启动初始化1.初始化入口类2.初始化I18n3.初始化快慢调度线程池4.初始化处理执行器注册或移除线程池更新执行器最新在线的守护线程5.初始化监控任务调度失败或执行失败的守护线程6.初始化处理执行器回调线程池监控任务执行结果丢失的守护线程7.初始化…

创建虚拟机、添加镜像以及配置虚拟机

一、创建虚拟机 1、点击 “创建新的虚拟机” 2.选择“自定义配置” 到后面可以选择硬件的类型 3.默认值就行 4.选择 “稍后安装操作系统” 5.操作系统选择 “Linux”,版本结合镜像自行选择 6. 虚拟机的名称自行定义, 就是上述显示出来的名称。 虚拟机…

Mybatis使用手册

Myabtis 官网文档 官网网站&#xff1a;https://mybatis.org/mybatis-3/zh/index.html 搭建环境 项目结构 引入依赖 创建Maven项目&#xff0c;pom依赖文件中加入mybatis和jdbc驱动依赖。 <dependency><groupId>org.mybatis</groupId><artifactId>…

CSS渐进增强方案

首先需要明确一点&#xff0c;以往浏览器对css的支持是不同的&#xff0c;不同浏览器的样式可能会存在差异&#xff0c;对待这种差异问题&#xff0c;需要写几套不同的css来兼容&#xff08;边框、圆角、颜色等&#xff09;&#xff0c;这样是非常麻烦的&#xff0c;浏览器css显…

Go项目(订单微服务)

文章目录简介handlerUTweb支付服务Notify小结简介 这部分开始梳理订单微服务的关键点这里仿京东&#xff0c;订单结算在购物车进行&#xff0c;所以用户的操作是加入商品到购物车&#xff0c;进入购物车付款从页面分析需求 点击添加到购物车&#xff0c;删除车中商品&#xff…

JAVA环境配置多环境(全,细,简单)

下载java包&#xff1a;https://www.oracle.com/java/technologies/downloads &#xff08;8版本稳定&#xff09; 直接无脑安装java程序 &#xff08;包括jdk-开发与jre-运行&#xff09; 接下来是java环境配置&#xff1a; 创建系统变量 &#xff08;用户变量也可以&#…

近红外吸收荧光染料IR-808,IR-808 NH2,IR-808 amine,发射808nm 性质分享

中文名称&#xff1a;IR-808 氨基英文名称&#xff1a;IR-808 NH2&#xff0c;IR-808 amine&#xff0c;IR-808-NH2规格标准&#xff1a;10mg&#xff0c;25mg&#xff0c;50mgCAS&#xff1a;N/A产品描述&#xff1a;IR-808&#xff0c;发射808nm&#xff0c;酯溶性染料修饰氨…

[NOIP2003 提高组] 侦探推理(C++,字符串)

题目描述 明明同学最近迷上了侦探漫画《柯南》并沉醉于推理游戏之中&#xff0c;于是他召集了一群同学玩推理游戏。游戏的内容是这样的&#xff0c;明明的同学们先商量好由其中的一个人充当罪犯&#xff08;在明明不知情的情况下&#xff09;&#xff0c;明明的任务就是找出这…