Search code examples
javastringparameter-passingstringbuilderpass-by-value

Pass-by-value (StringBuilder vs String)


I do not understand why System.out.println(name) outputs Sam without being affected by the method's concat function, while System.out.println(names) outputs Sam4 as a result of the method's append method. Why is StringBuilder affected and not String? Normally, calling methods on a reference to an object affects the caller, so I do not understand why the String result remains unchanged. Thanks in advance

public static String speak(String name) {
    name = name.concat("4");
    return name;
}

public static StringBuilder test(StringBuilder names) {
    names = names.append("4");
    return names; 
}

public static void main(String[] args) {
    String name = "Sam";
    speak(name);
    System.out.println(name); //Sam
    StringBuilder names = new StringBuilder("Sam");
    test(names);
    System.out.println(names); //Sam4
}

Solution

  • Because when you call speak(name);, inside speak when you do

    name = name.concat("4");
    

    it creates a new object because Strings are immutable. When you change the original string it creates a new object,I agree that you are returning it but you are not catching it.

    So essentially what you are doing is :

    name(new) = name(original) + '4'; // but you should notice that both the names are different objects.
    

    try

    String name = "Sam";
    name = speak(name);
    

    Of course now I think there is no need to explain why it's working with StringBuilder unless if you don't know that StringBuilder is mutable.