今天读jdk源码中Map.java时看到一句话:“great care must be exercised if mutable objects are used as map keys”;

第一次知道mutable对象这个概念,google了一下,维基百科定义如下:

“Inobject-orientedandfunctionalprogramming, animmutable object(unchangeableobject) is anobjectwhose state cannot be modified after it is created.This is in contrast to amutable 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 usesmemoizationto 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)也都是不可变的。

mutable Java_Java中mutable对象和immutable对象的区别相关推荐

  1. overwrite java_java中,到底overwrite和override有什么区别?

    展开全部 Override,Overload,Overwrite的区别 首先: Override是方法的覆盖 overload是方法的重载 Overwrite是方法的重写 一,方法的覆盖(Overri ...

  2. 多线程:Immutable对象?如何创建Immutable对象?

    那么什么是immutable objects?什么又是mutable Objects呢? immutable Objects就是那些一旦被创建,它们的状态就不能被改变的Objects,每次对他们的改变 ...

  3. immutable java_Java中的mutable和immutable对象实例讲解

    1.mutable(可变)和immutable(不可变)类型的区别 可变类型的对象:提供了可以改变其内部数据值的操作,其内部的值可以被重新更改. 不可变数据类型:其内部的操作不会改变内部的值,一旦试图 ...

  4. 类体 java_java中的类与对象

    面向对象编程主要有三个特征:封装.继承和多态. 封装 一个简单的问题 一个能输出圆的面积的Java应用程序. public class ComputerCircleArea { public stat ...

  5. tlab java_Java中的逃逸分析和TLAB以及Java对象分配

    我们在学习使用Java的过程中,一般认为new出来的对象都是被分配在堆上,但是这个结论不是那么的绝对,通过对Java对象分配的过程分析,可以知道有两个地方会导致Java中new出来的对象并一定分别在所 ...

  6. C++中mutable、volatile关键字

    C++中mutable.volatile关键字 mutable和volatile 很少遇到这两个关键字,学嵌入式估计知道后者,深入研究C++的估计知道前者. (1)mutable 在C++中,muta ...

  7. Scala类的定义,主/辅构造器,以及方法中的变量定义,单例对象,伴生对象,Apply方法调用,应用程序对象

    1. 类 1.1. 类的定义 package cn.toto.scala.day2/*** 在Scala中,类并不用声明为public类型的.* Scala源文件中可以包含多个类,所有这些类都具有共有 ...

  8. SpringMvc4中获取request、response对象的方法

    springMVC4中获取request和response对象有以下两种简单易用的方法: 1.在control层获取 在control层中获取HttpServletRequest和HttpServle ...

  9. js中的DOM对象和jQuery对象的比较

    1. 二者的不同之处: 通过jQuery获取的元素是一个数组, 数组中包含着原生JS中的DOM对象. 例如, 针对下面的一个div结构: <div id="Box">& ...

最新文章

  1. python什么时候诞生的_关于RFC 3339日期时间:在Python中产生timestamp
  2. 在mvc4里怎样引用:System.Web.Optimization和entityframework
  3. linux删除之前的文件日志
  4. 忘记MySQL密码怎么办?一招教你搞定!
  5. python系统学习:第二周之购物车功能
  6. Python中的正则表达式找到所有符合要求的字符串
  7. CSS如何水平垂直居中?
  8. Spark生态之Spark Streaming
  9. 多窗口文件管理软件 Q_Dir
  10. 随身助手271个可用api接口网站php源码(随身助手API)
  11. mysql读mdf_mdf文件如何导入MySQL数据库?
  12. python求三位数每一位的和_输入一个三位数的整数,求这个三位数每一位上数字的和是多少。例如,输入: 382,输出:和为 13。 编写 Python 程序实现上述要求...
  13. Zemax操作24--高斯光束的聚焦和传播
  14. 北大三日游游记(北大信科暑期课堂)
  15. 知识图谱构建——Jena推理(三)
  16. SD卡报错“error -110 whilst initialising SD card
  17. 路由交换接口类型详解——通俗易懂版
  18. 化工专业和计算机专业哪个好就业前景,2019化学工程与工艺专业就业前景和就业方向分析...
  19. GC8872 Globalchip国产低成本电机驱动芯片,可替代TI的DRV8872 一款具有故障报告功能的 3.6A 刷式直流电机驱动器(PWM控制)
  20. C语言探索之旅 | 第一部分第二课:工欲善其事,必先利其器

热门文章

  1. matlab怎么新建文件运行不了,如何使用MathWorks的MATLAB程序创建脚本文件
  2. Python 常用随机数函数
  3. Android隐藏Activity
  4. magix中的2种事件绑定方式
  5. 7 975EE与i7980XE两种CPU的峰值计算能力(每秒多少次浮点运
  6. C语言与Python3
  7. 双电源运放全波整流电路
  8. docker 上的mongodb数据库操作命令
  9. GISer转行送快递,如何寻个“风水宝地“?
  10. Windows下100个CMD常用命令(1)