在Java中,一个字符串常量被创建后是不可变的,String对象也是不可变的。虽然表面上可以给String类定义的变量进行赋值运算,但其实是创建了一个新的String对象并指向定义的字符串常量,然后将这个新对象的内存地址引用赋值给了该变量。原来创建的String对象没有改变,它和新创建的对象虽然内容相同,但是在系统中的内存存储空间并不是同一个,这两个对象在面向对象编程中会被认为是两个不同的对象。
图6.1.4 创建字符串底层逻辑
Java中提供了大量的字符串初始化方法,所有的基本类型数值都可以被转换为字符串。
1.直接通过字符串常量引用赋值
前面提到,创建一个字符串时,首先内存会先创建一个字符串,然后将这个字符串赋值给变量。可以直接使用“=”将字符串常量赋值给String字符串变量。
动手写6.1.4
上面示例中,address1和address2的内容都是“www.01kuaixue.com”,使用“==”关系运算符进行判断时发现,这两个变量并不相同,这是因为“==”针对对象判断的是内存地址是否相同,而address1和address2虽然内容相同,但是系统给它们分配了两个不同的内存存储地址。动手写6.1.4的运行结果为:
图6.1.5 引用赋值初始化字符串变量
2.构造方法初始化
构造方法是面向对象编程语言中特有的方法,用来初始化指定类的对象(第9章将会详细讲解构造方法)。String类中提供了十五种构造方法来初始化一个字符串变量,其中包括使用关键字new创建String对象。
动手写6.1.5
上面示例中,调用了String中构造方法的String(String str)方法创建了一个字符串变量,同时将整型数值和布尔数值通过valueOf()方法转换为字符串格式,运行结果为:
图6.1.6 构造方法初始化字符串
使用构造方法初始化字符串对象和直接引用赋值类似,但是它们背后的逻辑并不同。使用构造方法new String(“零壹快学”),实际上创建了两个String对象,一个是“零壹快学”字符串常量,存储在常量空间,另一个是使用new关键字为对象申请空间。这样其实在内存使用上存在一定的浪费,所以一般情况下都会用简单的直接引用赋值来初始化字符串对象。
3.基本数据类型转换方法
String类中提供了所有基本数据类型的valueOf()方法,可以将基本数据类型转换为字符串,并且这些方法都是静态的,直接通过“String.valueOf”方式调用。
动手写6.1.6
上面示例代码中,展示了字符串和double类型的转换。值得注意的是String.valueOf(str)一行,str为String对象。String类中也提供了将对象转换为字符串的方法,这个方法会直接返回该对象定义类中的toString()方法(若入参为null,则直接返回null),而toString()方法就是将字符串内容直接返回,所以上面代码会直接返回22.12。但是并不是所有的valueOf(Object object)应用于对象入参时都会返回所需的内容,因此需要注意定义的类中toString()方法的内容。动手写6.1.6的运行结果为:
图6.1.7 基本数据类型转换成字符串
Java中不可以直接将(String)置于待转换的变量前并将其强制转换为字符串,因为String是对象类,并不是基本数据类型。(www.xing528.com)
动手写6.1.7
其运行结果如下:
图6.1.8 强制将基本数据类型转换为字符串报错
4.字符数组初始化
String类中提供了方法,可以使用一个字符数组初始化一个字符串。
动手写6.1.8
其运行结果为:
图6.1.9 字符数组初始化字符串
String类中也提供了使用字符数组中的一部分内容初始化一个字符串的方法。
动手写6.1.9
上面示例中,先创建了一个字符数组charArray,然后从该字符数组索引第2个位置(数组索引是从0开始的,即“零”为索引0,“壹”为索引1)开始,共提取1个元素创建一个新的字符串。动手写6.1.9的运行结果为:
图6.1.10 使用字符数组的一部分初始化字符串
我们也可以使用valueOf()方法来将字符数组转换为字符串,如下面的示例。
动手写6.1.10
上面示例中,valueOf()方法利用了面向对象编程中的方法重载概念,即两个方法虽然名字相同,但是只要入参不同即可认为是两个方法,此示例中valueOf()入参为一个字符数组。valueOf()方法也支持提取字符数组中的部分内容创建字符串。
动手写6.1.11
String类也提供了copyValueOf()方法,和valueOf(char[] data)、value(char[] data, int offset, int count)方法内容一样,只是名称不同,这里不再做介绍。如果要对字符串进行修改,Java中提供了StringBuffer类和StringBuilder类,后面6.3节将会详细介绍这两个类的使用。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。