Home > Software engineering >  In Android, why 2 strings point to the same object if they are initialized by the same value, but no
In Android, why 2 strings point to the same object if they are initialized by the same value, but no

Time:07-18

Why two different String variables point to the same object if they are initialized by the same value, but they point to different object if the string is passed through an Intent?

For example:

public class MainActivity extends Activity {

    public static String textA;

    protected void onCreate(Bundle savedInstanceState) {
          MainActivity.textA = "abc";
          Intent intent = new Intent(MainActivity.this, MainActivity2.class);
          intent.putExtra("extra", MainActivity.textA);
          startActivity(intent);
    } 

}
public class MainActivity2 extends Activity {

    protected void onCreate(Bundle savedInstanceState) {
          Intent intent = getIntent();
          String textB = intent.getStringExtra("extra");
          System.out.println(textB == MainActivity.textA);
          String textC = "abc";
          System.out.println(textC == MainActivity.textA);
    } 

}

The output is

false
true

My question is why textC and MainActivity.textA point to the same "abc" but textB points to a separate "abc"?

CodePudding user response:

I ran into this answer and learned a bit.

It seems like the JVM handles String allocations differently.

Since it's probably the most widely allocated object, it requires immense optimization.

So the JVM tries to prevent String allocations as much as it can.

In your code, you explicitly assign "abc" to textA and textC. In this case, the JVM is smart enough to "know" it can use the same reference for both variables.

Unlike textA and textC, textB gets assigned dynamically and the JVM does not have a guarantee that it can use the same "abc" reference so it cannot apply the same optimization (even you cannot know it - someone can start MainActivity2 and pass different extra value in the intent extras).

  • Related