答案:A
这题考察了:
- Object 的 equals() 方法,和 String 重写过的 equals() 方法
- 对 String 类型变量的改变,是否会生成新的 String 对象
- String 类型的对象是否可变,是否是线程安全的
- 运算符重载是什么?
+
号拼接字符串的用法
1)Object 的 equals() 方法,和 String 重写过的 equals() 方法
-
Object 的 equals() 方法源码
public boolean equals(Object obj) { return (this == obj); }
比较的是对象引用是否相同,即两个对象的内存地址是否相同
-
String 重写过的 equals() 方法
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
从这里可以看出
while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; }
比较了字符串对应字符数组的每一个字符的内容
所以 String 重写过的 equals() 方法并不是比较对象的内存地址,比较的是 String 对象里的内容
2)对 String 类型变量的改变,是否会生成新的 String 对象
阅读 String 源码即可发现 ,String 对象的字符串内容是被如下的字符数组存储的,而这个字符串数组是被 final 修饰的,是不能改变原字符串的内容的。通常我们所说的对字符串变量的改变,都是 new 了一个新的字符串类型的变量
private final char value[];
3)String 类型的对象是否可变,是否是线程安全的
根据 2)中可知,String 类型的变量不可变。
那为什么可以说它线程安全?
- 假设现在有一个字符串对象是多个线程的共享数据,由于 String 类型的变量不可变,这些线程并不能改变它的内容,因此也不会引发共享数据改变而带来的安全性问题
4)运算符重载是什么?+
号拼接字符串的用法
先来看一下运算符重载的定义:
- 运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型
但是,Java 不同于 C++,为了避免语言的复杂性,Java 里面用户是无法自定义重载运算符的
那 “String 可以使用 +
进行拼接” 这个表述是对的,应该怎么理解这句话?
- Java 里面的
+
拼接字符串,底层是通过 new 了一个 StringBuilder 的实例对象,通过调用该实例对象的 append() 方法来实现字符串拼接的