String - inicjalizacja za pomocą opratora "="

0

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 :)

0

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.

2

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".

0

Dzięki za odpowiedź, zwłaszcza Koziołek który miał chwilę na dokładne objaśnienie problemu.

0

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.

0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1