2017-02-02 10 views
1
public static void main(String[] args) { 
     String[] arr = new String[5]; 
     for (int i = 0; i < arr.length; i++) { 
      arr[i] = "aaa" + i; 
     } 

    System.out.println(arr[0] == "aaa0"); // false 
    String s = "aaa0"; 
    System.out.println(s == arr[0]); // false 
    } 

У меня есть несколько вопросов по поводу этой темы могли бы помочь мне понятьСтрока пула и String []

  1. Что логины за тот факт, что строка из строки массива автоматически не идут на Стинга пул, в отличие от струнных литералов?

  2. Правильно ли я понимаю, что только строковые литералы неявно идут в пул строк?

  3. Правильно ли я понимаю, что массив строк из государственной статической силы основных(государственной статической силы основных (String [] арг)) не пойти в бассейн Струнный тоже?

+2

Это не потому, что это массив. Это потому, что вы динамически создаете эти 'String' ('arr [i] =" aaa "+ i'). – resueman

+2

@mstorkson он говорит о пулах струн, хотя, так что это необходимо, чтобы показать свое мышление. – Zircon

+1

@mstorkson В моем случае сравнение через == важно показать действие пула строк; через equals() все будет «true» - строка в String-пуле и вне нее. –

ответ

3

Компилятор преобразует это под петлю под крышками!

И в результате байт-код будет использовать новый StringBuilder для каждой итерации цикла ... Результатом в «новых» созданных объектах строки!

Смысл; в «реальности, ваш цикл выглядит„более“, как:

for (int i = 0; i < arr.length; i++) { 
    StringBuilder builder = new StringBuilder("aaa"); 
    builder.append(i); 
    arr[i] = builder.toString(); 
} 

(см here на теоретическом фоне)

Это одна из причин того, что использование == для сравнения строк имеет такую ​​плохую репутацию. .. Как это приводит к неожиданным результатам.

И в отношении вашего комментария: точка не является массивом, который вы используете (где: вы должны не записывать в массив, переданный на главную - вы можете, но это плохая практика).

+0

Thx для вашего внимания! как насчет public static void main (String [] args)? args Строка arr имеет одинаковую логику? Или это какое-то исключение для компилятора в отношении моего вопроса? –

+0

Добро пожаловать. Я сделал некоторые обновления, и в случае, если вам нравится мой ответ, пожалуйста, подумайте о принятии в какой-то момент ;-) – GhostCat

2

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

public static void main(String[] args) { 
    String[] arr = new String[5]; 
    for (int i = 0; i < arr.length; i++) { 
     arr[i] = ("aaa" + i).intern(); 
    } 

    System.out.println(arr[0] == "aaa0"); 
    String s = "aaa0"; 
    System.out.println(s == arr[0]); 
} 
0

Используйте equals(), если вы хотите сравнить СОДЕРЖАНИЯ двух объектов. Вот еще экспликации

«==» оператор

В Java, когда «==» оператор используется для сравнения 2 объекта, он проверяет, если объекты относятся к такое же место в памяти. В другими словами, он проверяет, являются ли имена двух объектов в основном ссылками на ту же ячейку памяти.

В равно() Метод

равенство метод определен в классе Object, из которого каждый класса является либо прямым или косвенным потомком. По умолчанию метод equals() фактически ведет себя так же, как оператор «==» - , что означает, что он проверяет, ссылаются ли оба объекта на одно и то же место в памяти .Но метод equals фактически предназначен для сравнения содержимого двух объектов, а не их местоположения в памяти.

System.out.println(arr[0].equals("aaa0")); // It give you True 
System.out.println(s == arr[0]); // It give you false 

 Смежные вопросы

  • Нет связанных вопросов^_^