iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java mutable对象和immutable对象的区别说明
  • 475
分享到

Java mutable对象和immutable对象的区别说明

2024-04-02 19:04:59 475人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

Java mutable对象和immutable对象的区别 今天读jdk源码中Map.java时看到一句话: great care must be exercised if mut

Java mutable对象和immutable对象的区别

今天读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 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)也都是不可变的。

Java mutable 和 immutable类型

含义解释

immutable : variables that are assigned once and never reassigned.

mutable : When you assign to a variable or a field, you're changing where the variable's arrow points. You can point it to a different value. When you assign to the contents of a mutable value – such as an array or list – you're changing references inside that value.

基本类型及其封装对象类型都是不可变的

图形化解释 Snapshot Diagram

mutable:

mutable

immutable:

immutable

举例

例如String和StringBuilder:

1. String是immutable的,每次对于String对象的修改都将产生一个新的String对象,而原来的对象保持不变。

2. StringBuilder是mutable,因为每次对于它的对象的修改都作用于该对象本身,并没有产生新的对象。

如何保证自己创建的类是immutable类

  • 所有成员都是private final。
  • 不提供对成员的改变方法,setXX
  • 确保所有的方法不会被重写。手段有两种:使用final Class(强不可变类),或者将所有类方法加上final(弱不可变类)。
  • 如果某一个类成员不是原始变量(例如int,double)或者不可变类,必须通过在成员初始化或者使用get方法时要通过深度拷贝方法,来确保类的不可变。

优缺点

使用不可变类型,对其频繁修改会产生大量的临时拷贝(需要垃圾回收) ;

可变类型最 少化拷贝以提高效率。

使用可变数据类型,可获得更好的性能 ,也适合于在多个模块之间共享数据 。例如全局变量。

不可变类型更“安全”, 在其他质量指标上表现更好。

对可变类型可能造成的风险,我们通过防御式拷贝(深度拷贝),给客户端返回一个全新的可变类型的对象,大部分时候该拷贝不会被客户端修改, 可能造成大量的内存浪费。

深度拷贝

当只是引用传递或者根据对象的值创建新的值,称为“浅复制”,当原对象的发生改变时,根据上面方式创建的新对象的也会随之改变;

而如果采用深度复制,那是真正的复制了一份新的对象,新对象的与原对象不存在任何关联,原对象发生改变不会影响新对象。

--结束END--

本文标题: Java mutable对象和immutable对象的区别说明

本文链接: https://www.lsjlt.com/news/128005.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java mutable对象和immutable对象的区别说明
    Java mutable对象和immutable对象的区别 今天读jdk源码中Map.java时看到一句话: great care must be exercised if mut...
    99+
    2022-11-12
  • Java中mutable对象和immutable对象有什么区别
    这篇文章主要介绍了Java中mutable对象和immutable对象有什么区别,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Java mutable对象和immutable...
    99+
    2023-06-15
  • 【Java List与对象】List<T>对象和对象List<T>的区别(125)
    List<T>对象:对象里面的元素属性包含List<T>(只有一个对象); 对象List<T>:List<T>里面的数据是对象类型(可以有多组对象,但必须是同一个类型); 测试案例: Book类: import java.util.List...
    99+
    2023-08-30
    java list windows
  • JavaScript对象和内置对象的区别
    这篇文章主要讲解了“JavaScript对象和内置对象的区别”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript对象和内置对象的区别”吧!一、...
    99+
    2022-10-19
  • VBS对象Dictionary的属性和说明
    本篇内容主要讲解“VBS对象Dictionary的属性和说明”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“VBS对象Dictionary的属性和说明”吧!Dictionary 保存数据键和项目对...
    99+
    2023-06-08
  • java类对象和实例对象有什么区别
    在Java中,一个类是一个模板或者蓝图,它定义了对象的属性和行为。而一个类对象是指类本身,可以通过类名访问静态属性和方法。 另一方面...
    99+
    2023-10-24
    java
  • java对象对比之comparable和comparator的区别
    一、元素的比较 1.1 基本类型的比较 java中的基本类型的对象是可以进行比较的 如 public static void main(String[] args){ ...
    99+
    2022-11-12
  • jquery对象和js对象的区别有哪些
    本篇内容主要讲解“jquery对象和js对象的区别有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“jquery对象和js对象的区别有哪些”吧! ...
    99+
    2022-10-19
  • jquery对象和js对象有什么区别
    这篇文章主要为大家展示了“jquery对象和js对象有什么区别”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“jquery对象和js对象有什么区别”这篇文章吧。 ...
    99+
    2022-10-19
  • 基于Java class对象说明、Java 静态变量声明和赋值说明(详解)
    先看下JDK中的说明:java.lang.Object java.lang.Class<T> Instances of the class Class represent classes and interfaces in ...
    99+
    2023-05-31
    java 静态变量 赋值
  • spring中IOC控制反转依赖注入和new对象的区别说明
    目录IOC控制反转依赖注入和new对象的区别new对象依赖注入spring的IOC容器比New对象究竟好在哪IOC控制反转依赖注入和new对象的区别 spring默认是单例模式的,依...
    99+
    2022-11-13
  • OC 创建对象和 Swift 创建对象的区别
    一、创建对象的语法差异 Objective-C:在Objective-C中,创建对象通常需要调用类的alloc和init方法,如: MyClass *object = [[MyClass alloc] init]; Swi...
    99+
    2023-10-29
    对象 区别 OC
  • Vue.delete()删除对象的属性说明
    目录Vue.delete()删除对象的属性delete和Vue.delete的区别Vue.delete()删除对象的属性 Vue.delete( target, key ) da...
    99+
    2022-11-13
  • SpringMVC中的Model对象用法说明
    模型对象的作用主要是保存数据,可以借助它们将数据带到前端。 常用的模型对象有以下几个: ModelAndView(顾名思义,模型和视图,既可以携带数据信息,也可以携带视图信息,常规用...
    99+
    2022-11-12
  • C++类与对象的详细说明
    目录类的引入类的定义1、声明和定义全部放在类体中2、声明放在头文件,定义放在源文件中类的访问限定符号及封装访问限定符封装类的实例化类对象模型this指针this指针的特性总结类的引入...
    99+
    2022-11-13
  • Java中的对象与C++中的对象有什么区别
    Java中的对象与C++中的对象有什么区别?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java中对象与C++中对象的放置安排的对比概要:Java中,所有的对象都存放在堆(He...
    99+
    2023-05-31
    java c++ ava
  • es6的map对象和原生对象有什么区别
    本篇内容主要讲解“es6的map对象和原生对象有什么区别”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“es6的map对象和原生对象有什么区别”吧! ...
    99+
    2022-10-19
  • JS中的Map对象用法及说明
    目录JS中的Map对象JS中Map和普通对象Map对象Object对象Objects 和 maps 的比较总结JS中的Map对象 1.js创建map对象 var map = new ...
    99+
    2023-02-23
    JS中的Map对象 Map对象用法 Map对象说明
  • C++类与对象的详细说明2
    目录类的默认成员函数构造函数概念特性析构函数概念特性拷贝构造函数概念特征赋值运算符重载运算符重载赋值运算符重载取地址及const取地址操作符重载总结类的默认成员函数 每个类中,如果不...
    99+
    2022-11-13
  • Python的编程风格及对象说明
    本篇内容介绍了“Python的编程风格及对象说明”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1)#!/usr/bin/env python...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作