由字符所组成的一串文字符号被称为字符串。举个例子,如“Hello”这个字符串就是由“H、e、l、l、o”这五个字符组成的,在某些程序语言中,字符串是以字符数组的形式存在的,Java 中的字符串也一样,如图5.1 所示。
图5.1 字符串的本质是字符数组
当Java 编译器遇到带双引号的字符串时,即生成String 类的一个实例。因此,String类对象初始化的最简单方式如下:
当然,也可以按传统的方式来初始化String 类。例如:
建立String 类对象的另一种方法是使用连接操作符“+”把两个字符串连接起来,如下所示:
字符串在Java 中以String 类的一个实例存在,所以每个字符串对象本身会拥有几个可操作的方法。常用的方法见表5.4。
表5.4 String 对象的常用方法
下面演示以上的几个字符串操作方法的使用,如例5.4 所示。
例5.4:字符串常用方法的使用。
以上程序运行结果如下:
如果要将输入的字符串转换为整数、浮点数等数据类型,可以使用各类所提供的静态(static)转换方法,见表5.5。
表5.5 将字符串转换为数值类型的方法
如果指定的字符串无法转换为指定的数据类型数值,则会发生NumberFormatException异常,如下所示:
字符串的本质是由字符所组成的,使用String 类声明字符串后,该字符串会具有数值索引的性质。下面列出了几个与使用索引取得字符的相关方法,见表5.6。
表5.6 String 类的常用方法
例5.5 演示以上方法的使用。
例5.5:取得字符串字符的常用方法。(www.daowen.com)
以上程序运行结果如下:
substring(int begin,int end)中的第一个参数指向字符串的最前面之前的那个字符,第二个参数指向子串的最后一个字符之后的那个字符。
在Java 中使用字符串有一个非常重要的一个规则:一个字符串对象一旦被配置,它的内容就固定不变了。例如下面这个声明:
这个声明会配置一个长度为9、内容为“chongqing”的字符串对象,你无法改变这个字符串对象的内容。不要以为下面的语句就是改变一个字符串对象的内容:
事实上在这个程序片段中会有两个字符串对象,一个是“love”字符串对象,长度为4;一个是“lovemysec”字符串对象,长度为9,这两个是不同的字符串对象。你并不是在“love”字符串后加上“mysec”字符串,而是让str 变量引用“lovemysec”字符串对象,如图5.2 所示。
图5.2 使用“=”重新指定字符串
在Java 中,使用“=”将一个字符串对象指定给一个引用名称,其意义为改变该名称所引用的对象,原来被引用的字符串对象若没有其他名称来引用它,就会在适当的时候被Java 的“垃圾回收”(Garbage Collection)机制回收。在Java 中,程序设计人员通常不用关心没有使用的对象的资源回收问题,Java 虚拟机会检查对象是否不再被引用,没有被任何对象引用的对象将会被回收。
在Java 执行时会维护一个String 池(Pool)。对于一些可以共享的字符串对象,会现在String 池中查找是否存在相同的String 内容(字符串相同),如果有就直接返回,而不是直接创建一个新的String 对象,以减少内存的耗用。如果在程序中使用下面的方式来声明,则实际上指向同一字符串对象。
当直接在程序中使用双引号("")来包括一个字符串时,该字符串就会在String 池中,上面的程序片段中的“mytosec”就是这样的情况。“mytosec”在程序中会有一个实例,而a 与b 同时引用自“mytosec”,如图5.3 所示。
图5.3 字符串引用名称a、b 引用相同的对象
在Java 中如果“==”被使用于两个引用名称时,它是用于比较两个引用名称是否引用自同一个对象,所以当“a==b”比较时,程序执行的结果会输出“true”。
如果使用如下方式定义字符串,将不指向同一对象。例如:
每个new 语句都会新建一个String 对象,a 和b 分别引用自不同的实例,因此a==b的比较结果是false。当需要比较两个字符串对象的字符值是否相同时,要使用equals()方法。例如:
以上结果会输出true。
因为String 的“不可变”产生了很多临时变量,这也就是为什么建议使用StringBuffer 的原因了,因为StringBuffer 是可改变的。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。