首页 > 其他分享 >String存储原理

String存储原理

时间:2024-09-14 22:22:11浏览次数:3  
标签:存储 String 对象 s1 字符串 原理 Hello 常量

1.是什么

        在Java中,String 是一种特殊的类,它是不可变的并且存储在堆内存中。为了理解 String 的存储原理,我们需要分解几个关键概念:不可变性、堆内存、字符串常量池和垃圾回收机制。下面我将详细解释这些概念并举例说明。


不可变性 (Immutability)

    String 类在Java中是不可变的,这意味着一旦创建了 String 对象,它的值就不能被修改。任何对 String 进行的修改操作,实际上都是创建了一个新的 String 对象,而不会修改原来的对象。

例子:

String s1 = "Hello";
s1 = s1 + " World";

        在上面的例子中,s1 最初指向了字符串 "Hello",当我们执行 s1 + " World" 时,实际上创建了一个新的字符串 "Hello World",并将 s1 重新指向该新字符串,原来的字符串 "Hello" 保持不变。

为什么不可变?
  • 线程安全:不可变对象是线程安全的,多线程操作时不需要加锁。
  • 字符串常量池优化:不可变对象允许 Java 使用字符串常量池,以提高性能和内存使用效率。

字符串常量池 (String Constant Pool)

        Java 提供了一个特殊的内存区域叫做字符串常量池,用于存储字符串字面量。在 Java 中,字符串常量池位于堆内存中。

当一个字符串字面量被创建时,Java 会首先检查字符串常量池中是否已经存在相同的字符串:

  • 如果存在,直接返回池中的引用,不会创建新对象。
  • 如果不存在,则在池中创建一个新的字符串对象。

例子:

String s1 = "Hello";
String s2 = "Hello";
System.out.println(s1 == s2); // 输出 true

        在这个例子中,s1s2 都引用了常量池中的同一个字符串 "Hello",因此 s1 == s2true。即便它们是两个变量,但由于指向相同的常量池对象,所以它们在内存中是同一个对象。

注意: 如果通过 new String() 创建字符串,则它会在堆内存中创建一个新的对象,而不会将其存储在常量池中。

例子:

String s1 = new String("Hello");
String s2 = "Hello";
System.out.println(s1 == s2); // 输出 false

        这里,s1 通过 new 关键字创建,因此它在堆中有一个新的内存位置,而 s2 是引用常量池中的对象,因此 s1 == s2false


堆内存 (Heap Memory)

        在Java中,所有的对象(包括 String 对象)都存储在堆内存中。String 对象有两种存储方式:

  • 字符串字面量存储在字符串常量池中。
  • 通过 new 关键字创建的 String 对象存储在堆中,但它们的内容可能仍然引用常量池中的字符串。

例子:

String s1 = new String("Hello");
String s2 = "Hello";

在此示例中:

  • "Hello" 首先存储在字符串常量池中。
  • s1 是通过 new 创建的,所以会在堆中创建一个新对象,这个对象的值仍然是 "Hello",但它和常量池中的 "Hello" 是不同的对象。

    字符串拼接与优化

        因为字符串是不可变的,每次对字符串进行操作(如拼接)时,都会创建新的对象。这种操作如果频繁使用,可能会导致性能问题。因此,Java 提供了 StringBuilderStringBuffer 来进行可变字符串的处理,它们不会像 String 那样每次创建新对象,而是修改现有对象的内容。

例子:

String s = "Hello";
s = s + " World";  // 每次拼接都会创建新字符串

// 使用StringBuilder进行优化
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World");
System.out.println(sb.toString());  // 输出 Hello World

        使用 StringBuilder 进行拼接时,sb 不会创建新对象,而是直接修改现有的字符串对象。


垃圾回收 (Garbage Collection)

        当一个 String 对象不再被引用时,Java 的垃圾回收机制会在适当的时候回收这些对象的内存。由于字符串常量池中的对象是共享的,因此它们不会被垃圾回收,除非整个池中的引用都不存在了。

总结:

  1. String 是不可变的,一旦创建就不能修改。
  2. 字符串常量池 用于存储字面量字符串以提高内存效率。
  3. 通过 new 关键字创建的字符串对象 存储在堆内存中,并且不存储在常量池中。
  4. 频繁修改字符串 应该使用 StringBuilderStringBuffer 以提高性能。

标签:存储,String,对象,s1,字符串,原理,Hello,常量
From: https://blog.csdn.net/2401_83418369/article/details/142267262

相关文章

  • 【视频讲解】线性时间序列原理及混合ARIMA-LSTM神经网络模型预测股票收盘价研究实例
    原文链接:https://tecdat.cn/?p=37702 原文出处:拓端数据部落公众号 分析师:DongzhiZhang 近年来人工神经网络被学者们应用十分广泛,预测领域随着神经网络的引入得到了很大的发展。本文认为单一神经网络模型对序列所包含的线性信息和非线性信息的挖掘是有限的,因此本文为了进一......
  • TiDB 数据库核心原理与架构_Lesson 01 TiDB 数据库架构概述课程整理
    作者:尚雷5580注:本文基于TiDB官网董菲老师《TiDB数据库核心原理与架构(101)》系列教程之《Lesson01TiDB数据库架构概述》内容进行整理和补充。一、TiDB体系架构1.1TiDB五大核心特性一键水平扩缩容得益于存储与计算分离的架构,TiDB支持按需对计算和存储进行在线扩......
  • SpringBoot集成Redis以及StringRedisTemplate的使用
    引言该篇文章介绍了在SpringBoot项目中,集成了Redis,Redis提供了RedisTemplate的扩展StringRedisTemplate,用于对字符串的操作,使用StringRedisTemplate,不需要(写RedisConfig)额外设置序列化。不过存取对象需要自己序列化、反序列化。本文会介绍配置,以及连接Redis,还有使用的部分代......
  • Eureka原理与实践:构建高效的微服务架构
    Eureka原理与实践:构建高效的微服务架构引言随着微服务架构的日益普及,服务的数量和复杂性不断增加,如何有效地管理这些服务成为了一个重要的挑战。Eureka,作为Netflix开源的服务发现组件,凭借其简单、健壮的特性,在微服务领域占据了举足轻重的地位。本文将深入探讨Eureka的原理......
  • Kubernetes怎么进行NFS动态存储迁移
    环境查看系统环境#cat/etc/redhat-releaseCentOSLinuxrelease7.9.2009(Core)#uname-aLinuxCentOS7K8SMaster010633.10.0-1160.108.1.el7.x86_64#1SMPThuJan2516:17:31UTC2024x86_64x86_64x86_64GNU/Linux软件环境#kubectlversionClientVersion:ver......
  • Python存储与读写二进制文件
    本文介绍了一种在Python中将Numpy数组转存为一个紧凑的二进制格式的文件,及其使用内存映射的形式进行读取的方案。一个二进制的数据流,不仅可以更加方便页形式的内存映射,相比于传统的Numpy单精度浮点数数组还有一个可哈希的特性。总体来说是一个对于高性能计算十分友好的存......
  • 监控存储可以用来备份服务器数据吗
    监控存储通常是为了捕获和存储监控数据而设计的,例如系统日志、性能指标、网络流量等信息。它并不是为了备份服务器数据而设计的。以下是关于监控存储与数据备份之间的区别:监控存储:目的:监控存储的目的是为了持续跟踪和记录系统的状态和性能,以便于实时监控和分析。数据类型:监控存储通......
  • Vue3中Pinia存储和修改数据应用实践
    安装pinia:npminstallpiniamain.ts中使用pinia://引入createApp用于创建应用import{createApp}from'vue'//引入App根组件importAppfrom'./App.vue'//引入路由器importrouterfrom'./router'//创建一个应用constapp=createApp(App)//使用路由器app.use......
  • MySQL存储引擎:InnoDB与MyISAM
    InnoDB和MyISAM是MySQL数据库中两种常用的存储引擎,它们在数据存储结构、事务支持、锁的支持、外键支持、性能等方面存在显著的差异。下面将详细介绍这两种存储引擎的特点和优势。什么是存储引擎​MySQL中的数据用各种不同的技术存储在文件(或者内存)中。每一种技术都使......
  • 存储芯片行业的封装类型
    存储芯片行业的封装类型存储芯片分类:随机存储器(RAM):这是易失性存储器,断电后存储的数据会丢失。它包括:动态随机存储器(DRAM):这是最常见的系统内存类型,用于与CPU直接交换数据。DRAM需要定期刷新以保持数据,因为它使用电容来存储信息。DRAM的常见类型包括:同步动态随机存储器......