new String() vs literal string performance

前端 未结 4 2093
名媛妹妹
名媛妹妹 2020-12-05 15:07

This question has been asked many times on StackOverflow but none of them were based on performance.

In Effective Java book it\'s given tha

4条回答
  •  广开言路
    2020-12-05 15:29

    In the first case, a new object is being created in each iteration, in the second case, it's always the same object, being retrieved from the String constant pool.

    In Java, when you do:

    String bla = new String("xpto");
    

    You force the creation of a new String object, this takes up some time and memory.

    On the other hand, when you do:

    String muchMuchFaster = "xpto"; //String literal!
    

    The String will only be created the first time (a new object), and it'll be cached in the String constant pool, so every time you refer to it in it's literal form, you're getting the exact same object, which is amazingly fast.

    Now you may ask... what if two different points in the code retrieve the same literal and change it, aren't there problems bound to happen?!

    No, because Strings, in Java, as you may very well know, are immutable! So any operation that would mutate a String returns a new String, leaving any other references to the same literal happy on their way.

    This is one of the advantages of immutable data structures, but that's another issue altogether, and I would write a couple of pages on the subject.

    Edit

    Just a clarification, the constant pool isn't exclusive to String types, you can read more about it here, or if you google for Java constant pool.

    http://docs.oracle.com/javase/specs/jvms/se7/jvms7.pdf

    Also, a little test you can do to drive the point home:

    String a = new String("xpto");
    String b = new String("xpto");
    String c = "xpto";
    String d = "xpto";
    
    System.out.println(a == b);
    System.out.println(a == c);
    System.out.println(c == d);
    

    With all this, you can probably figure out the results of these Sysouts:

    false
    false
    true
    

    Since c and d are the same object, the == comparison holds true.

提交回复
热议问题