在同一个StringBuilder实例上调用toString时输出不同

时间:2015-12-05 23:33:43

标签: java string stringbuilder

我正在测试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

知道为什么两种输出都不同吗?我知道如何比较字符串,我只是对结果不同的原因感到好奇。

1 个答案:

答案 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)。