String类
【代码4.9】比较两个字符串的内容是否相同
【代码4.10】分别用String类的equals()方法和“==”来比较字符串
代码4.10的运行结果如下:
语法说明:
(1)字符串常量必须写在双引号中,双引号中的字符个数是不限制的,而字符常量必须写在单引号中,单引号中的字符个数只能是1个。
(2)String类型的变量定义方法一如下:
内存分配见图1.4.6。
图1.4.6 String类对象的内存分配1
写在双引号中的常量字符串存放在内存常量池中,同一个字符串只存储一个拷贝,不会重复存储。s1和s2存放的是同一个“hello”的首地址,s1==s2为真,“==”比较的是字符串的首地址;s1.equal(s2)为真,equals()方法比较的是两个字符串的内容,equals()方法是在String类中定义的。
(3)String类型的变量定义方法二如下:
内存分配见图1.4.7。
图1.4.7 String类对象的内存分配2
每次用new创建一个新对象实际上是开辟一个新的内存空间,字符串对象名指代的是字符串对象的首地址。s3==s4为假,因为s3和s4中存放的首地址是不同的;s3.equals(s4)为真,因为s3和s4中存放的字符串内容是相同的。
(4)字符串的名字(如s1、s2、s3、s4)本质上指代的是字符串的首地址,“==”比较的是字符串的首地址,equals()方法比较的是字符串的内容。
(5)String类的对象一旦被重新赋值,就是一个新的字符串对象,原来的字符串对象将作为“垃圾”被系统回收,见图1.4.8。如果字符串对象经常改变的话,用String类就不是很恰当,因为每个字符串对象都是重新创建的一个新的对象,这样会多次产生“垃圾”,影响程序性能。当字符串经常改变时,用StringBuffer类或者StringBuilder类比较合适。
例如,对于如下两行语句,内存分配变化见图1.4.8。
图1.4.8 String类对象的内存分配3
【代码4.11】求一个字符串在另一个字符串中出现的次数
表1.4.2列出String类的常用方法(如表1.4.2所示),请自行在编程中学习。
表1.4.2 String类的常用方法和描述
续表