Java中mutable对象和immutable对象的区别
2016-04-20 17:03
531 查看
今天读jdk源码中Map.java时看到一句话:“great care must be exercised if mutable objects are used as map keys”;
第一次知道mutable对象这个概念,google了一下,维基百科定义如下:
“In object-oriented and functional programming,
an immutable object (unchangeable[1] object)
is an object whose state cannot be modified after it is created.[2] This
is in contrast to a mutable object (changeable object) , which can be modified after it is created. In some cases, an object is considered immutable even if some internally used attributes
change but the object's state appears to be unchanging from an external point of view. For example, an object that uses memoization to
cache the results of expensive computations could still be considered an immutable object.”
在面向对象和函数式编程中,一个immutable对象(不可变对象)是指一旦创建之后状态不可改变的对象。mutable对象(可变对象)是指创建之后也可以修改的对象。在有些情况下,对象也被认为是不可变的(immutable),即,一个对象包含的内部使用的属性改变了,但从外部看对象的状态并没有改变。例如,一个使用memoization来缓存复杂计算结果的对象仍然被看作是不可变(immutable)对象.
在面向对象编程中,String 以及其他的具体对象都被看作是不可变(immutable)对象,以提高可读性和运行效率。
不可变对象有几个优点:
线程安全
易于理解
比可变对象有更高的安全性
Java中不可变对象的经典例子就是String类的实例:
尽管String类声明中没有提供让它成为不可变对象的语法,但是,String类的方法中没有方法去改变一个String包含的数据,这就使得它是不可变的。
Java中关键字final用于声明原始数据类型(primitive types)和对象引用为不可变对象,但是它不能使对象本身变为不可变对象。
原始数据类型(primitive types)变量(int, long, short等)定义之后还可以再重新赋值,可以使用final阻止这样的赋值。
仅仅使用final关键字还不能让引用类型(reference types)成为不可变对象,final只能阻止重新赋值。
原始类型包装类(primitive wrappers)(Integer,Long, Short, Double, Float, Character, Byte, Boolean)也都是不可变的。
第一次知道mutable对象这个概念,google了一下,维基百科定义如下:
“In object-oriented and functional programming,
an immutable object (unchangeable[1] object)
is an object whose state cannot be modified after it is created.[2] This
is in contrast to a mutable object (changeable object) , which can be modified after it is created. In some cases, an object is considered immutable even if some internally used attributes
change but the object's state appears to be unchanging from an external point of view. For example, an object that uses memoization to
cache the results of expensive computations could still be considered an immutable object.”
在面向对象和函数式编程中,一个immutable对象(不可变对象)是指一旦创建之后状态不可改变的对象。mutable对象(可变对象)是指创建之后也可以修改的对象。在有些情况下,对象也被认为是不可变的(immutable),即,一个对象包含的内部使用的属性改变了,但从外部看对象的状态并没有改变。例如,一个使用memoization来缓存复杂计算结果的对象仍然被看作是不可变(immutable)对象.
在面向对象编程中,String 以及其他的具体对象都被看作是不可变(immutable)对象,以提高可读性和运行效率。
不可变对象有几个优点:
线程安全
易于理解
比可变对象有更高的安全性
Java中不可变对象的经典例子就是String类的实例:
String s = "ABC"; s.toLowerCase();toLowerCase()方法不会改变s中包含的数据“ABC”。而是创建一个新的String对象并将其初始化为“abc”,然后返回这个新对象的引用。
尽管String类声明中没有提供让它成为不可变对象的语法,但是,String类的方法中没有方法去改变一个String包含的数据,这就使得它是不可变的。
Java中关键字final用于声明原始数据类型(primitive types)和对象引用为不可变对象,但是它不能使对象本身变为不可变对象。
原始数据类型(primitive types)变量(int, long, short等)定义之后还可以再重新赋值,可以使用final阻止这样的赋值。
int i = 42; //int is of primitive type i = 43; // OK final int j = 42; j = 43; // does not compile. j is final so can't be reassigned
仅仅使用final关键字还不能让引用类型(reference types)成为不可变对象,final只能阻止重新赋值。
final MyObject m = new MyObject(); //m is of reference type m.data = 100; // OK. We can change state of object m (m is mutable and final doesn't change this fact) m = new MyObject(); // does not compile. m is final so can't be reassigned
原始类型包装类(primitive wrappers)(Integer,Long, Short, Double, Float, Character, Byte, Boolean)也都是不可变的。
相关文章推荐
- Ubuntu15.10安装myeclipse2015
- 教你快速使用eclipse开发工具
- Java之ArrayList源码解读(JDK 1.8)
- 使用spring @Scheduled注解执行定时任务
- JAVA字符串格式化-String.format()的使用
- Spring AOP实现系统日志记录
- spring cloud:eureka服务发现
- JAVA字符串占位符替换
- 地域划分-Java
- java mysql 数据类型对照
- JAVA中的接口
- Spring bean实例化时间点及相关若干问题
- 神奇的JAVA多态
- java ftp上传下载,下载文件编码设置
- JAVA进行身份证验证
- Struts2+Spring4+Hibernate4整
- Java中普通代码块,构造代码块,静态代码块区别及代码示例
- Spring中整合Xfire发布webservice服务
- Spring之config.xml配置
- 怎样在eclipse里安装Hibernate / JBoss 工具【最新】