小瓜牛漫谈 — String

String 类在 Java 中代表字符串。Java 程序中的所有字符串字面值(如 “abc” )都作为此类的实例实现。

main(String[] args) {23String str1 = “abc”;4String str2 = new String(“cde”);5 System.out.println(str1);6 System.out.println(str2);7 }

在上面代码中, 第 4 行实际上创建了两个 String 对象, 一个是 “cde” 本身, 另外一个则是由 new 关键字为对象申请开辟的内存空间。

[ 可结合文章最下面给出的第 10 条来理解 ]

通常, 使用 String(String original) 构造器来创建 String 对象要比直接使用字符串字面值的开销更加的大。

String 字符串是常量, 它们的值在创建之后不能够被更改:

1 package net.yeah.fancydeepin.string; Application { main(String[] args) { 6 7String str = “abc”; 8str += “cde”; 9 System.out.println(str);10 }11 }

当程序运行时, JVM 内存中的分配看起来应该像:

从上面的图来看, str 最初引用的是 “abc” 对象, 最终打印输出的结果是 abccde, 这并不是说 str 所引用的对象的内容发生了变化,

而是 str 在执行的过程中重新引用了另外的一个 String 对象 “abccde”。

可以使用 java 自带的反编译工具 javap来查看编译后的字节码文件信息:javap -c Appliaction

从上面的图来看:

第 0 行, 将常量池中的 “abc” 对象压栈;

第 8 行, 调 String.valueOf(Object obj) [ 实际上是将 str 转成了 String 对象 ];

第 3、11 行, 是在创建 StringBuilder 对象, 通过 StringBuilder(String str) 构造器 [ 参数是第 8 行的 String 对象 ];

第 14 行, 将常量池中的 “cde” 对象压栈;

第 16 行, 调 StringBuilder 的 append 方法 [ 将 “cde” 拼在 “abc” 的后面 ];

第 19 行, 调 StringBuilder 的 toString() 方法。

使用 jad 工具, 可以更加容易的去读懂编译后的字节码文件内容: jad -o -a -s .java Application.class

结合上面的图可以看出, 在 java 中, 通过使用 “+” 符号来串联字符串的时候, 实际上底层会转成通过 StringBuilder 实例的 append()方法来实现。

[关于对 String 类使用 “+” 符号来串联字符串, 在文章最下面的第 10 条继续来补充。]

String 类常用方法:

1> startsWith(String prefix)、endsWith(String suffix)

startsWith(prefix) 测试字符串是否是以指定的前缀 prefix 开始, endsWith(suffix) 测试字符串是否是以指定的后缀 suffix 结束:

main(String[] args) {23String url = “/small-snail/archive/20130421.html”;System.out.println(url.endsWith(“.html”)); System.out.println(url.startsWith(“/small-snail/category/”)); System.out.println(url.endsWith(“.php”)); }

2> equals(Object anObject)

在 java 中, Object是一个顶级类, 所有类都直接或间接或默认的继承了该类。

Object 类有一个 equals(Object obj) 方法, 因此,所有类都默认的拥有了这个方法。

但Object 的 equals(obj) 方法默认比较的是两个引用变量所引用的对象是否相同, 只有当两个引用变量引用了相同的一个对象的时候才会返回 true。

String 类重写了 Object 类的此方法, String 类的 equals 方法比较的是两个 String 对象的内容是否相同。

1 package net.yeah.fancydeepin.string; Application { main(String[] args) { 6 7String kitty1 = new String(“HelloKitty”); 8String kitty2 = new String(“HelloKitty”); 9StringBuilder kitty3 = new StringBuilder(“HelloKitty”);System.out.println(kitty1.equals(kitty3)); }13 }

第 11 行,虽然 kitty3 的内容与 kitty1 的内容一样, 但由于 kitty3 不是一个 String 对象, 因此调 equals 方法的返回值为 false。

下面附上 String 类的 equals 方法的源码:

3> equalsIgnoreCase(String anotherString)

比较两个 String 对象的内容是否相同, 忽略大小写。

绚丽的民族风情,悠久的历史文化。抛开尘世的纷扰,

小瓜牛漫谈 — String

相关文章:

你感兴趣的文章:

标签云: