где строковое значение из метода .next () класса Scanner размещено в памяти? - PullRequest
1 голос
/ 28 января 2020

Где находится строковое значение, которое берется от пользователя, выделенного в памяти?

Scanner input = new Scanner(System.in);
String x = "hello"; // This is stored in String constant pool
String y = "hello";
String z = new String("hello"); // This is stored in normal heap

System.out.println("Enter "+x);
String u = input.next(); // Where is this stored?

System.out.println(x==y) // true because same memory address in SCP
System.out.println(x==z) // false because one is stored in SCP and other in heap
System.out.println(u==x) // false then not in SCP
System.out.println(u==z) // false then not in heap either

- это то значение, которое вы храните в стеке?

Ответы [ 2 ]

1 голос
/ 28 января 2020

Я посмотрел на класс Scanner в OpenJdk8 и обнаружил, что строка хранится в классе Scanner как CharBuffer.

public final class Scanner implements Iterator<String>, Closeable {

    // Internal buffer used to hold input
    private CharBuffer buf;
......
}
0 голосов
/ 28 января 2020

Путаница вызвана неверным предположением (выраженным в комментарии к последней строке кода), что если две строки не поддерживаются постоянным пулом (то есть находятся в куче), что они являются тот же объект. На самом деле это могут быть разные объекты:

String s1 = new String("test");
String s2 = new String("test");  // s1 != s2

Проблема не столько в том, где определенный объект String размещен, а в том, представлены ли строки одним и тем же объектом или нет.

См. Также Пул констант строки

...