首页
学习
活动
专区
圈层
工具
发布

Java 中的 String 真的是不可变的吗?

我们都知道 Java 中的 String 类的设计是不可变的,来看下 String 类的源码。...其值 value 也就是对字符数组的封装,即 char[],其值被定义成 private final 的,说明不能通过外界修改,即不可变。 String 真的 "不可变 " 吗? 来看下面这个例子。...这其实是初学者的一个误区,从上面看 String 的结构可以得知字符串是由字符数组构成的,str 只是一个引用而已,第一次引用了 "Python",后面变成了 "Java",而 substring 也是用...String 真的真的真的 "不可变 " 吗? 上面的例子肯定是不可变的,下面这个就尴尬了。...通过反射,我们改变了底层的字符数组的值,实现了字符串的 “不可变” 性,这是一种骚操作,不建议这么使用,违反了 Java 对 String 类的不可变设计原则,会造成一些安全问题。 是不是又涨姿势了?

1.2K30

Java 中的 String 真的是不可变吗?

我们都知道 Java 中的 String 类的设计是不可变的,来看下 String 类的源码。 ? 可以看出 String 类是 final 类型的,String 不能被继承。...其值 value 也就是对字符数组的封装,即 char[],其值被定义成 private final 的,说明不能通过外界修改,即不可变。 String 真的 "不可变 " 吗? 来看下面这个例子。...Java中的String真的是不可变吗? 所以说,这里的字符串并不是可变,只是变更了字符串引用。...String 真的真的真的 "不可变 " 吗? 上面的例子肯定是不可变的,下面这个就尴尬了。 ?...通过反射,我们改变了底层的字符数组的值,实现了字符串的 “不可变” 性,这是一种骚操作,不建议这么使用,违反了 Java 对 String 类的不可变设计原则,会造成一些安全问题。 是不是又涨姿势了?

1.3K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    程序员过关斩将--你的业务是可变的吗

    用户A现在属于省id为1000的省,生成了一个订单,这个省的订单数统计会加1,假如订单总数变为了20001,然后用户A所属的省的Id变为了1001,那Id是1000的省的订单总数又变成了20000。...u on o.UserId=u.UserId where ProvinceId=@ProvinceId 有问题吗,sql没问题,这时候用户A的省市区县信息突然变了(也许是在其他地区买房...拿D妹子的统计来说,你的业务是统计区域的订单数,这个业务在产品设计上定义的是不变性,也就是说在行为产生的那个时间点就确定了业务性质,这个业务的性质不会随着其他变而变。...具体到当前业务就是:用户在X省下的订单不会随着用户区域信息的变化而变化,说白了就是说用户在X省生成的订单永远属于X省。 谈到业务性质的不变性,对应的就有业务的可变性。...假如你开发过类似于QQ空间这样的业务,那肯定也做过类似访客的功能。当要显示访客记录的时候,访客的名称在多数情况的设计中属于可变性的业务。什么意思呢?

    47720

    混合还是不混合?是正确的云问题吗?

    但是更重要的是,雷德蒙德频道合作伙伴杰弗里·施瓦茨说,近一半的公司表示他们还没有实施混合云策略,实际上已经有一个云。...虽然混合云旨在提供跨内部部署和云计算资源的集成计算环境,但调研机构IDC最近的一份报告表明,采用该技术的最有效方法是根据各种用例分割数据和处理。...不幸的是,治理通常是开发/测试过程中的最后一个考虑环节,当混合部署的真实成本和复杂性出现在现实世界的生产环境中时,许多组织对此感到震惊。...他说,需要的是一套关于工作量布局和直接编入分析和自动化系统的其他因素的正式指南,使得治理成为混合云中的核心原则,而不仅仅是文档或意识活动。...正如云计算本身证明最有效地支持本地应用程序而不是传统的数据中心功能,混合云可能会生成自己的一套优化服务,TECA公司总裁Michael Otey说,替代混合云的最有可能的领域是开发/测试,这将获得敏捷的新流程和降低成本结构以及备份

    1.8K30

    【八股文Java】: Java对象的hashCode()值是可变的吗?发生GC之后会变吗?为什么?hashCode值如何生成?

    问:Java对象的hashCode()值是可变的吗?发生GC之后会变吗?为什么?hashCode值如何生成? 答:Java对象的hashCode()默认实现是不可变的,即使GC之后也不会变。...2、默认Java对象的hashCode()方式的实现是native级别的,即JVM层实现,生成hashCode值后会保存到对象的对象头MarkWord中,即缓存在对象头MarkWord中,不会重复计算。...,使用位移和异或运算生成随机数的方法)。...: 上述找到的ObjectSynchronizer::FastHashCode方法实现部分代码: HashCode的生成方法: 可以看到HashCode的生成有好几种策略,此openjdk默认的策略时最后一种...: (src/hotspot/share/runtime/globals.hpp) 即:hashCode=5的生成逻辑:Marsaglia XORshift随机数算法,使用位移和异或运算生成随机数的方法

    1.3K30

    继承是代码复用的最佳方案吗?

    在客户端代码使用时,面对的是子类,这种继承叫实现继承: Child object = new Child(); 还有一种看待继承的角度:从父类往下看,客户端使用时,面对的是父类,这种继承叫接口继承: Parent...不推荐实现继承: 继承很宝贵,Java只支持单继承 一个类只能有一个父类,一旦继承的位置被实现继承占据,再想做接口继承就难了 实现继承通常也是一种受程序设计语言局限的思维方式 很多语言,不使用继承,...这样,若我需要有个获取产品信息的地方,它不必非得是个服务,我无需继承任何类。 获取产品信息、生成报表是两件事,只是因为在生成报表过程,需要获取产品信息,所以,它有个基类。...所以,要写继承以实现代码复用时,问问自己,这是接口继承,还是实现继承? 若是实现继承,是不是可以写成组合? 2 面向组合编程 可以组合的根因:获取产品信息、生成报表服务本是两件事(分离关注点)。...,这种新角度更贴近需求和自然,结合四色原型 DDD和DCI可以一步到位将需求更快地分解落实为可运行的代码,是国际上软件领域的一场革命。

    86650

    (转)你写的代码,是别人的噩梦吗

    自从工作后写了大半年代码了,公司由于历史原因项目中充斥着各种不合理设计,写着写着就很容易烦躁,影响心情,写代码本来是快乐而富有创造的事情,面对这样的噩梦需要找到解决方案,那么方案就是这篇文章. ----...经过我们分析、讨论,发现造成现在系统异常复杂的罪魁祸首主要来自以下四个方面: 可扩展性差 对于只有一个业务的简单场景,并不需要扩展,问题也不突出,这也是为什么这个点经常被忽略的原因,因为我们大部分的系统都是从单一业务开始的...理想很丰满,现实很骨感,规范的执行是个大问题,最好能在架构层面进行约束,例如在我们架构中,扩展点必须以ExtPt结尾,扩展实现必须以Ext结尾,你不这么写就会给你抛异常。...本章节最后,上一张我们老系统中比较典型的代码,也许你可以从中看到你自己应用的影子。 ? 知道了问题所在,接下来看下我们是如何一个个解决这些问题的。...再比如在java应用中使用logger框架有很多选择,什么log4j,logback,common logging等,每个logger的API和用法都稍有不同,有的需要用isLoggable()来进行预判断以便提高性能

    1.3K20

    会写代码是你创业路上的包袱吗?

    但他们往往不这么说,他们会说:创业风险太大,要还房贷啦,要存奶粉钱啦,要照顾家里人啦,种种借口;其实归根结底,还是因为有一技之长,有口饭吃,让他迈不出这一步。...潜意识是理性的最大杀手,好多时候都是潜意识让你没有做出正确的决策和行动的,也正是程序员常年累月的工作,造就了这种潜意识,这种潜意识与创业需要的素质是相悖的。...想想看,如果给你十个亿,你能做出滴滴打车或者共享单车这样的产品吗?你甚至连想都不会想这种充斥着风险的项目。 第三个问题:世界里太多是非题 程序员的世界里太多是非题,不是对,就是错,很少有灰色地带。...创业初期,你又要写代码,又要搞运营,你打算分别投多少精力在这两个事务上呢?你管理你的团队,这个人明天嫌加班多,那个人后天嫌没有话费补贴,满足他们的要求吗?满足到什么程度啊?...等技术团队组建好之后,程序员又会不放心自己的技术团队,甚至会亲自操刀做架构,写核心代码,技术团队永远不会得到充分的授权!

    52130

    会写代码是你创业路上的包袱吗?

    但他们往往不这么说,他们会说:创业风险太大,要还房贷啦,要存奶粉钱啦,要照顾家里人啦,种种借口;其实归根结底,还是因为有一技之长,有口饭吃,让他迈不出这一步。...潜意识是理性的最大杀手,好多时候都是潜意识让你没有做出正确的决策和行动的,也正是程序员常年累月的工作,造就了这种潜意识,这种潜意识与创业需要的素质是相悖的。...想想看,如果给你十个亿,你能做出滴滴打车或者共享单车这样的产品吗?你甚至连想都不会想这种充斥着风险的项目。...创业初期,你又要写代码,又要搞运营,你打算分别投多少精力在这两个事务上呢?你管理你的团队,这个人明天嫌加班多,那个人后天嫌没有话费补贴,满足他们的要求吗?满足到什么程度啊?...等技术团队组建好之后,程序员又会不放心自己的技术团队,甚至会亲自操刀做架构,写核心代码,技术团队永远不会得到充分的授权!

    73120

    理解 Roslyn 中的红绿树(Red-Green Trees)

    ---- 红绿树的影子 如果你是通过搜索找到这篇文章的,那么至少证明你调试过 Roslyn API 的使用,或者阅读过 Roslyn 的源码。...因为正常使用 Roslyn 的 API 时你是看不到红绿树的,这是 Roslyn 的实现细节。但你在调试的时候可能会看到 Green 属性,或者在阅读源码时看到 GetRed 方法。 ?...如果每次编辑代码都去重新解析一次整份源代码,然后全部重新生成整个数据结构,那将是大量的性能浪费;更不可能实时去分析开发者编辑的源码。...所以,在 Roslyn 的设计中,希望源代码文本改变时,整棵树中的大多数节点都是能够重复使用的(无需重新生成)。 而如果将数据结构设计成不可变的(Immutable),那么重用这些节点将会非常容易。...红树(the red tree)也是不可变的,是围绕绿树而建的外观(参见 外觀模式)。红树的构建是自上而下的,但红树只在需要时才会创建,而一旦编辑了源代码文件,红树就直接丢弃不用了。

    2.3K10

    MySQL存储的字段是不区分大小写的,你知道吗?

    00 简单回顾 之前写过一篇关于mysql 对表大小写敏感的问题(你有遇到过MySQL因大小写敏感导致的问题吗),其实在mysql中字段存储的内容是不区分大小写的,本篇进行简单的总结。...想回顾一下: MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的: 1、数据库名与表名是严格区分大小写的; 2、表的别名是严格区分大小写的; 3、列名与列的别名在所有的情况下均是忽略大小写的...; 4、字段内容默认情况下是大小写不敏感的。...02 解决方案 因为默认情况下字段内容是不区分大小写的,也即大小写不敏感。所以解决方案就是要新增字段内容的校验规则。 使用mysql 的BINARY 关键字使搜索区分大小写。...这种方式也是有缺点的,每次写查询的时候都要注意加关键字,并可能需要改动的代码较多。

    7.6K30

    使用 swagger 生成规范化的RESTful API 代码

    使用Swagger生成API,我们可以得到交互式文档,自动生成代码的SDK以及API的发现特性等。 如何编写API文档 我们可以选择使用JSON或者YAML来编写API文档。...swagger_codegen swagger-codegen 是一个开源的代码生成工具,它包含一个模板驱动引擎,可以直接从我们定义的 swagger 文档中生成可视化的文档查看界面和API客户端。...如果不指定 -tlp 参数,默认使用 flask 作为模板。如果指定 --ui --spec 参数则会在 由-p 参数指定的目录下生成swagger UI 目录 static。...框架已经生成了,其中 routes.py 是自动生成的路由,validators.py 是response和request的校验代码,schemas.py 是由文档生成的校验规则,api 目录下的各个文件是你定义的...如果生成命令带上 --ui --spec,生成代码的同时也会生成swagger UI: swagger_py_codegen --swagger-doc api.yml example-app --ui

    7.1K10

    C# 一分钟浅谈:Roslyn 编译器平台介绍

    Roslyn 是 Microsoft 开发的一个开源编译器平台,用于 C# 和 VB.NET 语言。它将传统的编译过程分解为多个阶段,并为每个阶段提供了可编程的 API。...通过这些 API,开发者可以: 分析源代码 生成和修改语法树 执行静态分析 生成诊断信息 生成代码 基本概念 语法树(Syntax Tree) :表示源代码的结构化表示。...语法树的不可变性 Roslyn 的语法树是不可变的,这意味着你不能直接修改现有的节点。相反,你需要创建新的节点并替换旧的节点。...性能优化 处理大型代码库时,性能是一个重要的考虑因素。以下是一些优化建议: 缓存结果:避免重复解析和分析相同的代码。 异步操作:使用异步 API 来提高响应速度。...通过本文的介绍,希望你对 Roslyn 有了更深入的了解,并能够在实际项目中应用这些知识。无论是进行代码分析、重构还是生成代码,Roslyn 都是一个值得探索的强大工具。

    1.5K10

    .Net 编译器平台 --- Roslyn

    其实 「Roslyn」 提供了很多强大的功能,比如: 提供了一组丰富的 API,允许开发人员在运行时动态地生成、编译和执行代码。这些 API 分为两类:编译 API 和工作空间 API。...编译 API 用于分析和生成代码,工作空间 API 用于与集成开发环境(IDE)进行交互。通过这些 API,开发人员可以构建强大的代码分析和重构工具。...Roslyn SDK预览版包含了用于代码生成、分析和重构的最新语言对象模型的草案。 我们希望在未来的预览版中包含用于脚本编写和交互使用C#和Visual Basic的API支持的草案。...通过创建一个树,实际上已经创建了等效的文本;通过编辑语法树,从对现有树的更改创建新的树,实际上是编辑了文本。 语法树的第三个属性是它们是不可变且线程安全的。...每个节点都有一个 ChildNodes 方法,它返回一个基于节点在源代码中的位置的顺序列表,包含的是子节点,不包含标记。

    1.5K30

    一款零注解侵入的 API 文档生成工具,你用过吗?

    一款零注解侵入的 API 文档生成工具 介绍 smart-doc是一款同时支持JAVA REST API和Apache Dubbo RPC接口文档生成的工具,smart-doc在业内率先提出基于JAVA...泛型定义推导的理念,完全基于接口源码来分析生成接口文档,不采用任何注解侵入到业务代码中。...对JSON请求参数的接口能够自动生成模拟JSON参数。 对一些常用字段定义能够生成有效的模拟值。 支持生成JSON返回值示例。 支持从项目外部加载源代码来生成字段注释(包括标准规范发布的jar包)。...支持导出错误码和定义在代码中的各种字典码到接口文档。 支持Maven、Gradle插件式轻松集成。 支持Apache Dubbo RPC接口文档生成。...当然 smart-doc 本身是只支持扫描代码生成 openapi 3.0 的文档的,也可以将生成的 openapi 3.0 文档导入到其他ui中渲染展示。 ---- 效果示例 1.

    1.8K20
    领券