首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

String 在 Java 中是不可变的。 不可变类只是一个无法修改其实例的类。 创建实例时,将初始化实例中的所有信息,并且无法修改信息。 不可变类有许多优点。...本文总结了为什么 String 设计为不可变的。 这篇文章从内存,同步和数据结构的角度说明了不变性概念。 1. 字符串池 字符串池(String intern pool)是方法区域中的特殊存储区域。...如果字符串是可变的,则使用一个引用更改字符串将导致其他引用的错误。 2. 缓存的哈希码 字符串的哈希码经常在 Java 中使用。 例如,在 HashMap 或 HashSet 中。...其他对象中的字符串 为了具体,请参考以下程序: HashSet set = new HashSet(); set.add(new String("a")); set.add...字符串不是不可变的,连接或文件将被更改,这可能会导致严重的安全威胁。 该方法认为它连接到一台机器,但事实并非如此。 可变字符串也可能在 Reflection 中引起安全问题,因为参数是字符串。

1.3K20

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

为什么 String 在 java 中是不可变的?String 在 java 中是不可变的,一个不可变类意味着它的实例在创建之后就不可修改,实例的所有属性在创建时初始化,之后无法对这些属性进行修改。...(译者:另一个引用并未对字符串做修改,当他再次取值时字符串的值却与上次取的不同!)。2 用作缓存时的 hashcode字符串的哈希值在 java 中是被频繁使用到的。...如果 String 是可变的,那么它的 value 可以被改变,但这违反了 Set 的设计原则(Set 中的元素是不能重复的),当然,上面的例子仅仅为了表明意图,String 类中并不存在 value...方法调用的预期结果是成功连接到设备,事实可能是并没有连接。可变的字符串在反射中也会导致安全问题,因为参数是字符串。...总结,String 被设计为 final 的原因是 效率 和 安全,通常情况下这也是为什么不可变对象在许多设计中会成为首选的原因。

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

    Rust 标记Trait,公共词汇Trait

    科学无非就是在自然界的多样性中寻求统一性(或者更确切地说,是在我们经验的多样性中寻求统一性)。用 Coleridge 的话说,诗歌、绘画、艺术,同样是在多样性中寻求统一性。...字符串字面量 "diminutive" 和 "big" 是对占用了 10 字节和 3 字节的 str 切片的引用,两者都展示在图 13-1 中。...因为 str 类型和 [T] 类型都表示不定大小的值集,所以它们是无固定大小类型 Rust 不能将无固定大小的值存储在变量中或将它们作为参数传递。...Rust 认为如果一个类型需要特殊的清理代码,那么就必然需要特殊的复制代码,因此不能是 Copy 类型 与 Clone 一样,可以使用 #[derive(Copy)] 让 Rust 为你派生出 Copy...大多数变体可以用固定字符串来处理,但有些也需要在消息中包含附加数据 小结 Rust实用工具trait就都了解了,以目前的代码练习以及结合其他资料,这些新的概念Trait应该如何更好的应用,还需多敲代码,

    9410

    第5章 | 共享与可变,应对复杂关系

    Rust 中到处都在应用这些规则:如果要借用对 HashMap 中键的共享引用,那么在共享引用的生命周期结束之前就不能再借入对 HashMap 的可变引用。...C++ 的 std::map 承诺插入新条目不会让指向此映射表中其他条目的指针失效,但做出这一承诺的代价是该标准无法提供像 Rust 的 BTreeMap 这样更高效的缓存设计方案,因为后者会在树的每个节点中存储多个条目...如果你不小心让调用 memcpy 或 strcpy 的源和目标在 C 或 C++ 中重叠,则可能会带来另一种错误。通过要求可变访问必须是独占的,Rust 避免了一大类日常错误。...总而言之,与大多数其他语言相比,并发在 Rust 中更容易使用。...它确实做到了:Rust 不仅会迫使你理解为什么自己的程序是线程安全的,甚至可能还需要你做一些高级架构设计。

    11010

    我也谈 Box智能指针·实践领悟

    impl Drop for Box将Box指针的析构时间点与【堆·数据】生命周期的终止时间点·严格地对齐。 不夸张地讲,Box就是【堆·数据】在【栈】内存中的“全权·代理人”。...“消费”掉·原数据实例·所有权 — 【借入·检查器】将进一步禁止对该·变量·的任何后续操作。 取出【堆·数据】的原始指针 — 该指针是要被传输给C端的。...Rust端Borrow Checker也会开始“抱怨”任何对C端变量值有【内存泄漏风险】的操作语句。在Rust词典中,对此有一个术语叫Hygienic — 我打趣地将它翻译为“大保健”。...,且在FFI编程中也十分常见。...那你是否曾经纠结过:为什么into_raw()在Box上是关联函数,而在CString上却是成员方法呢?

    68620

    为什么在深度学习中,AlphaGo Zero是一个巨大的飞跃?

    AlphaGo Zero是DeepMind的自动操作系统的最新化身。有人可能会认为,在围棋中击败人类世界冠军是很难的。...有趣的是,人们可能会认为这个系统实际上不使用可能存在于语言中的隐式偏见。...Lockhart和其他一些人提到,它几乎同时在各种各样的斗争中战斗,采用了一种对人类玩家来说有点疯狂的方法,它们可能会花更多的精力在棋盘上的更小的区域上。 第三点是,训练时间也比之前的版本少得多。...该网络通过将自身与外部训练数据进行比较,而不是从先前版本的神经网络中获得的合成数据来学习。 第四点是,在之前的系统中,它只需要4个Google TPUs,而之前需要48个TPUs。...它可以有效地做到这一点,因为所有其他的不确定因素都是已知的。也就是说,在一系列行为的结果中没有不确定性,行为效果是可以预测的。简而言之,博弈的行为是可以预测的。

    96380

    【投稿】原创:以新视角,解读【闭包】

    准备知识【闭包是以什么样的数据结构被管理】 在代码编译过程中,每遇到一个【闭包】定义(比如,let test = || println!...即, 在【闭包】生存期内,被捕获的【外部变量】在【闭包】外是否还可以被 【只读-借入】 【可修改-借入】 【所有权-转移】 在【闭包】被释放drop之后,【外部变量】是否可恢复被 【只读-借入】 【可修改...-借入】 【所有权-转移】 其次,【处理方式】描述的是【闭包】业务程序如何使用【外部变量】(是借入,还是所有权转移)。...[2] 【闭包】【可修改-借入】【外部变量】要求【闭包struct】实例被以let mut绑定至变量。这是由rust【继承可修改】语言特性决定的。...被高阶函数返回的【闭包】[例程7] 在这个场景下,【闭包】必须把它所依赖的【外部变量】一起转移走,无论在【闭包】业务代码里是仅只【引用】借入变量,还是“消费掉”变量【所有权】。

    42410

    【笔记分享】`Cell`与`RefCell`的关联与差别

    这明显更高级 对于Cell与RefCell,“修改”的含义不一样: 它们提供的这个能力被统称为【内部可修改】。这是相较于普通rust类型的【继承可修改】而言。...它们仅只”打破“了传统的“【只读引用】不能与【可修改引用】共存”的限制。但是,在【同一时刻+同一作用域】内,【可修改引用】还至多只能有一个。否则,要么,编译错误;要么,运行时崩溃。...它们之间的不同点 上图的文字描述如下: 本质不同 Cell“包含”的是【所有权】变量本身 RefCell“包含”的是变量的【引用】。...即便RefCell::new(...)构造函数的实参是【所有权】变量,这也不影响其内部重点使用该变量的【内存地址】。...衍生不同 检查时间点 运行时,确保:对内部值【临时的+排他的+可修改的】访问 Cell编译时,代码静态扫描,借入检查 RefCell运行时,动态跟踪,借入检查 违背【借入规则】的后果 Cell

    43410

    Nginx 核心开发者发布新分支 Freenginx

    前 F5 首席软件工程师 Maxim Dounin 发表了对这个分支的见解: 不幸的是,最近 F5 的一些新的非技术管理人员认为他们知道如何更好地运营开源项目。...在 Hacker News 的一个热帖中,用户 sevg 指出: 值得注意的是,Freenginx 只有两个活跃的“核心”开发者,Maxim Dounin 和 Roman Arutyunyan。...Maxim 是目前仍然活跃的最主要的贡献者。Maxim 和 Roman 基本上占了当前开发量的 99%。因此,这是一个相当有影响力的分支。...在 nginx-devel 邮件列表的公告中,Dounin 强调了促使 Nginx 发布安全补丁解决两个关键漏洞的争议。...Freenginx 并不是 Nginx 的第一个分支和替代方案:在 F5 于 2020 年离开俄罗斯时,其他的俄罗斯 Nginx 开发人员创建了 Angie,目前由俄罗斯公司 Web Server 负责运营

    19910

    结构体之一

    在将其他类型的字节缓冲区传给需要 ASCII 文本的函数时,这种新类型能帮 Rust 捕获错误。我们会在第 22 章中给出一个使用新类型进行高效类型转换的例子。...Rust 既不会在内存中实际存储单元型结构体的值,也不会生成代码来对它们进行操作,因为仅通过值的类型它就能知道关于值的所有信息。但从逻辑上讲,空结构体是一种可以像其他任何类型一样有值的类型。...然而,Rust 确实承诺会将字段的值直接存储在结构体本身的内存块中。...与关联函数相对的是自由函数,它是未定义在 impl 块中的语法项。 Rust 会将调用关联函数的结构体值作为第一个参数传给方法,该参数必须具有特殊名称 self。...`Box` // 这没问题:Rust在调用期间从`Box`借入了`&mut Queue` bq.push('■'); 对于方法调用和字段访问,Rust 会自动从 Box、Rc

    10710

    第6章 | 循环控制流,return,loop,函数,字段,运算符,类型转换,闭包

    6.8 为什么 Rust 中会有 loop Rust 编译器中有几个部分会分析程序中的控制流。 Rust 会检查通过函数的每条路径是否返回了预期返回类型的值。...loop 表达式就是这个问题的“有话直说”式解决方案。 Rust 的类型系统也会受到控制流的影响。前面说过,if 表达式的所有分支都必须具有相同的类型。...>(); // 同样的错误 这里的问题在于,在表达式中 是小于运算符。...= 0,正如预期的那样。这比在 C 中解释成的 x & (BIT != 0) 有用得多,后者会测试错误的位。 Rust 的比较运算符是 ==、!...但是赋值在 Rust 中不像在其他语言中那么常见,因为默认情况下变量是不可变的。 如第 4 章所述,如果值是非 Copy 类型的,则赋值会将其移动到目标位置。值的所有权会从源转移给目标。

    10210

    Rust 生态观察 | 9 月热点思考

    活跃借贷: 当我们在代码中创建一个引用(例如&x),我们实际上是在创建一个借贷(Loan)。这个借贷在某些代码段中是活跃的,这意味着我们不能修改被借用的值。...这意味着,如果一个变量可能引用多个不同的借贷,那么所有这些借贷都被认为是活跃的。 结果是在给定的程序点所有可能的活跃借贷的集合。...例子:在文章中的示例代码中,当我们到达点(B)时,变量p是活跃的,因为它在后面被用于read_value(p)。...这意味着,重新分配可以“结束”一个或多个活跃借贷,即使这些借贷在重新分配之前是活跃的。 例子:在文章中的示例代码中,当执行p = q;时,变量p被重新分配。...在 Rust 中编写非常高效的通用数据结构并不总是容易的 。在某些情况下,它们会带来许多意外的复杂性,而在其他情况下,它们基本上是不可能实现的。

    61030

    【Rust日报】2021-01-18 Facebook使用 Rust 的简单介绍

    对于调研阶段的同学来说,是一个很好的工具. libhunt的主页地址: https://www.libhunt.com/lang/rust How To Write A REST Client In Rust...使用 Rust 的简单介绍 该 twitter 快速的介绍了 Rust 在 facebook 中的使用历程: 2017 年开始应用于一个资源控制项目,后来证明性能和稳定性都比 C++好....在 dev tools 中证明 Rust 可行之后, 开始在后端和手机应用中使用 Rust 很多工程师来自python 和 javascript 语言, Rust 的强类型和高性能让这些工程师不再挣扎于运行时的...为了让 Rust 更广泛的使用, 设立了一个专门的 Rust小组来支持其他的工程师在不同的项目中使用 Rust....该小组同时在 Rust 社区中也非常活跃, 贡献代码. twitter原文: https://twitter.com/alexvoica/status/1350049393471324161 -- From

    51620

    【Rust日报】2023-10-16 为什么要异步 Rust

    为什么要异步 Rust 这篇文章讨论了Rust的 async/await 语法设计。作者指出,async/await 语法最初发布时备受瞩目和期待。但最近,接受程度有些参差不齐。...作者认为,随着时间的推移,反对者变得更加众多,他们的语气也变得更加强硬。在某种程度上,这只是炒作周期自然进展的结果,但作者也认为随着我们与原始设计过程越来越远,一些背景已经丢失了。...作者认为 Rust 中异步编程是一项强大的功能,可以为 Rust 应用程序带来许多好处。...但是,重要的是要了解其优势和劣势,以便在正确的情况下使用它 原文链接 https://without.boats/blog/why-async-rust/ async traits 和 RPITIT 合并到主分支...async traits 和 RPITIT 在近日已经合并到主分支, 预计在不久的将来, 我们就可以用上原生的 async trait 了.

    29440

    我的 7 大 Rust 关键字

    我仍然喜欢它,并认为谈论一些在 Rust 中反复出现的重要关键字可能会有好处。...我会提供我个人对它们的作用的总结:为什么你需要考虑如何使用它们,以及任何其他有用的东西,特别是对于刚接触 Rust 的新手或来自另一种语言的人(如 Java;请阅读我的文章 为什么作为一个 Java 程序员的我喜欢学习...我一般的经验法则是,在管理不同的选项或进行分支时,如果可以使用 match,那就请一定要使用它。...mut – 在声明一个变量时,如果它的值在声明后会发生变化,那么你需要声明它是可变的(LCTT 译注:Rust 中变量默认是不可变的)。...另一个常见的错误是,你这样做了,但没有在 Cargo.toml 文件中添加该 crate (最好有一个最小版本号)。

    57720

    【Rust日报】2021-06-29 Rust社区到底发生了什么?

    在curl中应用hyper是怎样帮助互联网变得更安全的?...具体措施是在curl中增加编译选项,使得提供设置hyper为curl的后端实现的选择。...《Programming Rust》是一本适合想要了解Rust语言的C、C++、Python、Java或者其他语言的开发者,或者那些想要提升自己编程技巧的Rust编程人员的书籍。...( i rust 跟帖者可能的原因是: 幸存者偏差:认为楼主关注的repo都是大型项目,因此贡献频繁是理所当然的; 投资偏好:Rust是一门年轻的语言,很多时间和金钱被投入用于建造核心基础设施;与核心工具都是用...强大的社区:Rust拥有一个令人惊叹的强有力支持的社区,这或许和楼主发现的现象有关系; 内存安全保证代码质量:由于Rust在编译期间的安全保障,贡献的代码(只要编译通过)很容易被确认为是内存安全的,这使得很多开源项目的维护者更愿意接受其他人的代码贡献

    43720

    Reddit 观察:你何时会考虑使用 Cpp 而非 Rust ?

    我认为,在学习基本的现代 Cpp 所需的时间里,我可以掌握 Rust 以及其他几种编程语言。每当我了解 Cpp 的新知识时,我都会想:“为什么在 Cpp 中做这个事情要比在 Rust 中复杂得多呢?...phazer99 : 这是百分之百正确的。当你在团队中工作时,你会真正欣赏到Rust 及其工具相对于 Cpp(以及其他语言)所提供的优势。...在Rust中,安全代码是默认的;你必须明确地将其包装在 unsafe 的代码块中,并且必须意识到这一点。在不安全的区域之外,我几乎可以保证不会出现使用后释放错误或类似的问题。...中的lambda函数中,我不能...因此,我需要将continue/break/return重新定义为一个结果值(或标志),然后在 std::visit 之后根据它进行分支。...当然,我仍然认为实际的泛型是比模板更好的选择,只是恰好这些特性对于高性能代码和甚至安全性(单位……你现在在Rust中很难做到这一点,也有其他原因)非常重要,并且在库生态系统和常量泛型之后,它们是阻止我在

    34610

    一文快速理解Rust语言扩展trait

    科学无非就是在自然界的多样性中寻求统一性(或者更确切地说,是在我们经验的多样性中寻求统一性)。...用 Coleridge 的话说,诗歌、绘画、艺术,同样是在多样性中寻求统一性 ——Jacob Bronowski Rust “实用工具” trait,这是标准库中各种 trait 的“百宝箱”,它们对...Rust 的编写方式有相当大的影响,所以,只有熟悉它们,你才能写出符合 Rust 语言惯例的代码并据此为你的 crate 设计公共接口,让用户认为这些接口是符合 Rust 风格的 语言扩展trait 运算符重载...Rust的Drop trait是在值离开作用域时被自动调用的,而不是在值被销毁时。...这样的解引用运算符在你的类型上的行为 在Rust中,Deref 和 DerefMut 是两个 trait,它们允许我们重载解引用运算符 * 和 *mut 1.

    12510

    智能合约开发语言 — Move 与 Rust 的对比 (#2)

    借入指令在执行时将使用指令自省检查是否在同一交易中稍后安排还款指令。...如果还款指令调用不存在或无效,则此阶段交易将失败 在借入和还款调用之间,借入的资金可以被介于两者之间的任何其他指令任意使用 在交易结束时,还款指令调用会将资金返还给闪电贷智能合约(在借入指令中使用自省检查该指令的存在...这就是为什么 Solana 团队不得不对 Rust 代码库和 eBPF LLVM 后端(例如支持通过堆栈传递参数[16])进行多次修改。...这可能意味着与其他字节码格式(如 eBPF/SBF)相比,性能较低,因为后者更接近于原生代码,人们可能会认为这将是在高性能 L1 中使用的一个问题。...其他 Move 特性 在本章中,我将描述 Move 的一些其他特性,这些特性也许不是本文讨论的核心,但仍然是相关的。 7.1.

    1K30

    【翻译】微软对 Rust 的热爱是怎么回事?

    以下是 TIOBE 对上述一些发展的看法: 主要原因是 Rust 是一种正确的系统编程语言。Rust 在静态强类型化的同时,解决了其他编程语言的冗余编程和一些尖锐问题。...在这次调查发布之前,Rust 仅仅是连续第四年成为“最受喜爱”的语言,Stack Overflow 在一篇题为“什么是 Rust,为什么它这么受欢迎”的文章中对这一现象进行了深入剖析。...微软 MSRC 团队在 2019 年 7 月的一篇文章中表示:“我们认为 Rust 编程语言是目前业界尽可能采用的最佳选择,因为它能够以一种内存安全的方式编写系统级程序。”...但是除了性能和安全性以外,MSRC 团队还发现其他 Microsoft 团队出于其他原因而使用 Rust,包括: 根据一项内部调查,采纳 Rust 的首要原因是“正确性” —— 这是 Rust 安全保证的延伸...虽然 Rust 仍然是一种年轻的语言,但它已经拥有一个健康的生态系统,拥有一个活跃和开放的编译器与语言开发过程,并且它显示了促进一个强大的开源社区和支持生产用户的能力。

    1.1K10
    领券