什么是不可变对象?
众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。不能改变状态的意思是,不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变。

区分对象和对象的引用
对于Java初学者, 对于String是不可变对象总是存有疑惑。看下面代码:
String s = "ABCabc";
System.out.println("s = " + s);

s = "123456";
System.out.println("s = " + s);

打印结果为:
s = ABCabc
s = 123456

首先创建一个String对象s,然后让s的值为“ABCabc”, 然后又让s的值为“123456”。 从打印结果可以看出,s的值确实改变了。那么怎么还说String对象是不可变的呢? 其实这里存在一个误区: s只是一个String对象的引用,并不是对象本身。对象在内存中是一块内存区,成员变量越多,这块内存区占的空间越大。引用只是一个4字节的数据,里面存放了它所指向的对象的地址,通过这个地址可以访问对象。

也就是说,s只是一个引用,它指向了一个具体的对象,当s=“123456”; 这句代码执行过之后,又创建了一个新的对象“123456”, 而引用s重新指向了这个心的对象,原来的对象“ABCabc”还在内存中存在,并没有改变。

为什么String对象是不可变的?
要理解String的不可变性,首先看一下String类中都有哪些成员变量。 在JDK1.6中,String的成员变量有以下几个:
public final class String
implements java.io.Serializable, Comparable, CharSequence
{
/** The value is used for character storage. */
private final char value[];

/** The offset is the first index of the storage that is used. */
private final int offset;

/** The count is the number of characters in the String. */
private final int count;

/** Cache the hash code for the string */
private int hash; // Default to 0
在JDK1.7中,String类做了一些改动,主要是改变了substring方法执行时的行为,这和本文的主题不相关。JDK1.7中String类的主要成员变量就剩下了两个:
public final class String
implements java.io.Serializable, Comparable, CharSequence {
/** The value is used for character storage. */
private final char value[];

/** Cache the hash code for the string */
private int hash; // Default to 0

最新文章

  1. javascript工厂模式和构造函数模式创建对象
  2. SpringMVC的执行流程(二)
  3. A:手把手教Wordpress仿站(基础)
  4. 使用Asp.net WebAPI 快速构建后台数据接口
  5. 内置函数----整理、例题 、xmin
  6. 一步一步搭建客服系统 (4) 客户列表 - JS($.ajax)调用WCF 遇到的各种坑
  7. OC:通讯录实战
  8. sqlchemy - day3
  9. Unity NGUI实现按钮点击播放Aniamtion
  10. GDI相关函数
  11. SQL调优日志--内存问题
  12. 【第一篇:C++与opencv】图片的读取和显示
  13. 【转载】Recycle机制
  14. 201521123092《java程序设计》第八周学习总结
  15. TCP/IP(五)传输层(TCP的三次握手和四次挥手)
  16. c#中字节数组byte[]、图片image、流stream,字符串string、内存流MemoryStream、文件file,之间的转换
  17. HDU [P3605] Escape
  18. 页面显示LCD液晶字体或者其他特殊字体
  19. Git自动化合并多个Commit
  20. linux系统运行状态检查

热门文章

  1. Django简介 --Python Web
  2. Webpack配置开发环境总结
  3. yii2中 选择布局的方式,可以设置不使用布局
  4. Python基础 第5章 条件、循环及其他语句(2)
  5. Python 【类与对象】
  6. js — 数组Array
  7. WPF入门(4)——资源
  8. poj 2406 求最短重复字串
  9. (六)授权(下):自定义permission
  10. java8新特性的介绍