Java中的不可变类理解】的更多相关文章

一.Java中的不可变类 不可变类(Immutable Objects):当类的实例一经创建,其内容便不可改变,即无法修改其成员变量. 可变类(Mutable Objects):类的实例创建后,可以修改其内容. Java 中八个基本类型的包装类和 String 类都属于不可变类,而其他的大多数类都属于可变类. 二.与引用不可变的区别 需要特别注意的是,不可变类的不可变是指该类的实例不可变而非指向该实例的引用的不可变. String s = "abc"; System.out.print…
概念:不可变类的意思是创建该类的实例后,该实例的属性是不可改变的.java中的8个包装类和String类都是不可变类.所以不可变类并不是指该类是被final修饰的,而是指该类的属性是被final修饰的. 自定义不可变类遵守如下原则: 1.使用private和final修饰符来修饰该类的属性. 2.提供带参数的构造器,用于根据传入的参数来初始化属性. 3.仅为该类属性提供getter方法,不要提供setter方法. 4.如果有必要,重写hashCode和equals方法,同时应保证两个用equal…
//不可变类举例: /* 下面程序试图定义一个不可变类Person类,但=因为Person类包含一个引用类型的成员变量, 且这个引用类是可变类,所以导致Person类也变成了可变类. */ class Name1 { private String firstName; private String lastName; public Name1(){} public Name1(String firstName,String lastName) { this.firstName = firstNa…
如何在Java中写出Immutable的类? 要写出这样的类,需要遵循以下几个原则: 1)immutable对象的状态在创建之后就不能发生改变,任何对它的改变都应该产生一个新的对象. 2)Immutable类的所有的属性都应该是final的. 3)对象必须被正确的创建,比如:对象引用在对象创建过程中不能泄露(leak). 4)对象应该是final的,以此来限制子类继承父类,以避免子类改变了父类的immutable特性. 5)如果类中包含mutable类对象,那么返回给客户端的时候,返回该对象的一…
深入理解Java中的不可变对象 不可变对象想必大部分朋友都不陌生,大家在平时写代码的过程中100%会使用到不可变对象,比如最常见的String对象.包装器对象等,那么到底为何Java语言要这么设计,真正意图和考虑点是什么?可能一些朋友没有细想过这些问题,今天我们就来聊聊跟不可变对象有关的话题. 以下是本文目录大纲: 一.什么是不可变对象 二.深入理解不可变性 三.如何创建不可变对象 四.不可变对象真的"完全不可改变"吗? 若有不正之处,希望谅解并欢迎批评指正. 请尊重作者劳动成果,转载…
我最喜欢的 Java 面试问题,很棘手,但同时也非常有用.一些面试者也常问这个问题,为什么 String 在 Java 中是 final 的.字符串在 Java 中是不可变的,因为 String 对象缓存在 String 池中.由于缓存的字符串在多个客户之间共享,因此始终存在风险,其中一个客户的操作会影响所有其他客户.例如,如果一段代码将 String "Test" 的值更改为 "TEST",则所有其他客户也将看到该值.由于 String 对象的缓存性能是很重要的一…
以前一直对于java中容器的概念不理解,虽然学习过,但始终没有认真理解过,这几天老师提出了这样一个问题,你怎么理解java中的容器.瞬间就蒙了.于是各种搜资料学习了一下,下面是我学习后整理出来的的一些心得.欢迎各路大神指教 在书写程序时,我们常常需要对大量的对象引用进行管理.为了实现有效的归类管理,我们常常将同类的引用放置在同一个数据容器中. java容器的组成 一.Collection接口:定义了存取一组对象的方法,他的子接口Set和List分别定义了存取方法.Set中的数据对象没有顺序且不可…
为什么 String 在 Java 中是不可变的(终极答案) 我们可以从2个角度去看待这个问题: 1.为什么要设计成不可变2.如何保证不可变? 1.为什么设计不可变? 1.String对象缓存在String池中,由于缓存的字符串在多个客户之间共享,因此始终存在风险,其中一个客户的操作了一个String对象会影响其他客户.例如,如果一段代码将String "Test" 的值更改为"TEST",则所有其他客户也将看到该值.由于String对象的缓存性能是很重要的一方面,…
在JAVA中用json-lib-2.3-jdk15.jar包中提供了JSONObject和JSONArray基类,用于JSON的序列化和反序列化的操作.但是我们更习惯将其进一步封装,达到更好的重用. 封装后的JSON工具类JSONUtils.java代码如下: JSONUtils代码,点击展开 import java.util.ArrayList;import java.util.Collection;import java.util.HashMap;import java.util.Itera…
例如 package com.atguigu.java.fanshe; public class Person { String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) {…