2014-01-22 4 views
3
String summer = new String("Summer"); 
String summer2 = "Summer"; 
System.out.println("Summer"); 
System.out.println("autumn"); 
System.out.println("autumn" == "summer"); 
String autumn = new String("Summer"); 

мой ответ 2 + 0 + 0 + 1 + 1 + 1 = 5. это правильно?Сколько строковых объектов создано для следующего?

+0

Я думаю, это будет только 3. – Anubhab

+1

Это не может быть 2 , так как здесь есть как минимум три разных строки ... – Makoto

+0

@Makoto 'String summer2 =" Summer ";' является строковым литералом. – Maroun

ответ

5

Звучит разумно для меня.

String summer = new String("Summer"); 

Создано 2 экземпляра. Первый - буквальный "Summer". Второй - потому, что вызывается конструктор.

String summer2 = "Summer"; 

0 экземпляров: это всего лишь ссылочное задание.

System.out.println("Summer"); 

0 экземпляров. Литерал "Summer" взят из кеша.

System.out.println("autumn"); 

1 экземпляр "autumn"

System.out.println("autumn" == "summer"); 

1 экземпляр "summer"

String autumn = new String("Summer"); 

1 экземпляр вызвано вызова конструктора. Литерал "Summer" взят из кеша.

Практический результат: 2 + 0 + 0 + 1 + 1 + 1 = 5

+2

В Java 7 он создает строковые литералы по требованию, но в Java 6 он делает это при загрузке класса, что может изменить ответ. –

+0

Не должен ли быть минимум 5? В двух случаях, когда он не создает новые экземпляры, но реле на пуле строк, разве это не просто оптимизация компилятора, это неопределенное поведение? Я не думал, что это поведение было документировано или потребовалось для компилятора Java. – kba

+0

@Peter Lawrey, я не знал об этой разнице между java 6 и 7. Не могли бы вы объяснить больше или отправить ссылку? – AlexR

1

Да, это правильно. Всего будет создано 5 объектов.

String summer = new String("Summer"); // 2 objects. One for constructor and other for literal 
String summer2 = "Summer"; // 0. Will point to the literal already created. 
System.out.println("Summer"); // 0. Same as above statement 
System.out.println("autumn"); // 1 object will be created 
System.out.println("autumn" == "summer"); // 1 object. 'Summer' and 'summer' are not same 
String autumn = new String("Summer"); // 1 object. new String() will cause a new object creation but not the literal 
1

Скомпилируйте его и считать:

import java.lang.reflect.Field; 
import sun.misc.Unsafe; 
public class test { 
    private static Unsafe unsafe; 

    static { 
     try { 
      Field field = Unsafe.class.getDeclaredField("theUnsafe"); 
      field.setAccessible(true); 
      unsafe = (Unsafe) field.get(null); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public static long addressOf(Object o) throws Exception { 
     Object[] array = new Object[]{o}; 

     long baseOffset = unsafe.arrayBaseOffset(Object[].class); 
     int addressSize = unsafe.addressSize(); 
     long objectAddress; 
     switch (addressSize) { 
      case 4: 
       objectAddress = unsafe.getInt(array, baseOffset); 
       break; 
      case 8: 
       objectAddress = unsafe.getLong(array, baseOffset); 
       break; 
      default: 
       throw new Error("unsupported address size: " + addressSize); 
     } 

     return (objectAddress); 
    } 

    public static void main(String... args) 
      throws Exception { 

     String summer = new String("Summer"); 
     System.out.println("Addess: " + addressOf(summer)); 
     String summer2 = "Summer"; 
     System.out.println("Addess: " + addressOf(summer2)); 
     System.out.println("Addess: " + addressOf("Summer")); 
     System.out.println("Addess: " + addressOf("autumn")); 
     System.out.println("Addess: " + addressOf("autumn")); 
     System.out.println("Addess: " + addressOf("summer")); 
     //System.out.println("Summer"); 
     //System.out.println("autumn"); 
     //System.out.println("autumn" == "summer"); 
     String autumn = new String("Summer"); 
     System.out.println("Addess: " + addressOf(autumn)); 


    } 

    public static void printBytes(long objectAddress, int num) { 
     for (long i = 0; i < num; i++) { 
      int cur = unsafe.getByte(objectAddress + i); 
      System.out.print((char) cur); 
     } 
     System.out.println(); 
    } 
} 
Смежные вопросы