【Java】通过反射方法不改变HashCode以修改String的值

news2024/11/16 18:55:17

如何修改String的值?

我们首先会想到如下两种方法

  • 方式一:通过StringBuild/StringBuffer
String s1 = "Hello World!";
System.out.println("s1="+s1+"  HashCode="+s1.hashCode());
StringBuilder sb = new StringBuilder(s1);
sb.setCharAt(0, 'F');
s1 = sb.toString();
System.out.println("s1="+s1+"  HashCode="+s1.hashCode());

输出:
s1=Hello World! HashCode=-969099747
s1=Fello World! HashCode=-1227265185

  • 方式二:直接修改
String s1 = "Hello World!";
System.out.println("s1="+s1+"  HashCode="+s1.hashCode());
s1 = "Hello Java";
System.out.println("s1="+s1+"  HashCode="+s1.hashCode());

输出:
s1=Hello World! HashCode=-969099747
s1=Hello Java HashCode=387417328

我们发现:string虽然被修改,但其hashCode也被改变,即s1重新赋值时指向了新的对象。

通过查看源码发现StringBuilder的toString方法也是创建新的String对象。

如何不改变HashCode修改String?

我们知道String是不可变的,因为String类被Final修饰,且保存字符串的数组final 修饰且为 私有的,并且String 类没有提供/暴露修改这个字符串的方法(Java8)。
在这里插入图片描述
解决方法:通过反射修改String类中的char数组

String s1 = "Hello World!";
System.out.println("s1="+s1+"  HashCode="+s1.hashCode());

Field value = null;
try {
    /**
    * 使用反射获取字符串类String的私有成员变量value的对象,并将其设为可访问状态。
    * 调用value.set(s1, new char[]{'H','E','L','L','O'})方法,修改了s1对象的value成员变量的值为"HELLO"。
    */
    value = String.class.getDeclaredField("value");
    value.setAccessible(true); // 设置可访问
    value.set(s1,new char[]{'H','E','L','L','O'});
} catch (NoSuchFieldException e) {
    throw new RuntimeException(e);
} catch (IllegalAccessException e) {
    throw new RuntimeException(e);
}
System.out.println("s1="+s1+"  HashCode="+s1.hashCode());

输出:
s1=Hello World! HashCode=-969099747
s1=HELLO HashCode=-969099747

使用Java反射机制修改了字符串对象s1的内部字符数组value的值,使其从原来的"Hello World!“变为"HELLO”,其HashCode不变。

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

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

相关文章

Android JNI配置CMakeLists.txt修改.cpp在logcat打印日志

Android JNI配置CMakeLists.txt修改.cpp在logcat打印日志 C/C代码里面常用的printf没法在Android 的logcat输出显示。需要特别配置C才能显示在logcat里面。 (1)CMakeLists.txt定义: find_library( # Sets the name of the path variable.l…

yolov1原理

目标检测方法 传统的方法可以按照检测系统分为两种: DPM,Deformatable Parts Models,采用sliding window检测R-CNN、Fast R-CNN。采用region proposal的方法,生成一些可能包含待检测物体的potential bounding box,再…

opencv_c++学习(三)

一、获取图像像素指针 CV Assert(mylmage.depth() CV 8U); CV_Assert()函数判断图像数据的类型是否为uchar类型,不满足则抛出异常。 Mat.ptr(int i0)获取像素矩阵的指针,索引i表示第几行,从0开始计行数。 Mat.ptr(int i0)获取像素矩阵的指针…

【五一创作】【远程工具】- Tabby 下载、安装、使用、配置【ssh/Serial】-免安装、解压即用

目录 一、Tabby 概述 二、Tabby 下载、安装 三、Tabby 的使用  👉3.1 使用SSH协议连接Linux开发主机  👉3.2 使用Serial(串口)协议连接开发板 一、Tabby 概述 在远程终端工具中,secureCrt 和 XShell 是两款比较有名的远程工具,但…

shell脚本之例题详解

文章目录 1 检查用户家目录中的test.sh文件是否存在,并且检查是否有执行权限2 提示用户输入100米赛跑的秒数,要求判断秒数大于0且小于等于10秒的进入选拔赛,大于10秒的都淘汰,如果输入其它字符则提示重新输入;进入选拔…

Selenium:集成测试报告

目录 一、分拆后的实现代码 二、创建用于执行所有用例的ALL_HTMLtest.py文件 三、集成测试报告 随着软件不断迭代功能越来越多,对应的测试用例也会呈指数增长。一个实现几十个功能的项目,对应的用例可能有上百个甚至更多,如果全部集成在一…

RocketMQ中单消费者订阅多个Topic,会阻塞消费吗?

RocketMQ 问题 背景是这样: 最近有个项目用MQ做消息流转,在RocketMQ集群模式下,一个消费者实例,订阅了两个Topic A、B。 Topic A:存储的是批量业务消息。 Topic B:存储的是单个业务消息。 有个小伙伴问我…

基于C++的职工管理系统

1、管理系统需求 职工管理系统可以用来管理公司内所有员工的信息 本教程主要利用C++来实现一个基于多态的职工管理系统 公司中职工分为三类:普通员工、经理、老板,显示信息时,需要显示职工编号、职工姓名、职工岗位、以及职责 普通员工职责:完成经理交给的任务 经理职责:完成…

分布式系统概念和设计-分布式文件系统服务体系结构和实践经验

分布式系统概念和设计 文件系统的特点 负责文件的组织,存储,检索,命名,共享和保护 文件包含数据和属性 数据:包含一系列数据项——8比特的字节,读写操作可访问任何一部分数据属性:用一个记录表…

一文详解 SCTP 协议

SCTP(Stream Control Transmission Protocol)流控制传输协议,由 RFC2960 定义。SCTP的设计目的是提供一种可靠的、面向消息的数据传输服务,以便于支持多点通信以及满足传输的可靠性需求。SCTP 目前广泛应用于VoIP、移动通信和云计算等领域。 SCTP 主要特点SCTP 消息结构SCTP …

Android9.0 原生系统SystemUI下拉状态栏和通知栏视图之锁屏通知布局

1.前言 在9.0的系统rom定制化开发中,对于系统原生systemui的锁屏界面的功能也是非常重要的,所以在锁屏页面布局中,也是有通知栏布局的,所以接下来对于息屏亮屏 通知栏布局的相关流程分析,看下亮屏后锁屏页面做了哪些功能 2.原生系统SystemUI下拉状态栏和通知栏视图之锁…

应用层开发想转Android framework开发要从何开始

前言 现如今,由于市面上应用App的更新逐渐变少,很多Android移动应用开发者都开始转型做系统开发,这比开发应用有趣多了,因为你可以探索系统模块的运行原理,从框架层面去了解它。 在应用层,你只需要配置好…

JAVA-异常

文章目录 1.异常的体系1.3异常的分类 2.异常的处理2.2异常的抛出throw2.3异常的捕获2.3.1异常声明throws2.3.2 try-catch捕获并处理2.3.3 finally 2.4 异常的处理流程 3.自定义异常类 1.异常的体系 Throwable:是异常体系的顶层类,其派生出两个重要的子类…

前端框架篇学习--选择命令式还是声明式

命令式与声明式定义 大白话:假期回家了,我想吃老妈的大盘鸡,然后老妈就去采购食材,剁鸡块,卤鸡肉,切土豆,然后爆炒起来,想方设法给我做好吃的大盘鸡。老妈上菜的餐桌,我…

SQL语句学习笔记(对库、表、字段、的操作)

查看mysql的状态 status 启动、停止 mySQL服务 图像界面方法: dos窗口执行:services.msc 控制面板–>管理工具–>服务 命令行方法: 启动: net start mysql80 停止: net stop mysql80 启动与环境变量 添加环境…

UnityShaderBook中消融dissolve详解

消融这个效果算得上游戏开发中用的比较多的一个效果,表现游戏对象消失的时候经常用到,这个效果实现也非常简单,因此在《UnityShader入门精要》中也就短短几句话讲完了,这里我想针对书中的效果详细讲解一下。 Shader源代码&#x…

(浙大陈越版)数据结构 第二章 线性结构 2.2 堆栈

目录 2.2.1 什么是堆栈 堆栈 什么是堆栈 例子:计算机如何进行表达式求值?如:56/2-3*4 后缀表达式 堆栈的抽象数据类型描述 2.2.2 堆栈的顺序存储实现 例子:用一个数组实现两个堆栈,要求能最大利用数组空间&…

路径之谜(DFS)-2016年蓝桥杯国赛

路径之谜-2016年国赛 1、题目描述2、解题思路3、代码实现1、题目描述 小明冒充 X 星球的骑士,进入了一个奇怪的城堡。 城堡里边什么都没有,只有方形石头铺成的地面。 假设城堡地面是 nn* 个方格。如下图所示。 按习俗,骑士要从西北角走到东南角。可以横向或纵向移动,但不能…

【Java虚拟机】JVM常见诊断命令和调试工具

1.JVM常用命令行参数jps和jinfo实操 准备测试代码 /*** author lixiang* date 2023/5/4 20:53*/ public class JVMTest {public static void main(String[] args) throws InterruptedException {Thread.sleep(1000000);} }(1)命令jps:全称 …

【exgcd】牛客练习赛 D-青蛙兔子的约会

D-青蛙兔子的约会_牛客练习赛111 (nowcoder.com) 题意: 思路: 感觉和那个青蛙的约会比较像 就是列了个方程: a*xb*yn 考虑用exgcd解方程 然后看x在[L,R]有没有解 做法就是先把x的最小整数解求出来,然后考虑它的通解 xx0b/…