String 内存分配

String 对象内存分配策略 这个问题可以说是一个高频的面试题目,以前把这个问题弄懂了,最近突然想到这个问题,一时间竟然没有太好的思路了。所以花些时间整理一下其中的知识点。 一、内存分配策略 我们先来看一个题目(这个问题都快看吐了~),你知道正确的运行结果并给出解释吗。不知道也没关系,我会在下面给出具体的分析。 @Test public void test() { String s1 = "ab... 阅读详情

看了好多文章,网上大多数文章写的不是很详细,结合很多文章之后,写下自己的理解


从一个例子开始

String s = new String( "myString" );

其中字符串常量是”myString”,在编译时被存储在常量池(常量池在方法区)的某个位置。在解析阶段,虚拟机发现字符串常量”myString”,它会在一个内部字符串常量列表中查找,如果没有找到,那么会在堆里面创建一个包含字符序列[myString]的String对象s1,然后把这个字符序列和对应的String对象作为名值对( [myString], s1 )保存到内部字符串常量列表中(内部字符串常量列表存在string pool中,其实现是StringTable类)。然后执行new String 在堆里面创建一个对象,其包含字符串序列[myString],然后返回其地址给栈中的s。也就是说,这里创建了两个对象,一个是指向常量池中的s1,第二个是堆中的new出来的对象。

如果虚拟机后面又发现了一个相同的字符串常量myString,它会在这个内部字符串常量列表内找到相同的字符序列,然后返回对应的String对象的引用。维护这个内部列表的关键是任何特定的字符序列在这个列表上只出现一次。

例如
String s2 = "myString"
运行时s2会从内部字符串常量列表内得到s1的返回值,所以s2和s1都指向同一个String对象。但是String对象s在堆里的一个不同位置,所以和s1不相同。

JAVA中的字符串常量可以作为String对象使用,字符串常量的字符序列本身是存放在常量池中,在字符串内部列表中每个字符串常量的字符序列对应一个String对象,实际使用的就是这个对象。

2.字符串截留intern

在某些上下文环境下,仅仅保留某个字符串的一份copy能够提高内存的使用和效率。String类的intern()方法可以截留字符串,如果String对象包含的字符序列不在字符串常量内部列表中,那么就把这个String对象包含的字符序列和String对象的引用作为名值对保存到内部列表中,最后intern()返回一个指向String对象本身的引用;如果 String对象包含的字符序列在字符串常量内部列表中,那么就返回列表的名值对中的对应的字符串对象引用,而String对象本身的就会被丢弃。

例如,s.intern()就会返回和s2相同的引用,而以前的s对象就会被垃圾回收。

使用intern()要注意,被放到字符串内部列表中的字符串对象是不会被垃圾回收的,生命周期和整个程序相同,所以如果使用不当会造成内存泄露。

内容大部分取自 http://blog.youkuaiyun.com/sureyonder/article/details/5569366 再加上自己理解

String与StringBuilder的区别 内存分配 1.什么时候用String?什么时候用StringBuilder? 字符串一旦创建就不可修改大小,每次使用System.String类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的String对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用System.Text.StringBuil... 阅读详情

相关推荐

手把手教你用GNU Radio和PlutoSDR搭建FM收音机(附完整流程图)

本文提供了一份详细的实践指南,教你如何使用GNU Radio和PlutoSDR搭建一个功能完整的FM收音机。从软硬件环境准备、核心流程图构建,到运行调试与效果优化,手把手带你完成从射频信号接收、下变频、FM解调到音频输出的全过程,是入门软件定义无线电(SDR)的绝佳实践项目。

weixin_29189377的博客 749

C++类与动态内存分配

C++类与动态内存分配

Jasmine-Lily的博客 1107

【计算机科学导论实验】加法图灵机模拟 题解

本文提供计算机科学导论课程“图灵机加法器”实验的个人思路,仅供参考。

Chavapa's blog 2577

用栈和堆来理解 String

分析String在不同的实例化方法中创建了几个堆和栈

LUOZONGW的博客 1596

光伏系统选型指南:5种主流MPPT算法优缺点对比(附选型流程图)

本文深入剖析了光伏系统中五种主流MPPT算法的核心原理与性能差异。通过对比扰动观察法、电导增量法、恒定电压法、模糊逻辑控制及人工智能算法在追踪精度、响应速度、实现成本与稳定性等方面的表现,为不同应用场景(如户用、工商业及大型电站)提供了清晰的选型决策流程图和实战指南,帮助工程师优化系统效率与投资回报。

weixin_29294597的博客 106

CMake教程:C++ CMake自定义find_package并在其它项目使用

find_package 是 CMake 中一个非常重要的命令,用于在系统中找到外部库或包,并将其包含到项目中。: 要查找的包的名称。[version]: 可选的版本号。如果指定了版本号,CMake 会尝试找到该版本或更高版本的包。[REQUIRED]: 如果指定了这个关键字,找不到包时会产生一个错误并终止配置过程。: 指定要查找的包的组件。: 指定可选的组件,即使找不到这些组件,配置过程也会继续。: 指定查找包的模式,CONFIG表示查找配置文件,MODULE表示查找模块文件。

琅嬛福地 1563

String 堆内存和栈内存

java把内存划分为两种:一种是栈(stack)内存,一种是堆(heap)内存   在函数中定义的一些基本类型的变量和对象的引用变量都在栈内存中分配,当在一段代码块定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用   堆内存用来存放由new创建的对象和数组,在堆中分配的内

房东的猪 898

Altium Designer应用技巧13: 四层板的拼版方法

本文介绍在Altium Designer中,进行4层板的拼版方法。Altium Designer有多种拼版方法,本文选择最直观的复制、删帖方法来完成,步骤如下: 1、看一下原始文件,如下图所示,我们要对该板进行拼版操作。 2、通过菜单“报告”-“板子信息”得到板子大小,在这里一般切换为mm比较好操作,我们可以使用快捷键"q"。 3、如果是水平拼版,我们需要关心水平长度;如果是垂直拼版...

snmplink的博客 1万+

C++入门 string类

c++ string 内存分配及使用

tangliang_cn的博客 541

【C语言学习疑难杂症】第20期:0x00007FF7F2821964处引发的异常0xC0000005写入位置 0x0000000000000

检查代码中是否存在野指针访问的情况,确保在进行写入操作之前,内存已经被正确分配或初始化,并且在使用完毕后进行了正确的释放。空指针访问:代码尝试在空指针地址(0x0000000000000000)处进行写入操作,导致访问冲突。检查代码中是否存在数组越界的情况,确保在进行写入操作之前,数组的索引值在合法范围内。检查代码中是否存在空指针访问的情况,确保在进行写入操作之前,指针已经被正确初始化。野指针访问:代码尝试在已释放或未初始化的内存地址进行写入操作,导致访问冲突。

学无止境 828

Gitlab通过Webhook自动触发Jenkins构建任务并在更新完毕后发送钉钉消息通知

Gitlab通过Webhook自动触发Jenkins构建任务并在更新完毕后发送钉钉消息通知 文章目录Gitlab通过Webhook自动触发Jenkins构建任务并在更新完毕后发送钉钉消息通知1.实现思路2.新增钉钉机器人并测试消息的发送2.1.新增钉钉机器人2.2.测试发送消息到钉钉3.在Jenkins中新建一个构建任务3.1.新建任务3.2.配置任务时增加参数化构建过程3.3.配置任务添加git地址3.4.配置构建触发器生成gitlab webhook使用的token3.5.配置任务构建过程中执行的She

江晓龙的博客 3809

图解 C++ 中 std::string 的内存布局

上面的汇编代码,其实大部分我都看不懂,主要是注释给了我提醒,那么实现 string 类的代码里,是不是应该有注释里提到的这些方法?为此,我们写了个函数,如方法名所示,获取字符串中的第一个字符,要实现这个功能,汇编代码的执行肯定要涉及上述逻辑。注意:以上的测试基于我当前使用的编译器,根据 StackOverflow 的一些回答,其他的编译器可能有不同的存储策略,本文暂不涉及。同样可以通过修改更长的字符串验证,当字符串长度增长时,分配的堆空间也会增长,而且因为对齐的限制,通常会超过字符串实际长度。

木牛的博客 4756

基于YOLOv11的工业零件表面缺陷检测系统:从原理到实现

工业质量控制是制造业的核心环节,表面缺陷检测作为其中重要组成部分,直接关系到产品质量和企业效益。本文详细介绍了一种基于YOLOv11深度学习算法的工业零件表面缺陷检测系统,包含完整的算法原理分析、数据集构建方法、模型训练策略以及用户界面设计。通过大量实验验证,该系统能够高效准确地检测零件表面的划痕、凹陷、锈蚀等多种缺陷,检测精度达到96.2%,满足工业实时检测需求。本文还提供了完整的代码实现和详细的技术文档,为相关领域的研究者和工程师提供参考。关键词:表面缺陷检测;YOLOv11;深度学习;工业视觉;

YOLO 567

java String的内存分配

近日小编学习了《深入理解java虚拟机》,其中对于java中String的内存分配自己的一些理解,话不多说上代码。 String str1 = "hello"; String str2 = "hello"; String str3 = new String("hello"); String str4 = new String("hello"); ...

l769440473的博客 296

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

String的内存分配与拼接操作

String的内存分配与拼接操作。

mh17680313750的博客 1116

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

String的内存分配

String的内存分配

xiaotai1234的博客 265

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

java内存分配 string_JVM内存分配及String常用方法解析

一,JVM内存分配和常量池在介绍String类之前,先来简单分析一下在JVM中,对内存的使用是如何进行分配的。如下图所示(注意:在jdk1.8之后便没有方法区了):​​ 如上JVM将内存分为多个不同的区域,这些区域都有各自的用途、创建和销毁的时间,有些区域随虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束来建立和销毁。​ 区域名称的说明:1.1,方法区:属于数据共享内存区域,存储已被虚...

weixin_39808953的博客 259

Java中String类的内存分配

Java中的String类非常重要,功能强大,这里我们只谈它的内存分配。 物理的内存是线性结构,并不存在拥有不同功能的不同区域。 编译器(或者JVM)为了更高效地处理数据,会用不同的算法把内存分为各种区域,不同的区域拥有各自的特性,Java中,内存可以分为栈,堆,静态域和常量池等。(可能有不同的叫法,但逻辑是一致的) 不同内存区域的功能和特点: 栈区:存放局部变

梦是现实之补充 995

Java 内存分配及String类型详解

Java 内存分配及String类型详解March 28th, 2008  | Categories: Java  | Tags: JavaJava 把内存划分成两种:一种是栈内存,另一种是堆内存。在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配

Go for it! 1695

Jvm内存分配和String的存储过程探究

在java语言的所有数据类型中,String类型是比较特殊的一种类型,同时也是面试的时候经常被问到的一个知识点,本文结合java内存分配深度分析关于String的许多令人迷惑的问题。下面是本文将要涉及到的一些问题,如果读者对这些问题都了如指掌,则可忽略此文。 1、java内存具体指哪块内存?这块内存区域为什么要进行划分?是如何划分的?划分之后每块区域的作用是什么?如何设置各个区域的大小? 2、S...

乐此不皮的博客 277

关于创建String对象过程的内存分配

关于创建String对象过程的内存分配 常量池(Constant Pool):指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。JVM虚拟机为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集和,包括直接常量(String,Integer和 Floating point常量)和对其他类型,字段和方法的符号引用。对于String常量,它的值是在常

Steampy专栏 7354

java复习--String的内存分配

关于String的特性介绍 前言: 写这篇博客是因为本人已经大三了,不想考研,要忙着找实习工作了。 在做一些相关的java复习题时,发现自己对一些java里面的特性不是很清楚,通过博客记录题目的同时深挖一些相关的特性。 话不多说,进入正题。 上题: class TestString { public static void main(String[] args) { St...

One_Ok_Clock的博客 2449

String内存分配

Java中的String类非常重要,功能强大,这里我们只谈它的内存分配。 方法/步骤 1 物理的内存是线性结构,并不存在拥有不同功能的不同区域。 编译器(或者JVM)为了更高效地处理数据,会用不同的算法把内存分为各种区域,不同的区域拥有各自的特性,Java中,内存可以分为栈,堆,静态域和常量池等。(可能有不同的叫法,但逻辑是一致的) 2

Seven__________7的博客 619

java 内存分配及String类 内存分配,个人笔记

个人见解 栈需要知道被存储对象(不管是对象还是对象引用)的大小,而堆不需要。 因此对象引用存在栈中,而对象本身存储在堆中。 如同一本书,栈是目录这样的一个角色,堆是内容。 有了这样的思路,很容易推断出你想要的答案。 原子类型,数据就是自身。因此直接存在栈中。 java堆与栈 java String分配内存空间(详解)

我的学习之路 768

java内存分配 string_JVM内存模型及String对象内存分配

2、String对象内存分配分析先看以下代码,运行后,结果如代码1,2,3,4,5,6行所示[java]viewplaincopypackagecom.xtli.controller;publicclassStringTest{publicstaticvoidmain(String[]args){Strings1="hello";Strings2="worl...

weixin_39589511的博客 95

java内存分配和String的深度解析

摘要: 从整体上介绍java内存的概念、构成以及分配机制,在此基础上深度解析java中的String类型,从内存分配情况来解析String对象的特性。 一、引题 在java语言的所有数据类型中,String类型是比较特殊的一种类型,同时也是面试的时候经常被问到的一个知识点,本文结合java内存分配深度分析关于String的许多令人迷惑的问题。下面是本文将要涉及到的一些问题,如果读者对这些问题都了如...

qq_40321119的博客 256
上一篇: LintCode - 数组 - 132 Pattern
下一篇: java并发编程
_jayjune
博客等级 码龄11年 3粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值