Ответ 1
Вот ваша цитата JLS, Раздел 3.10.5:
Каждый строковый литерал является ссылкой (§4.3) экземпляру (§4.3.1, § 12.5) класса String (п. 4.3.3). Объекты String имеют постоянное значение. Строковые литералы или, в более общем смысле, строки, которые являются значениями постоянные выражения (§15.28) - "интернированы", чтобы делиться уникальными экземпляров, используя метод String.intern.
Таким образом, тестовая программа, состоящая из единицы компиляции (§7.3):
package testPackage;
class Test {
public static void main(String[] args) {
String hello = "Hello", lo = "lo";
System.out.print((hello == "Hello") + " ");
System.out.print((Other.hello == hello) + " ");
System.out.print((other.Other.hello == hello) + " ");
System.out.print((hello == ("Hel"+"lo")) + " ");
System.out.print((hello == ("Hel"+lo)) + " ");
System.out.println(hello == ("Hel"+lo).intern());
}
}
class Other { static String hello = "Hello"; }
и блок компиляции:
package other;
public class Other { static String hello = "Hello"; }
выводит результат: true true true true false true
Этот пример иллюстрирует шесть пунктов:
Литеральные строки в одном классе (§8) в том же пакете (§7) представляют ссылки на один и тот же объект String (§4.3.1).
Литеральные строки в разных классах в одном пакете представляют ссылки на один и тот же объект String.
Литеральные строки в разных классах в разных пакетах аналогично представляют ссылки на один и тот же объект String.
Строки, вычисленные постоянными выражениями (§15.28), вычисляются в компилировать время, а затем обрабатывать, как если бы они были литералами.
Строки, вычисленные путем конкатенации во время выполнения, создаются и поэтому различный. Результат явного интернирования вычисленного строка является той же строкой, что и любая ранее существовавшая литеральная строка с такое же содержание.
В сочетании с JavaDoc для стажера, и у вас достаточно информации, чтобы вывести, что оба ваших случая вернут true.