电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java mutable對象和immutable對象的區別說明

瀏覽:98日期:2022-08-11 08:26:27
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 typei = 43; // OKfinal 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 typem.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:

Java mutable對象和immutable對象的區別說明

immutable:

Java mutable對象和immutable對象的區別說明

舉例

例如String和StringBuilder:

1. String是immutable的,每次對于String對象的修改都將產生一個新的String對象,而原來的對象保持不變。

2. StringBuilder是mutable,因為每次對于它的對象的修改都作用于該對象本身,并沒有產生新的對象。

如何保證自己創建的類是immutable類 所有成員都是private final。 不提供對成員的改變方法,setXX 確保所有的方法不會被重寫。手段有兩種:使用final Class(強不可變類),或者將所有類方法加上final(弱不可變類)。 如果某一個類成員不是原始變量(例如int,double)或者不可變類,必須通過在成員初始化或者使用get方法時要通過深度拷貝方法,來確保類的不可變。優缺點

使用不可變類型,對其頻繁修改會產生大量的臨時拷貝(需要垃圾回收) ;

可變類型最 少化拷貝以提高效率。

使用可變數據類型,可獲得更好的性能 ,也適合于在多個模塊之間共享數據 。例如全局變量。

不可變類型更“安全”, 在其他質量指標上表現更好。

對可變類型可能造成的風險,我們通過防御式拷貝(深度拷貝),給客戶端返回一個全新的可變類型的對象,大部分時候該拷貝不會被客戶端修改, 可能造成大量的內存浪費。

深度拷貝

當只是引用傳遞或者根據對象的值創建新的值,稱為“淺復制”,當原對象的發生改變時,根據上面方式創建的新對象的也會隨之改變;

而如果采用深度復制,那是真正的復制了一份新的對象,新對象的與原對象不存在任何關聯,原對象發生改變不會影響新對象。

標簽: Java
相關文章:
主站蜘蛛池模板: 伸缩器_伸缩接头_传力接头-巩义市润达管道设备制造有限公司 | 防爆正压柜厂家_防爆配电箱_防爆控制箱_防爆空调_-盛通防爆 | 优秀的临床医学知识库,临床知识库,医疗知识库,满足电子病历四级要求,免费试用 | 钢板仓,大型钢板仓,钢板库,大型钢板库,粉煤灰钢板仓,螺旋钢板仓,螺旋卷板仓,骨料钢板仓 | 合肥防火门窗/隔断_合肥防火卷帘门厂家_安徽耐火窗_良万消防设备有限公司 | 深圳宣传片制作_产品视频制作_深圳3D动画制作公司_深圳短视频拍摄-深圳市西典映画传媒有限公司 | 流量卡中心-流量卡套餐查询系统_移动电信联通流量卡套餐大全 | arch电源_SINPRO_开关电源_模块电源_医疗电源-东佑源 | 工控机-工业平板电脑-研华工控机-研越无风扇嵌入式box工控机 | 软启动器-上海能曼电气有限公司| 首页 - 张店继勇软件开发工作室 兰州UPS电源,兰州山特UPS-兰州万胜商贸 | 模具钢_高速钢_不锈钢-万利钢金属材料 | 长沙发电机-湖南发电机-柴油发电机供应厂家-长沙明邦智能科技 | 滚塑PE壳体-PE塑料浮球-警示PE浮筒-宁波君益塑业有限公司 | 光伏支架成型设备-光伏钢边框设备-光伏设备厂家 | 耐磨陶瓷管道_除渣器厂家-淄博浩瀚陶瓷科技有限公司 | 河南砖机首页-全自动液压免烧砖机,小型砌块水泥砖机厂家[十年老厂] | 建筑消防设施检测系统检测箱-电梯**检测仪器箱-北京宇成伟业科技有限责任公司 | 鲁尔圆锥接头多功能测试仪-留置针测试仪-上海威夏环保科技有限公司 | 温州中研白癜风专科_温州治疗白癜风_温州治疗白癜风医院哪家好_温州哪里治疗白癜风 | 安徽千住锡膏_安徽阿尔法锡膏锡条_安徽唯特偶锡膏_卡夫特胶水-芜湖荣亮电子科技有限公司 | EFM 022静电场测试仪-套帽式风量计-静电平板监测器-上海民仪电子有限公司 | 不锈钢拉手厂家|浴室门拉手厂家|江门市蓬江区金志翔五金制品有限公司 | 净气型药品柜-试剂柜-无管道净气型通风柜-苏州毕恩思 | 桑茶-七彩贝壳桑叶茶 长寿茶 | 步进_伺服_行星减速机,微型直流电机,大功率直流电机-淄博冠意传动机械 | 山东集装箱活动房|济南集装箱活动房-济南利森集装箱有限公司 | 深圳宣传片制作-企业宣传视频制作-产品视频拍摄-产品动画制作-短视频拍摄制作公司 | 塑胶跑道_学校塑胶跑道_塑胶球场_运动场材料厂家_中国塑胶跑道十大生产厂家_混合型塑胶跑道_透气型塑胶跑道-广东绿晨体育设施有限公司 | 闭端端子|弹簧螺式接线头|防水接线头|插线式接线头|端子台|电源线扣+护线套|印刷电路板型端子台|金笔电子代理商-上海拓胜电气有限公司 | 山东包装,山东印刷厂,济南印刷厂-济南富丽彩印刷有限公司 | 翰墨AI智能写作助手官网_人工智能问答在线AI写作免费一键生成 | 哈希余氯测定仪,分光光度计,ph在线监测仪,浊度测定仪,试剂-上海京灿精密机械有限公司 | 青州开防盗门锁-配汽车芯片钥匙-保险箱钥匙-吉祥修锁店 | TPE_TPE热塑性弹性体_TPE原料价格_TPE材料厂家-惠州市中塑王塑胶制品公司- 中塑王塑胶制品有限公司 | 冷库安装厂家_杭州冷库_保鲜库建设-浙江克冷制冷设备有限公司 | 船用烟火信号弹-CCS防汛救生圈-船用救生抛绳器(海威救生设备) | 建筑消防设施检测系统检测箱-电梯**检测仪器箱-北京宇成伟业科技有限责任公司 | nalgene洗瓶,nalgene量筒,nalgene窄口瓶,nalgene放水口大瓶,浙江省nalgene代理-杭州雷琪实验器材有限公司 | 自动化展_机器人展_机床展_工业互联网展_广东佛山工博会 | 珠海冷却塔降噪维修_冷却塔改造报价_凉水塔风机维修厂家- 广东康明节能空调有限公司 |