为什么String要设计成不可变的?】的更多相关文章

String是Java中最常用的类,是不可变的(Immutable), 那么String是如何实现Immutable呢,String为什么要设计成不可变呢? 前言 关于String,收集一波基础,来源标明最后,不确定是否权威, 希望有问题可以得到纠正. 0. String的内存模型 Java8以及以后的字符串新建时,直接在堆中生成对象,而字符创常量池位于Metaspace.必要的时候,会把堆中的指针存入Metaspace, 而不是复制. Metaspace位于虚拟机以外的直接内存,因此大小和外部…
There are many reasons due to the string class has been made immutable in Java. These reasons in view, concurrency issues, security issues and performance issues. Here is a list of various valid reasons to go for immutable string class: String在Java中被…
声明:本博客为原创博客,未经同意,不得转载!小伙伴们假设是在别的地方看到的话,建议还是来csdn上看吧(原文链接为http://blog.csdn.net/bettarwang/article/details/26744661),看代码和提问.讨论都更方便. Java中final的作用主要表如今三方面:修饰变量.修饰方法和修饰类.以下就从这两个方面来解说final的作用.在文末从final及类的设计安全性出发,论述了Java中String为何要被设计成不可变类. 1.final修饰变量 fina…
英文原:http://www.programcreek.com/2013/04/why-string-is-immutable-in-java/ 转自:http://blog.csdn.net/renfufei/article/details/16808775 这是一个老生常谈的话题. 在Java中将String设计成不可变的是综合考虑到各种因素的结果,想要理解这个问题,需要综合内存,同步,数据结构以及安全等方面的考虑. 在下文中,我将为各种原因做一个小结. 1. 字符串常量池的需要 字符串常量…
String是所有语言中最常用的一个类.我们知道在Java中,String是不可变的.final的.Java在运行时也保存了一个字符串池(String pool),这使得String成为了一个特别的类. 主要是为了 “ 效率 ” 和 “ 安全性 ” 的缘故. 若 String 允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所以 String 被定义成 final. 一:String 和其他基本类型不同 , 他是个对象类型. 既然是对象类型 , 如果是在静态方法下是必须调用静态方法或…
在Java中将String设计成不可变的是综合考虑到各种因素的结果,需要综合考虑内存.同步.数据结构以安全方面的考虑. String被设计成不可变的主要目的是为了安全和高效. 1)字符串常量池的需要 字符串常量池是Java堆内存中的一个特殊的存储区域,当创建一个String对象时,加入此字符串值已经在常量池中,则不会创建新的对象,而是引用已经存在的对象. 如下代码所示,将会在堆内存中只创建一个实际的String对象 String s1 = "abcd"; String s2 = &qu…
1.享元模式: 1.共享元素模式,也就是说:一个系统中如果有多处用到了相同的一个元素,那么我们应该只存储一份此元素,而让所有地方都引用这一个元素. 2.Java中String就是根据享元模式设计的,而那个存储元素的地方就叫做 "字符串常量池--String Pool". public class A…
本系列目录:Abp介绍和经验分享-目录 这篇是之前翻备忘录发现漏了的,前阵子刚好同事又提及过这个问题,这里补上. 本文重点在于理解什么是值对象的不可变性. Abp的ValueObject以及EF的ComplexType Abp中对应DDD概念的值对象有个基类:ValueObject<T>. 这个基类默认重写了Equals,GetHashCode等用于比较两个实例是否相等的方法和重载了==,!=操作符. 在构建一些比较复杂的实体时,我们可以把属于同一个概念的多个属性或字段封装成一个值对象. 这个…
1 对象不可变定义 不可变对象是指对象的状态在被初始化以后,在整个对象的生命周期内,不可改变. 2 如何不可变 通常情况下,在java中通过以下步骤实现不可变 对于属性不提供设值方法 所有的属性定义为private final 类声明为final不允许继承 Return deep cloned objects with copied content for all mutable fields in class 注意:不用final关键字也可以实现对象不可变,使用final只是显示的声明,提示开…
在java中,String是字符串常量,可以从内存,同步机制,数据结构等方面分析 1:字符串中常量池的需要 String不同于普通基础变量类型的地方在于对象.java中的字符串对象都保存在字符串常量池中,创建字符串时首先会从这个常量池中查找是否已经存在相同的字符串对象,不存在的情况下才会创建新的字符串对象. 如果字符串被设计成可变的,便存在当修改一个字符串的时候同时影响另一个指向常量池的相同对象(有潜在性风险) 2:HashCode缓存 在HashMap或者HashSet数据结构中,存储Stri…