不可变的字符串(String)

一个字符串String对象一旦被配置,其内容就是固定不可变的(immutable)。如下声明:

      String str = "windows";

这个声明会配置一个长度为11的字符串对象,您无法改变它的内容。看到下面的内容,我们别理所当然地认为就是改变一个字符串对象的内容:

      String str = "java";
      str = "javascript";

事实上,在段代码中有两个字符串对象,一个是"java",长度为4,一个是"javascript",长度为10。这两个是不同的字符串对象,您并不是在 "java"字符串后加上"script"字符串,而是令str名称指向新的字符串对象,如下所示:

    原来指向此
    str ----> "java"

    重新指定后

    str-----> "javascript"
    引用新的字符串对象

在Java中,使用 = 将一个字符串对象指定给一个名称,其意义为改变名称的引用对象,原来的字符串对象若没有其它名称来引用它,就会适时地被Java的“垃圾回收”(Garbage collection)机制回收, 如若在程序中使用下面的方式声明,则就是指向同一个字符串对象:

    String str1 = "number";
    String str2 = "number";
    System.out.println(str1 == str2);

代码的执行结果会显示true。在Java中会维护一个String Pool,对于一些可共享的字符串对象,会先在String Pool中查找是否存在字节相同的String内容,如果有就直接传回,而不是直接建立一个新的String对象,以减少内存的耗用。

  注意到了吗?== 运算在Java中被用来比较两个名称是否指向同一对象,所以不可以用==来比较两个字符串的内容是否相同,例如:

    String str1 = new String("cubic");
    String str2 = new String("cubic");
    System.out.println(str1 == str2);

  上面会显示false的结果,因为str1与str2是分别指向不同的字符串对象,如果要比较两个(字符串)对象是否相同,您要使用equals()方法,例如:

    String str1 = new String("cubic");
    String str2 = new String("cubic");
    System.out.println(str1.equals(str2));

  这样子结果才会显示所想要的比较结果:true。

不可变的字符串(String)

时间: 2024-10-05 18:44:02

不可变的字符串(String)的相关文章

Java学习笔记—第九章 字符串String

第九章 字符串String Java中使用String类来创建一个字符串变量,字符串变量是类类型变量,是一个对象.声明字符串的语法格式如下:String s; 创建字符串:通过String类提供的构造方法可创建字符串,有以下几种方式: (1)创建字符串对象时直接赋值,例如: String s1 = "hello"; String s2 = new String("hello"); (2)由一个字符串创建另一个字符串,例如: String s1 = "hel

系统类 字符串String类

java编程语言中的字符串. 在java中,String类是不可变的,对String类的任何改变,都是返回一个新的String类对象. String 对象是 System.Char 对象的有序集合,用于表示字符串.String 对象的值是该有序集合的内容,并且该值是不可变的. String类是不可变(final)的,对String类的任何改变,都是返回一个新的String类对象.这样的话把String类的引用传递给一个方法,该方法对String的任何改变,对原引用指向的对象没有任何影响,这一点和

JavaScript学习-js中的数组/Boolean类/字符串String类

JavaScript学习 [js中的数组] 1.数组的概念:是在内存中连续储存对个有序元素的结构 元素的顺序称为下标,通过下标查找对象元素. 2.数组的声明: ① 字面量声明:var arr1 = []; js中,同一数组,可以储存多种不同的数据类型: 例如: var arr1 = [1,"2",true,{"name":"hahhah"},[1,2]] ② new关键字声明: var arr2 = new Arry(参数) >>&g

字符串String的创建与维护

字符串String 2.1          String类 String是不可变类, 即一旦一个String对象被创建, 包含在这个对象中的字符序列是不可改变的, 直至该对象被销毁. String类是final类,不能有子类. 2.1.1    创建字符串对象 1.  使用new关键字 String s1 = new String(“ab”);  // 2.  使用字符串常量直接赋值 String s2 = “abc”; 3.  使用”+”运算符进行字符串连接 String s3 = “abc

javascript类型系统——字符串String类型

× 目录 [1]定义 [2]引号 [3]反斜线[4]特点[5]转字符串[6]长度属性[7]实例方法 前面的话 javascript没有表示单个字符的字符型,只有字符串String类型,字符型相当于仅包含一个字符的字符串 字符串String是javascript基本数据类型,同时javascript也支持String对象,它是一个原始值的包装对象.在需要时,javascript会自动在原始形式和对象形式之间转换.本文将介绍字符串String原始类型及String包装对象 定义 字符串String类

Java内存管理-探索Java中字符串String(十二)

做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 一.初识String类 首先JDK API的介绍: public final class String extends Object implements Serializable, Comparable<String>, CharSequence String类代表字符串.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. 字符串是常量:它们的值在创建之后不能更改.字符

C++中字符数组和字符串string

字符数组 C++中字符数组用char str[]可以用来表示一个字符串. (1)   数组的大小和字符串的长度. 数组的大小一定要大于字符串的长度,因为系统会自动补上一个'\0'作为字符串的结束标志.当然对于未初始化的也补'\0'. #include <iostream> #include <string> using namespace std; int main() { char str[11] = "I am happy"; // 系统会自动补上'\0'空

istringstream字符串流,实现类似字符串截取的功能,字符串流中的put,str()将流转换成为字符串string

 1. istringstream字符串流 #include <iostream> #include <sstream> #include <string> using namespace std; struct MyStruct { string str1, str2, str3; double db; int num; char ch; }; void main() { string  mystring("china  google microsoft

c/c++日期时间处理与字符串string转换

在c/c++实际问题的编程中,我们经常会用到日期与时间的格式,在算法运行中,通常将时间转化为int来进行计算,而处理输入输出的时候,日期时间的格式却是五花八门,以各种标点空格相连或者不加标点. 首先,在c中,是有一个标准的日期时间结构体的,在标准库wchar.h内,我们可以看到结构体tm的声明如下: 1 #ifndef _TM_DEFINED 2 struct tm { 3 int tm_sec; /* seconds after the minute - [0,59] */ 4 int tm_