一 基本概念

可变类和不可变类(Mutable and Immutable Objects)的初步定义:

可变类:当获得这个类的一个实例引用时,可以改变这个实例的内容。

不可变类:不可变类的实例一但创建,其内在成员变量的值就不能被修改。其中String类就是不可变类的经典应用。

二 例子

package cn.xy.test;

public class StringTest
{

/**
  * a的值在编译时就被确定下来,故其值"xy"被放入String的驻留池(驻留池在堆中)并被a指向。
  * b的值在编译时也被确定,那么b的值在String的驻留池中找是否有等于"xy"的值,有的话也被b指向。
  * 故两个对象地址一致
  * @return true
  */
 public static Boolean testString1()
 {
  String a = "xy";
  String b = "xy";
  return a == b;
 }
 
 /**
  * b的值在是两个常量相加,编译时也被确定。
  * @return true
  */
 public static Boolean testString2()
 {
  String a = "xyy";
  String b = "xy" + "y";
  return a == b;
 }

/**
  * b的值为一个变量和一个常量相加,无法编译时被确定,而是会在堆里新生成一个值为"abc"的对象
  * @return false
  */
 public static Boolean testString3()
 {
  String a = "xyy";
  String b = "xy";
  b = b + "y";
  return a == b;
 }

/**
  * b的值都无法编译时被确定,而是会在堆里分别新生成一个对象叫"xyy"。
  * @return false
  */
 public static Boolean testString4()
 {
  String a = "xyy";
  String b = "xy".concat("y");
  return a == b;
 }

/**
  * new String()创建的字符串不是常量,不能在编译期就确定,所以new String() 创建的字符串不放入常量池中,它们有自己的地址空间。 
  * a,b的值都无法编译时被确定,会在堆里分别新生成一个值为"xy"的对象。
  * @return fasle
  */
 public static Boolean testString5()
 {
  String a = new String("xy");
  String b = new String("xy");
  return a == b;
 }

/**
  * intern()把驻留池中"xy"的引用赋给b。
  * @return true
  */
 public static Boolean testString6()
 {
  String a = "xy";
  String b = new String("xy");
  b = b.intern();
  return a == b.intern();
 }

/**
  * char的toString方法返回的是一个char对象的字符串,而不是我们想象的"xy"
  * @return false
  */
 public static Boolean testString7()
 {
  String b = "xy";
  char[] a = new char[]{'x','y'};
  return a.toString().equals(b);
 }

/**
  * char是一种新的类型,不存在驻留池的概念。
  * @return fasle
  */
 public static Boolean testString8()
 {
  String b = "xy";
  char[] a = new char[]{'x','y'};
  return a.toString() == b;
 }

/**
  * String不可变性的体现
  */
 String str = "xy";

public String chage(String str)
 {
  str = "xyy";
  return str;
 }

/**
  * 一般引用类型的可变性(传值的时候把地址传过去,相当于把仓库的要是交给方法,方法拿到钥匙去移动仓库里的东西)
  */
 Person p = new Person("xy");

public String changePerson(Person p)
 {
  p.setName("xyy");
  return p.toString();
 }

public static void main(String[] args)
 {
  print(testString1()); // true
  print(testString2()); // true
  print(testString3()); // fasle
  print(testString4()); // false
  print(testString5()); // false
  print(testString6()); // true

print(testString7()); // false

print(testString8()); // false

StringTest t = new StringTest();
  print(t.str); // xy
  print(t.chage(t.str)); // xxy
  print(t.str); // xy

print(t.p.toString()); //xy
  print(t.changePerson(t.p)); //xyy
  print(t.p.toString()); //xyy
 }

public static void print(Object o)
 {
  System.out.println(o);
 }

}

Java中String类型的不可变性和驻留池的更多相关文章

  1. Java中String对象的不可变性

    首先看一个程序 package reverse; public class Reverse { public static void main(String[] args) { String c1=n ...

  2. Java中String类型细节

    Java中String类型细节 一 . String两种初始化方式 1 . String str1= “abc”;//String类特有的创建字符对象的方式,更高效 在字符串缓冲区中检测”abc”是否 ...

  3. Java中String类型详解

    这篇博客是我一直想总结的,这两天一直比较忙,先上传下照片吧,过后有时间再弄成正常的. 本文主要是对Java中String类型的总结,包括其在JVM中是怎么存储的...

  4. 【转载】 Java中String类型的两种创建方式

    本文转载自 https://www.cnblogs.com/fguozhu/articles/2661055.html Java中String是一个特殊的包装类数据有两种创建形式: String s ...

  5. 关于JAVA中String类型的最大长度

    前些天看到一道面试题,题目很容易理解:String的长度限制是多少? 针对这个题目,浏览了网友的回答,大概得到了3个层次的答案. 最浅的层次: 近似计算机内存大小的长度.这是作为一个程序员最浅显的回答 ...

  6. Java中String类型的数据比较

    在Java中如果想比较两个字符串是否相等,可以使用string1==string2 或string1.equal(string2)来比较. 但是,第一种方法过于局限.例如, String string ...

  7. java中String类型的相关知识

    String类方法整理说明: ·Length()用来求字符串的长度,返回值为字符串的长度: ·charAt()取该字符串某个位置的字符,从0开始,为char类型: ·getChars()将这个字符串中 ...

  8. java中String类型

    string对象常用方法 string对象比较方法: string类获取包含子串的方法: 字符串和数字的转换: String类 String对象是不可改变的,字符串一旦创建,内容不能再改变. 构造字符 ...

  9. Java中String类型的部分用法

    1.如何将字符串转换为整型数值? int i = Integer.parseInt("20"); 2.如何用“==”还是equals比较两个字符串? “==”是用来比较俩引用是不是 ...

随机推荐

  1. WPF 之 线程使用

    但凡涉及到图形界面,往往的设计都是不支持或者不推荐使用多个线程操作界面内容.而且通常会有一个专门的线程调度器来处理任务线程和界面线程的问题. 下面提供两个方案: 1.使用Dispatcher.Begi ...

  2. [设计模式] .NET设计模式笔记 - 了解设计模式

    今天在TerryLee的cnblog(http://terrylee.cnblogs.com)里看到了与设计模式相关的整套文章,初学设计模式看完每篇文章后做些笔记和摘抄. ●什么是设计模式,什么是架构 ...

  3. SQL Server表的数据量大小查询

    今天想在服务器上还原一个DB,发现磁盘空间不够,查看发现,其中一个DB竟然有56G了.因此想收缩一下这个DB,发现大小没多大变化.然后在网上找了找SQL脚本,看能不能查看下哪个表的数据量那么大. 网上 ...

  4. Linux常用命令之seq

    标题:seq命令的使用 作用:seq命令用于以指定增量从首数开始打印数字到尾数,即产生从某个数到另外一个数之间的所有整数,并且可以对整数的格式.宽度.分割符号进行控制 语法: [1] seq [选项] ...

  5. Spring Data Jpa 详解 (配置篇)

    前言: JPA全称Java Persistence API,即Java持久化API,它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据,结合其他ORM的使用,能达到简化开发 ...

  6. ionic中input框禁止输入问题

    其实这个问题在之后沥青思路之后觉得还是挺好实现的,没有思路的时候真是找不到头绪~ 功能的描述为:当输入框中没有内容时,允许用户编辑:当其中有内容时不允许用户编辑,只有当用户点击编辑按钮后,才可允许编辑 ...

  7. 怒刷DP之 HDU 1257

    最少拦截系统 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Statu ...

  8. 转:android surface简单使用Demo

    转: http://blog.csdn.net/listening_music/article/details/6860786 通过之前介绍的如何自定义View, 我们知道使用它可以做一些简单的动画效 ...

  9. 十大Intellij IDEA快捷键(转)(2015年06月15日)

    注:本文转自:http://blog.csdn.net/dc_726/article/details/42784275 Intellij IDEA中有很多快捷键让人爱不释手,stackoverflow ...

  10. jquery简单的图片切换效果,支持pc端、移动端的banner图片切换开发

    详细内容请点击 无意中看见了两年前写的一个图片切换,那会儿刚刚学习网页制作,可以说是我的第一个处女座的jquery图片切换效果.无聊之余对它的宽度稍稍做了一下修改,变成了支持pc端.手机端全屏的ban ...