Java中String类型的不可变性和驻留池
一 基本概念
可变类和不可变类(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类型的不可变性和驻留池的更多相关文章
- Java中String对象的不可变性
首先看一个程序 package reverse; public class Reverse { public static void main(String[] args) { String c1=n ...
- Java中String类型细节
Java中String类型细节 一 . String两种初始化方式 1 . String str1= “abc”;//String类特有的创建字符对象的方式,更高效 在字符串缓冲区中检测”abc”是否 ...
- Java中String类型详解
这篇博客是我一直想总结的,这两天一直比较忙,先上传下照片吧,过后有时间再弄成正常的. 本文主要是对Java中String类型的总结,包括其在JVM中是怎么存储的...
- 【转载】 Java中String类型的两种创建方式
本文转载自 https://www.cnblogs.com/fguozhu/articles/2661055.html Java中String是一个特殊的包装类数据有两种创建形式: String s ...
- 关于JAVA中String类型的最大长度
前些天看到一道面试题,题目很容易理解:String的长度限制是多少? 针对这个题目,浏览了网友的回答,大概得到了3个层次的答案. 最浅的层次: 近似计算机内存大小的长度.这是作为一个程序员最浅显的回答 ...
- Java中String类型的数据比较
在Java中如果想比较两个字符串是否相等,可以使用string1==string2 或string1.equal(string2)来比较. 但是,第一种方法过于局限.例如, String string ...
- java中String类型的相关知识
String类方法整理说明: ·Length()用来求字符串的长度,返回值为字符串的长度: ·charAt()取该字符串某个位置的字符,从0开始,为char类型: ·getChars()将这个字符串中 ...
- java中String类型
string对象常用方法 string对象比较方法: string类获取包含子串的方法: 字符串和数字的转换: String类 String对象是不可改变的,字符串一旦创建,内容不能再改变. 构造字符 ...
- Java中String类型的部分用法
1.如何将字符串转换为整型数值? int i = Integer.parseInt("20"); 2.如何用“==”还是equals比较两个字符串? “==”是用来比较俩引用是不是 ...
随机推荐
- GCC 嵌入汇编代码
The format of basic inline assembly is very much straight forward. Its basic form is 基本汇编嵌入格式如下: asm ...
- iOS H5 容器的一些探究(一):UIWebView 和 WKWebView 的比较和选择
来源:景铭巴巴 链接:http://www.jianshu.com/p/84a6b1ac974a 一.Native开发中为什么需要H5容器 Native开发原生应用是手机操作系统厂商(目前主要是苹果的 ...
- C#实现Dll(OCX)控件自动注册的两种方法
尽管MS为我们提供了丰富的.net framework库,我们的程序C#开发带来了极大的便利,但是有时候,一些特定功能的控件库还是需要由第三方提供或是自己编写.当需要用到Dll引用的时候,我们通常会通 ...
- Java SE ---控制流程:break与continue语句
在java中,可以使用break和continue语句控制循环. 1. break语句:用于终止循环,就是跳出当前循环,执行循环后面的代码. . 2. continue语句:用于跳出当 ...
- 【阿里云产品公测】ACE、BAE及SAE云引擎对比评测
作者:阿里云用户bailimei 先前我已发布一篇关于ACE的评测,在跟朋友聊天的时候我们讨论了目前市面上的三款云引擎产品,这三家的云引擎我都有在用,今天有时间顺便写篇关于阿里云ACE.百度BAE和新 ...
- Swift 2.0学习
前几天在苹果官方文档学习iOS9 3D Touch的时候,发现苹果关于3D Touch的smaple code,竟然是用Swift语法写的,并且根本没有OC版本的. 看来学习Swift语法是势在必行了 ...
- 重构6-Push Down Field(字段下移)
与上移字段相反的重构是下移字段.同样,这也是一个无需多言的简单重构. public abstract class Task { protected String _resolution; } publ ...
- Java POI操作Excle工具类
用到了jxl.jar和poi.jar 一些基本的操作Excel的操作方法: import java.io.File; import java.io.FileInputStream; import ja ...
- noi 97 积木游戏
思路:黑书的例题 #include<map> #include<set> #include<cmath> #include<queue> #includ ...
- Android achartengine统计图
最近在安卓2.2上写个实时的监控程序,要用到统计图.从网上搜了下 Java4Less (http://java4less.com/charts/chart.php?info=android) ...