Java中的不可变类的概念及实现思路分析
2016-11-16 20:25
916 查看
一道面试题:什么是不可变类,请试着设计一个不可变类。
不可变类,可以理解为,只允许读,不允许修改的类。类的对象一旦创建,就不能再进行修改了。Java语言之所以设计有很多的不可变类,
主要是不可变类具有下面的优点:使用简单、线程安全、节省内存。但是缺点也很明显,不可变类的对象会因为值的不同,而产生新的对象,
比如我们在进行字符串的修改操作时,会生成多个String对象。import java.util.Date;
/**
* @description java中的不可变类学习---如何设计一个不可变类
* ImmutableClass_0,错误的方法演示
*/
public class ImmutableClass_0 {
public static void main(String[] args) {
// -------------- String类 --------------
// String类的状态是不可改变的,因此str的引用不变,一直都是指向"str的初始值为00000"
// 即使执行了这段代码:str = "str的初始值为11111";str对象仍然不变。
String str = "str的初始值为00000";
System.out.println("str.hashCode() : " + str.hashCode());
InnerClass_str innerClass_str = new InnerClass_str(str);
innerClass_str.printStr();
// 改变str的值
str = "str的初始值为11111";
System.out.println("str.hashCode() : " + str.hashCode());
innerClass_str.printStr();
// -------------- Date类 --------------
// Date类的状态是可以改变的,当改变date的状态时,当前内存中有2个date对象。
// 也就是说现在date对象有了2个副本。
// 当被引用对象date的状态发生改变时,会导致innerClass_date对象的改变
Date date = new Date();
System.out.println("date.hashCode() : " + date.hashCode());
InnerClass_date innerClass_date = new InnerClass_date(date);
innerClass_date.printStr();
// 改变date的值
date.setMonth(8);
System.out.println("date.hashCode() : " + date.hashCode());
innerClass_date.printStr();
}
}
final class InnerClass_date{
private Date date;
//构造方法
public InnerClass_date(Date date){
this.date = date;
}
public void printStr(){
System.out.println("date : " + date);
}
}
final class InnerClass_str{
private String str;
//构造方法
public InnerClass_str(String str){
this.str = str;
}
public void printStr(){
System.out.println("str : " + str);
}
}
控制台输出:
str.hashCode() : -153435823
str : str的初始值为00000
str.hashCode() : -152481518
str : str的初始值为00000
date.hashCode() : 1793288403
date : Wed Nov 16 10:07:18 CST 2016
date.hashCode() : 817855708
date : Fri Sep 16 10:07:18 CST 2016
控制台输出:
date.hashCode() : 1793318742
date : Wed Nov 16 10:07:48 CST 2016
date.hashCode() : 817886041
date : Wed Nov 16 10:07:48 CST 2016
不可变类,可以理解为,只允许读,不允许修改的类。类的对象一旦创建,就不能再进行修改了。Java语言之所以设计有很多的不可变类,
主要是不可变类具有下面的优点:使用简单、线程安全、节省内存。但是缺点也很明显,不可变类的对象会因为值的不同,而产生新的对象,
比如我们在进行字符串的修改操作时,会生成多个String对象。import java.util.Date;
/**
* @description java中的不可变类学习---如何设计一个不可变类
* ImmutableClass_0,错误的方法演示
*/
public class ImmutableClass_0 {
public static void main(String[] args) {
// -------------- String类 --------------
// String类的状态是不可改变的,因此str的引用不变,一直都是指向"str的初始值为00000"
// 即使执行了这段代码:str = "str的初始值为11111";str对象仍然不变。
String str = "str的初始值为00000";
System.out.println("str.hashCode() : " + str.hashCode());
InnerClass_str innerClass_str = new InnerClass_str(str);
innerClass_str.printStr();
// 改变str的值
str = "str的初始值为11111";
System.out.println("str.hashCode() : " + str.hashCode());
innerClass_str.printStr();
// -------------- Date类 --------------
// Date类的状态是可以改变的,当改变date的状态时,当前内存中有2个date对象。
// 也就是说现在date对象有了2个副本。
// 当被引用对象date的状态发生改变时,会导致innerClass_date对象的改变
Date date = new Date();
System.out.println("date.hashCode() : " + date.hashCode());
InnerClass_date innerClass_date = new InnerClass_date(date);
innerClass_date.printStr();
// 改变date的值
date.setMonth(8);
System.out.println("date.hashCode() : " + date.hashCode());
innerClass_date.printStr();
}
}
final class InnerClass_date{
private Date date;
//构造方法
public InnerClass_date(Date date){
this.date = date;
}
public void printStr(){
System.out.println("date : " + date);
}
}
final class InnerClass_str{
private String str;
//构造方法
public InnerClass_str(String str){
this.str = str;
}
public void printStr(){
System.out.println("str : " + str);
}
}
控制台输出:
str.hashCode() : -153435823
str : str的初始值为00000
str.hashCode() : -152481518
str : str的初始值为00000
date.hashCode() : 1793288403
date : Wed Nov 16 10:07:18 CST 2016
date.hashCode() : 817855708
date : Fri Sep 16 10:07:18 CST 2016
import java.util.Date; /** * @description java中的不可变类学习---如何设计一个不可变类 * ImmutableClass_1,正确的方法演示 */ public class ImmutableClass_1 { public static void main(String[] args) { // -------------- Date类 -------------- // Date类的状态是可以改变的,当改变date的状态时,当前内存中有2个date对象。 // 也就是说现在date对象有了2个副本。 // 当被引用对象date的状态发生改变时,会导致innerClass_date对象的改变 Date date = new Date(); System.out.println("date.hashCode() : " + date.hashCode()); InnerClass_date2 innerClass_date = new InnerClass_date2(date); innerClass_date.printStr(); // 改变date的值 date.setMonth(8); System.out.println("date.hashCode() : " + date.hashCode()); innerClass_date.printStr(); } } final class InnerClass_date2{ private Date date; //构造方法 public InnerClass_date2(Date date){ // 解除了引用关系,通过克隆,生成了一个新的对象 this.date = (Date) date.clone(); } public void printStr(){ System.out.println("date : " + date); } }
控制台输出:
date.hashCode() : 1793318742
date : Wed Nov 16 10:07:48 CST 2016
date.hashCode() : 817886041
date : Wed Nov 16 10:07:48 CST 2016
相关文章推荐
- 剑指Offer习题集锦——Java实现及思路分析
- [置顶] 跳一跳辅助工具的原理分析,和Java实现。(其实没那么复杂)
- Java继承的概念与实现
- JAVA BIO的实现及原理分析
- Java JDK 动态代理(AOP)使用及实现原理分析
- [Java基础要义] HashMap的设计原理和实现分析
- java 堆排序分析与实现
- 浅谈实现滑动验证码,Java核心代码以及原理分析
- 【死磕Java并发】-----深入分析synchronized的实现原理
- 死磕Java并发:深入分析volatile的实现原理
- 深入分析Java方法反射的实现原理
- Java中HashMap底层实现原理(JDK1.8)源码分析
- 杰神之Java多线程基础概念和实现多线程
- JAVA实现大华摄像头WEB方式实时显示视频,H5界面展示方式思路。
- 常见算法题分析---java实现(一)
- java动态代理实现与原理详细分析
- Java中集合框架,Collection接口、Set接口、List接口、Map接口,已经常用的它们的实现类,简单的JDK源码分析底层实现
- 几种排序算法分析及Java实现
- Java JDK 动态代理(AOP)使用及实现原理分析
- Java 8-stream实现原理分析(一)