Ostatnio zetknąłem się z pytaniem: czemu w javie używamy np. String s="tekst" zamiast String s=new String("tekst").
Chodzi po prostu o przeciążenie tego operatora w tej klasie, czy symulacje typu prostego czy coś innego?
Niestety nie poznałem odpowiedzi, więc pytam co wy na ten temat sądzicie :)
Ech bo jak robisz new String() to tworzysz nowy obiekt, zawsze. Jak robisz = to używasz valueOf(). Jaka różnica? String przechowuje informacje o utworzonych stringach i w efekcie jeśli zrobisz:
String x="ala";
String y="ala";
to moze się okazać że x ma tą samą referencję co y. Tak samo jest z Integerem na przykład, ale w ograniczonym zakresie.
Jest coś takiego jak Flyweight Pattern http://en.wikipedia.org/wiki/Flyweight_pattern i String go implementuje. Chodzi przede wszystkim o oszczędności na pamięci.
String jest niezmienny można zatem przyjąć, że skoro ktoś utworzył obiekt "a" za pomocą = to kolejne takie samo wywołanie nie popsuje nam tego obiektu zatem można go przypisać w takiej sytuacji do innej zmiennej. Użycie new oznacz wtedy "chcę nowy obiekt i mnie nie obchodzi, że sąsiad ma taki sam".
Dzięki za odpowiedź, zwłaszcza Koziołek który miał chwilę na dokładne objaśnienie problemu.
Ja wspomnę jeszcze o metodzie String.intern() która wrzuca Stringa do wewnętrznej puli (to chyba HashSet) jeżeli nie ma w niej Stringa o takiej samej zawartości. Potem zwraca Stringa z owej puli. Dwa Stringi z puli można porównywać za pomocą == zamiast equals. Dla Stringów spoza puli nie ma takich gwarancji.
Stringi z kodów źródłowych zachowują się mniej więcej tak samo jak Stringi internalizowane.
Prawie, ale nie całkiem
String s1 = "jajo";
String s = "jo";
String s2 = "ja"+s;
String s3 = "ja"+"jo";
System.out.println(s1==s2); //false
System.out.println(s1==s3); //true