1.1 定义

  不可变类(Immutable Objects):当类的实例一经创建,其内容便不可改变,即无法修改其成员变量。

  可变类(Mutable Objects):类的实例创建后,可以修改其内容。

  Java 中八个基本类型的包装类和 String 类都属于不可变类,而其他的大多数类都属于可变类。

  ps: 某个对象在被创建后其状态就不能被修改,那么这个对象就称为不可变对象,不可变对象一定是线程安全的。不可变对象很简单。他们只有一种状态,并且该状态由构造函数来控制。

  需要特别注意的是,不可变类的不可变是指该类的实例不可变而非指向该实例的引用的不可变

1.2 充分条件

当满足以下条件时,对象才是不可变的:

(1)对象创建以后其状态就不能改变;

(2)对象的所有域都是final类型;

(3)对象是正确创造的(在对象创建期间,this引用没有溢出)。

1.3 特征

一个不可变类的定义应当具备以下特征:

  1. 所有成员都是 private final 的
  2. 不提供对成员的改变方法,例如:setXXXX
  3. 确保所有的方法不会被重载。手段有两种:使用final Class(强不可变类),或者将所有类方法加上final(弱不可变类)。
  4. 如果某一个类成员不是基本类型(primitive type)或不可变类,必须通过在成员初始化(in)或者getter方法(out)时通过深度拷贝(即复制一个该类的新实例而非引用)方法,来确保类的不可变。
  5. 如果有必要,重写hashCode和equals方法,同时应保证两个用equals方法判断为相等的对象,其hashCode也应相等。

1.4 优缺点

1. 优点:效率和安全。

  • 效率(拷贝地址+缓存)

      1. 当一个对象是不可变的,那么需要拷贝这个对象的内容时,就不用复制它的本身而只是复制它的地址,复制地址(通常一个指针的大小)只需要很小的内存空间,具有非常高的效率。同时,对于引用该对象的其他变量也不会造成影响。

      2. 不变性保证了hashCode 的唯一性,因此可以放心地进行缓存而不必每次重新计算新的哈希码。而哈希码被频繁地使用, 比如在hashMap 等容器中。将hashCode 缓存可以提高以不变类实例为key的容器的性能。

  • 线程安全

      在多线程情况下,一个可变对象的值很可能被其他进程改变,这样会造成不可预期的结果,而使用不可变对象就可以避免这种情况同时省去了同步加锁等过程,因此不可变类是线程安全的。

2. 缺点:不可变类的每一次“改变”都会产生新的对象,因此在使用中不可避免的会产生很多垃圾。

转载于:https://www.cnblogs.com/haimishasha/p/11592583.html

Java 基础系列:不变性相关推荐

  1. string substring的用法_夯实Java基础系列3:一文搞懂String常见面试题,从基础到实战...

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  2. 基础的java增删改查,Java基础系列(基础):Java使用Cookie增删改查操作!

    什么是Cookie? Cookie是由W3C组织提出,最早由NetScape社区发展的一种机制. Cookie是存储于访问者的计算机中的变量.每当同一台计算机通过浏览器请求某个页面时,就会发送这个co ...

  3. java中this_夯实Java基础系列7:一文读懂Java 代码块和执行顺序

    目录 #java中的构造方法 #构造方法简介 #构造方法实例 #例-1 #例-2 #java中的几种构造方法详解 #普通构造方法 #默认构造方法 #重载构造方法 #java子类构造方法调用父类构造方法 ...

  4. [转载] 夯实Java基础系列8:深入理解Java内部类及其实现原理

    参考链接: Java内部类 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tut ...

  5. java基础系列十七(时间日期转换)

    目录 一.概述 二.基础知识 2.1 时区 2.2 格林威治时间 2.3 时间戳 三.Date/Calendar/SimpleDateFormat 3.1 Date 3.2 Calendar 3.3 ...

  6. 知其然,知其所以然之Java基础系列(一)

    相信大家在最初接触Java基础学习的时候,也只是跟着课本上的描述学习,知其然,不知所以然,要想成为一个Java老鸟,不仅要学会怎么用,也要知道为何这么用.在Java基础系列的博客中,我会列举一系列大家 ...

  7. 夯实Java基础系列9:深入理解Class类和Object类

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  8. 夯实Java基础系列22:一文读懂Java序列化和反序列化

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  9. Java基础系列【导读】

    Java基础系列导读 Java基础 JaveWEB Java基础 基础系列[一]-- Java语言介绍 基础系列[二]-- 环境搭建 基础系列[三]-- Java基础语法 基础系列[四]-- 面向对象 ...

  10. 夯实Java基础系列15:Java注解简介和最佳实践

    Java注解简介 注解如同标签 Java 注解概述 什么是注解? 注解的用处 注解的原理 元注解 JDK里的注解 注解处理器实战 不同类型的注解 类注解 方法注解 参数注解 变量注解 Java注解相关 ...

最新文章

  1. Qt安装—图文并茂搭建VS2008+QT开发环境
  2. spring boot实战(第七篇)内嵌容器tomcat配置
  3. Android的JNI开发涉及的char和string之间的互相转换
  4. 通过零拷贝实现高效的数据传输(操作系统)
  5. electron 打包_Vue3+Electron整合方式
  6. python中的thread_Python中的thread
  7. html简单跨行跨列表格制作
  8. java集合之failfast机制
  9. PreparedStatement是如何防止SQL注入的?
  10. java iso-8859-1_如何在Java中的ISO-8859-1和UTF-8之间转换?
  11. Android开发笔记(一百七十八)更安全的数据仓库DataStore
  12. 【Acm】算法之美—Fire Net
  13. Centos7安装maven过程
  14. couchbase php,从PHP SDK设置后,Couchbase视图不会更新
  15. 美国大学网站一网打尽
  16. 基于JavaEye-API实现的Gerry-聊天QQ版v1.0 (全)
  17. trunc和round区别
  18. PTA—C语言练习题
  19. trinity运行原理及常见报错(一)
  20. UnityHub无法打开项目:Failed to read D3DCompiler DLL file

热门文章

  1. 软件开发作为一种价值领域的研究
  2. CKEditor 4 编辑器已与 Vue.js 集成
  3. 微软对 Windows 10 Mobile 的支持将于12月10日结束
  4. 给一个div innerhtml 后 没有内容显示的问题_实战:仅用18行JavaScript构建一个倒数计时器...
  5. c++ 多个字符串排序_RPython Data Science系列:数据处理(5)--字符串函数基于R(一)
  6. 清华大学自主研究的计算机,清华大学人工智能研究院成立基础理论研究中心,朱军教授任中心主任...
  7. python在材料模拟中的应用_材料模拟在计算机中使用的软件
  8. leveldb java实例_EZDB首页、文档和下载 - LevelDB 的 Java 封装 - OSCHINA - 中文开源技术交流社区...
  9. 全文搜索引擎有哪些?_你想要拥有自己的搜索引擎吗?
  10. stm32f407网页服务器,STM32F407单片机通过USR-LTE-7S4模块和服务器进行4G通信