为什么在Java中String是不可变的?

CVE-2017-7921漏洞深度解析:海康设备明文密码泄露原理与七层防御 网络摄像头安全本质上是嵌入式Web服务安全,其核心在于身份认证机制是否健全。CVE-2017-7921并非传统远程执行漏洞,而是因信任错位导致的未授权API暴露——`/Security/users/1`接口绕过Session校验,直接返回admin明文密码。该问题根植于安防设备早期‘物理隔离+前端可控’的设计假设,在P2P、云平台等新场景下全面失效。技术价值在于揭示了轻量级HTTP服务中路径级访问控制缺失的普遍风险;典型应用场景包括ONVIF协议接管、Telnet后门登录及NVR侧横向移动。本文基于DS-2 阅读详情

String在Java中是不可变的。不可变类只是其实例无法修改的类。创建实例时实例中的所有信息都会初始化,并且无法修改该信息。不变类有很多优点。本文总结了为什么String被设计为不可变的。这篇文章从内存,同步和数据结构的角度说明了不变性概念。

1.字符串池的要求

字符串池(String intern pool)是“ 方法区”中的特殊存储区。创建字符串时,如果该字符串已存在于池中,则将返回现有字符串的引用,而不是创建新对象。

以下代码将在堆中仅创建一个字符串对象。

String string1 = "abcd";
String string2 = "abcd";

外观如下:

如果字符串是可变的,则用一个引用更改字符串会导致其他引用的值错误。

2.缓存哈希码

字符串的哈希码在Java中经常使用。例如,在HashMap或HashSet中。不可变保证哈希码始终是相同的,因此无需担心更改即可将其兑现,这意味着无需每次使用哈希码就可以计算出来。这样更有效。

在String类中,它具有以下代码:

private int hash;//this is used to cache hash code.

3.促进其他对象的使用

要具体说明,请考虑以下程序:

HashSet<String> set = new HashSet<String>();
set.add(new String("a"));
set.add(new String("b"));
set.add(new String("c"));
 
for(String a: set)
	a.value = "a";

在此示例中,如果String是可变的,则可以更改其值,这将违反set的设计(set包含未重复的元素)。顺带一提,上面的示例仅用于演示目的,value在实际的字符串类中没有任何字段。

4.安全性

字符串被广泛用作许多Java类的参数,例如网络连接,打开文件等。如果字符串不是不可变的,则连接或文件将被更改,这可能会导致严重的安全威胁。该方法认为它正在连接到一台机器,但没有。因为参数是字符串,所以可变字符串也可能在反射中引起安全问题。

这是一个代码示例:

boolean connect(string s){
    if (!isSecure(s)) { 
throw new SecurityException(); 
}
    //here will cause problem, if s is changed before this by using other references.    
    causeProblem(s);
}

5.不可变对象自然是线程安全的

由于不可变对象无法更改,因此可以在多个线程之间自由共享它们。这消除了进行同步的要求。

总而言之,String出于效率和安全性原因而设计为不变的。这也是通常在很多情况下首选不可变类的原因。

喜欢这篇文章的可以点个赞,欢迎大家留言评论,记得关注我,每天持续更新技术干货、职场趣事、海量面试资料等等
如果你对java技术很感兴趣也可以交流学习,Java技术资料交流qq裙:907135806,共同学习进步。
不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!
还有奉上我近期整理出来的一套完整的java架构思维导图,可供大家对照知识点参考学习。
Java架构最全学习路线图

把 sy-* 带进 ABAP CDS:ABAP 7.50 里的环境信息新姿势($session 与 @Environment.systemField 实战) 摘要:ABAP 7.50在CDS视图中引入两种获取环境信息的方式:1)直接使用$session会话变量读取用户、客户端和系统语言;2)通过@Environment.systemField注解参数,由Open SQL自动注入系统字段。$session方式简单但依赖Open SQL访问路径,非ABAP环境下可能失效;注解参数方案更工程化,依赖关系明确且支持测试。建议ABAP体系内优先使用$session,对外接口采用参数化方案。两种方式各有适用场景,正确选择可避免潜在风险。(148字) 阅读详情

相关推荐

【复现论文】Looking here or there? Gaze Following in 360-Degree Images

论文:Looking here or there?

RichardoMu的博客 1131

Java中的String不可变性详解

本文将详细探讨`String`不可变性的原因、其带来的优势,以及如何应对性能问题。

YT的博客 1453

STM32之W5500网络通信_w5500 profinet

*初始化8个socket*/setSHAR(ConfigMsg.mac);/*配置Mac地址*/setSUBR(ConfigMsg.sub);/*配置子网掩码*/setSIPR(ConfigMsg.lip);/*配置Ip地址*/setGAR(ConfigMsg.gw);/*配置默认网关*/setRTR(2000);/*设置溢出时间值*/setRCR(3);/*设置最大重新发送次数*/

2501_90250923的博客 1461

Java---为什么String被设计成不可变类?

String类被设计成不可变类,主要是为了提高安全性、线程安全性,优化性能(通过字符串常量池和哈希码缓存),以及简化设计和实现。这些优点使得String成为Java中广泛使用的核心类之一。

xycxycooo的博客 535

4. SAP ABAP OData 服务 Data Provider Class 的 GET_ENTITYSET 方法实现指南

首先第19行CREATEDATA创建er_entityset实例,指定其类型为zcl_zbook_manage_mpc=>tt_book,接着把这个引用映射到刚刚第五行定义的FIELD-SYMBOLS变量上去,这样的话,接下来我们对FIELD-SYMBOLS进行的操作,就会自动反应回引用变量er_entityset.因为我们可能在这个方法里,返回多条图书信息,所以需要用内表类型,而非单条记录的ts_book.ts_book代表一本图书的数据结构。......

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2962

YOLOv8改进 | Neck篇 | Slim-Neck替换特征融合层实现超级涨点 (又轻量又超级涨点)

本文给大家带来的改进机制是Slim-neck提出的Neck部分,Slim-neck是一种设计用于优化卷积神经网络中neck部分的结构。在我们YOLOv8中,neck是连接主干网络(backbone)和头部网络(head)的部分,负责特征融合和处理,以便提高检测的准确性和效率。亲测在小目标检测和大尺度目标检测的数据集上都有大幅度的涨点效果(mAP直接涨了大概有0.4左右。同时本文对Slim-Neck的框架原理进行了详细的分析,不光让大家会添加到自己的模型在写论文的时候也能够有一定的参照。

Snu77的博客 1万+

Java中的String为什么是不可变的? -- String源码分析

什么是不可变对象? 众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。不能改变状态的意思是,不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变。 区分对象和对象的引用 对于Java初学

昨夜星辰的博客 7万+

新手福利!大龙虾OpenClaw可视化管理工具来了!告别命令行,这个可视化工具让OpenClaw管理变得超简单

还在用命令行管理OpenClaw?🚀 这个跨平台可视化工具支持14+AI模型,一键切换,还能对接微信飞书钉钉等8大消息渠道,让AI助手管理变得简单直观 ✅ 暗色主题护眼舒适,Rust后端高性能低占用,新手也能轻松上手 🎯

XiaoqiangClub的博客 761

面试必问:Java中String类型为什么是不可变的?

String对象为什么不能改变,顾名思义,就是String对象的值不能改变。我们先来看看String的值是如何存储的,再看看为什么不能改变存储的值。String对象的不可变性,导致每次修改值都要创建新的对象,性能肯定就很慢,没有的对象还要GC来清除,性能就更低了。StringBuilder对象也可以改变值,但是这家伙为了追求性能,连同步都不要了,所以是线程不安全的。面试的时候我们只是解释上面的原因其实不是那么尽善尽美,想要更好的去加薪去装逼,我们还需更进一步回答。我觉得你是多虑了,String a引用了。

m0_46638350的博客 4662

基于IEEE39节点系统的风力发电机组并网改造与稳定性研究

本文研究了基于IEEE39节点系统的风力发电机组并网改造与稳定性问题。首先将系统工作频率从60Hz转换为50Hz,并对同步发电机、变压器、线路和负荷参数进行相应调整。随后将30、32、34、37号节点的同步发电机替换为不同容量的永磁同步发电机(PMSG)和双馈感应发电机(DFIG),详细建立了两种风电机组的数学模型和控制策略。通过Simulink仿真验证,改造后的系统能够稳定运行并满足并网要求。研究成果为大规模风电并网系统仿真提供了参考,对提高电力系统可再生能源消纳能力具有重要意义。

huanghm88的专栏 111

Couldn‘t agree a key exchange algorithm(available:curve25519-sha256,curve25519-sha256@libssh.org解决方案

本文主要介绍了Couldn’t agree a key exchange algorithm(available:curve25519-sha256,curve25519-sha256@libssh.org解决方案,希望能对使用winscp的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案 2.1 方案一 2.2 方案二

weixin_43178406的博客 4万+

Java的string类为什么是不可变的

java String 不可变

liuqinhou的博客 1656

UNet改进(6):基于注意力机制的多尺度医学图像分割方法

本文提出了一种集成多尺度注意力机制的UNet改进模型UNetWithAttention,用于提升医学图像分割性能。该模型在标准UNet架构基础上,设计了并行3×3、5×5、7×7卷积核的多尺度注意力模块,通过特征拼接和Sigmoid激活生成注意力权重,实现了对不同尺寸病变的自适应关注。模型采用分离式设计,将特征提取与特征选择解耦,在编码器-解码器各阶段嵌入注意力模块。实验表明,该方法在视网膜血管分割和肺结节检测任务中优于标准UNet,Dice系数和IOU分别提升2.6%和4.1%,同时保持计算效率。

2501_91516851的博客 1324

java中的String为什么是不可变的

我们都知道在java中String是不可变的 那么什么叫不可变? 百度百科给出: 在面向对象及函数编程y语言中,不可变对象是一种对象,在被创造之后,它的状态就不可以被改变。 我们可理解为: 一个对象创建完成之后,它的状态就不能再改变,包括的对象里面的成员变量,基本数据类型的值都不能改变,这样就叫做不可变对象 理解定义不叫简单,但是实际情况下我们总会混淆引用与对象,进而以为String可变,比如下面代码: String s = "abc"; System.out

m0_53611007的博客 1384

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

面试必问:java中String对象为什么要设计成不可变的呢?

这几天在各大平台上都看到过这样一些帖子,全都是关于String类型对象不可变的问题,当然现在也是找工作的准备时期,因此花了一部分时间对其进行整理一下。 想要完全了解String,在这里我们需要解决以下几个问题 (1)什么是不可变对象? (2)String如何被设计成不可变对象的? (3)有什么办法能够改变String? (4)JAVA语言为什么把String类型设计成不可变? 带着这些问题就可以开...

冯冬冬的博客 548

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

java中String为什么是不可变的

不可变性(Immutability)指的是一个对象在创建后,其状态不能再被修改。对于String类来说,这意味着一旦创建了一个String对象,它的内容(即字符串中的字符序列)就不能被改变。如果你尝试修改一个String对象的内容,实际上会创建一个新的String对象,而原来的对象保持不变。Java中的String类被设计为不可变的,这是基于多种考虑,包括安全性、性能优化、设计简洁性和防止错误等。不可变性使得String。

Flying_Fish_roe的博客 1483

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【JAVA】String为什么不可变

一、前言 关于String的介绍,可以先参考我的另外一篇文章【JAVA】String源码浅谈 本篇文章,主要来探讨String的不可变性 二、到底什么是不可变 可以这样理解,一个对象在创建完成后,不能去改变它的状态,不能改变它的成员变量。如果变量包含基本数据类型,那么这个基本数据类型的值不能改变;如果包含引用类型,那么这个引用类型的变量不能指向别的对象,而且该引用类型指向的变量的状态也不能...

阳阳的博客 921

Java中为什么String不可变

文章目录常量池便利安全引申问题String在Java中的【引用传递】# 加入战队 Java中为什么String是不可变性的。今天我们从多角度解析为什么Java把String做成不可变的。 常量池 Java中我们创建String对象有两种基本方法。 String str1 = "zxhtom"; String str2 = new String("zxhtom"); 上面两种方式我们创建了两个String变量 。 但是第一种通过双引号创建的zxhtom这个对象我们称之为常量 。 在JVM中是存储

烟花散尽的专栏 618

Java - 为什么String在Java中是不可变的?

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net 字符串在Java中是不可变的,因为String对象缓存在String池中。由于缓存的字符串在多个客户之间共享,因此始终存在风险,其中一个客户的操作会影响所有其他客户。例如,如果一段代码将String “Test”的值更改为“TEST”,则所有其他客户...

了解➔熟悉➔掌握➔精通 3万+

为什么Java里面String类是不可变的

在Java里面String类型是不可变对象,这一点毫无疑问,那么为什么Java语言的设计者要把String类型设计成不可变对象呢?这是一个值得思考的问题 Java语言的创建者James Gosling,曾经在一次采访中被人问到:什么时候应该使用不可变对象(immutable object),他回答:任何可以使用的时候都会使用。 在这之前,我们先来简单了解一下,什么是不可变对象? 不可变对象指...

三劫散仙 3054

为什么string在java中是不可变的_为什么string在Java中不可变?

String是不可变的有几个原因,这里是一个总结:安全性 :参数通常在networking连接,数据库连接URL,用户名/密码等中表示为String 。如果它是可变的,这些参数可以很容易地改变。同步和并发性:使string不可变自动地使它们线程安全,从而解决同步问题。caching :当编译器优化你的String对象时,它看到如果两个对象具有相同的值(a =“test”,b =“test”),因此...

weixin_39598568的博客 276

为什么String在java中是不可变的?

这句代码执行过之后,又创建了一个新的对象“123456”, 而引用 s 重新指向了这个新的对象,原来的对象“ABCabc”还在内存中存在,并没有改变。引用只是一个 4 字节的数据,里面存放了它所指向的对象的地址,通过这个地址可以访问对象。可以反射出 String 对象中的 value 属性,进而改变通过获得的 value 引用改变数组的结构。在 Java 中,String 类是不可变的,即 String 中的对象是不可变的。的,和第四条:使所有的域都是私有的。修饰的,满足了第二条的:类不能被拓展。

黑马程序员官方博客 962

Java中的String 为什么是不可变的?

摘要: Java中的String类被设计为不可变(Immutable),即对象创建后内容不可修改。这种设计基于四大原因:线程安全(无需同步)、字符串常量池优化(内存复用)、安全性(防止敏感数据篡改)和哈希值缓存(提升性能)。实现上通过final类、私有字符数组及返回新对象的方法确保不可变性。虽然不可变性带来线程安全和内存优化等优势,但频繁修改可能引发性能问题,此时建议使用StringBuilder。实际开发中,String的不可变性保障了代码健壮性,尤其在多线程和哈希表场景中表现突出,体现了Java在性能与

Hzx895554135的博客 1215

为什么String在Java中是不可变的?

为什么String在Java中是不可变的是流行的面试问题之一。String是任何编程语言中最常用的类之一。String是Java中的不可变和final。Java运行时环境维护一个String池,使得String成为一个特殊的类。 为什么String在Java中是不可变的? 下面来看一下String不可变的一些好处,这将有助于理解为什么String在Java中是不可变的。 因为String...

编程工作室 850

你知道Java核心类String为什么要设计成不可变类么?

来源:程序员小岑成长记1. 前言最近看到几个有趣的关于Java核心类String的问题。String类是如何实现其不可变的特性的,设计成不可变的好处在哪里。为什么不推荐使用+号的方式去形...

Java笔记虾 588

java中String为什么是不可变的?

这是一个大神的csdn账号,我只是最近帮忙写点东西在里面,其实也算不上帮忙,毕竟我是个菜鸟级别的,所以朋友们有兴趣就看一下,如果是大神的话请忽略吧~ 参考上一篇文章,再加上网上的资料,我说说java中String为什么是不可变的。仅仅作为一个日后可以参考的学习资料。String的成员变量 public final class String implements java.io.Serializab

boyi and byy's notes 609
上一篇: Java垃圾收集器和参考对象
下一篇: Java中的静态字段
程序员plus
博客等级 码龄8年 41粉丝 151原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值