我正在测试Strings,我提出了以下代码:
public static void main(String[] args){
StringBuilder sb1 = new StringBuilder("Cuba");
String str1 = sb1.toString();
// n1
System.out.println(str1 == str2);
}
如果我放置n1
:
String str2 = sb1.toString();
我得到false
。但是,如果我放置:
String str2 = str1;
我得到true
。
我不确定为什么会发生这种情况:两个代码都指的是同一个实例,因此,两个输出都必须是true
。
知道为什么两种输出都不同吗?我知道如何比较字符串,我只是对结果不同的原因感到好奇。
答案 0 :(得分:6)
这是OpenJDK 8u40中的StringBuilder.toString()
代码:
str2 = str1
所以每当你调用它时它都会返回一个新的String。
当您设置==
时,它们是同一个实例,因此true
会返回str2 = sb1.toString()
。但是,当您设置==
时,它会设置为新的字符串(具有相同的内容),因此false
会返回==
。
这实际上是在toString()
Javadoc(强调我的)中指定的:
返回表示此序列中数据的字符串。 分配新的String对象并初始化以包含此对象当前表示的字符序列。然后返回此String。对此序列的后续更改不会影响String的内容。
请注意,您不应该使用String
来比较import java.util.Arrays;
import java.util.Random;
public class RandomizedKSelection {
private static Random generator = new Random();
private static int partition(int[] array, int begin, int end) {
int index = begin + generator.nextInt(end - begin + 1);
int pivot = array[index];
swap(array, index, end);
for (int i = index = begin; i < end; ++ i) {
if (array[i] <= pivot) {
swap(array, index++, i);
}
}
swap(array, index, end);
return (index);
}
// iterative version
private static int orderStatistic(int[] A, int k, int start, int end) {
int pivotPosition = partition(A, start, end);
while (pivotPosition != k) {
if (k < pivotPosition) {
end = pivotPosition - 1;
} else {
start = pivotPosition + 1;
}
pivotPosition = partition(A, start, end);
}
return A[k];
}
public static int kthLargest(int[] A, int k) {
return orderStatistic(A, A.length - k - 1, 0, A.length - 1);
}
public static int kthLargest1Based(int[] A, int k) {
return kthLargest(A, k - 1);
}
public static int kthLargestSafe(int[] A, int k) {
Arrays.sort(A);
return A[A.length - k - 1];
}
public static void swap(int[] A, int i, int j) {
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
public static void main(String[] args) {
Random random = new Random();
for (int i = 0; i < 1000000; i++) {
int[] A = new int[1 + random.nextInt(1000)];
int max = 1 + random.nextInt(2 * A.length);
for (int j = 0; j < A.length; j++) {
A[j] = random.nextInt(max);
}
int k = random.nextInt(A.length);
if (RandomizedKSelection.kthLargest(A, k) != RandomizedKSelection.kthLargestSafe(A, k)) {
System.out.println("BUG");
}
}
}
}
s(请参阅this question)。