Wird in jedem Szenario ein String() - Konstruktor als String-Literal verwendet? Die Verwendung von String-Literalen ermöglicht die Wiederverwendung vorhandener Objekte. Warum brauchen wir also den öffentlichen Konstruktor? Gibt es eine reale Welt? ZB zeigen beide Literale auf das gleiche Objekt.Warum ist der Konstruktor String() nicht privat?
Antwort
Ein Beispiel, wo der Konstruktor einen nützlichen Zweck hat: von String.substring()
erstellt Strings die zugrunde liegenden char[]
der String
teilt sie erstellt sind. Wenn Sie also eine String
der Länge 10.000.000 haben (20MB Speicher belegen) und die ersten 5 Zeichen als Teilzeichenfolge verwenden, dann verwerfen Sie die ursprüngliche String
, diese Teilzeichenfolge behält das 20MB-Objekt weiterhin für die Garbage Collection. Wenn Sie den String-Konstruktor verwenden, vermeiden Sie dies, da nur der Teil des zugrunde liegenden char-Arrays kopiert wird, der tatsächlich von der String
-Instanz verwendet wird.
Natürlich, wenn Sie eine Menge von Teil des gleichen String
erstellen und verwenden, vor allem, wenn sie sich überlappen, dann würden Sie sehr viel wollen, dass sie die zugrunde liegenden char[]
teilen und den Konstruktor wäre kontraproduktiv.
Weil manchmal möchten Sie vielleicht eine Kopie erstellen und nicht nur einen neuen Verweis auf die gleiche Zeichenfolge haben.
Können Sie ein Beispiel für ein solches Szenario geben? – cdhowie
Ich habe heute Morgen eine Frage über eine WeakHashMap gesehen, die eine HashMap ist, die ein Element automatisch entfernt, wenn sein Schlüssel Garbage Collection ist. Es stellte sich heraus, dass Sie String-Literale nicht als Schlüssel für diese verwenden sollten, da sie nie wieder zurückgewonnen werden würden. –
Da die Zeichenfolge unveränderlich ist, behalten Operationen wie die Teilzeichenfolge die ursprüngliche Zeichenfolge bei, die möglicherweise lang ist. Wenn Sie den Konstruktor zum Erstellen einer neuen Zeichenfolge aus der Teilzeichenfolge verwenden, wird eine neue Zeichenfolge erstellt, und Sie können die alte Zeichenfolge (in GC) löschen. Auf diese Weise könnte der benötigte Speicher freigegeben werden.
Beispiel:
String longS = "very long";
String shortS = new String(longS.substring(4));
@Erick: Nein, nicht unbedingt identisch. Siehe Michaels Antwort. –
@Erick: Ja, es wird, weil das zugrunde liegende Char-Array viel größer als die "sichtbaren" String-Inhalte sein kann. –
Michael erklärt das besser. –
Alle guten Antworten hier, aber ich denke, es lohnt sich, darauf hinzuweisen, dass die Java Literale ganz anders behandelt als Strings die traditionelle Art und Weise konstruiert.
Dies ist a good Q/A darüber.
- 1. Scala-Fall-Klasse privaten Konstruktor ist nicht privat
- 2. Konstruktor privat machen
- 3. kann Konstruktor nicht als geschützt oder privat definieren! Warum?
- 4. Warum ist die Hauptmethode privat?
- 5. Warum ist der base() - Konstruktor nicht notwendig?
- 6. Warum ist der Konstruktor nicht die Konstruktionsfunktion?
- 7. Warum wurde der Konstruktor std :: string nicht aufgerufen?
- 8. Warum können Sie nicht von einer Klasse erben, deren Konstruktor privat ist?
- 9. std :: is_default_constructible <T> Fehler, wenn Konstruktor privat ist
- 10. JavaParser: Konstruktor ParseException (String) ist nicht definiert
- 11. Warum ist mein Objekt nicht privat, wenn meine Variable ist?
- 12. Warum wurde der Move-Konstruktor nicht aufgerufen?
- 13. Der Konstruktor ist nicht definiert?
- 14. Der Konstruktor ArrayAdapter <string> ist nicht definiert
- 15. C++ Ist privat wirklich privat?
- 16. Warum explizit "privat" schreiben?
- 17. Warum wird der Konstruktor nicht aufgerufen?
- 18. Warum wird der Move-Konstruktor nicht aufgerufen?
- 19. Warum wird der Move-Konstruktor nicht aufgerufen?
- 20. Mit privat var von Konstruktor in neue Methode in Javascript
- 21. Der Konstruktor Scanner ist nicht definiert
- 22. Auf Ruby, warum include ist privat und extend ist öffentlich?
- 23. Uri (Uri, String) -Konstruktor funktioniert nicht richtig?
- 24. C++ leer String Konstruktor
- 25. Warum ist "string" - "string" NaN?
- 26. Der Konstruktor XSSFWorkbook (Fileinputstream) nicht definiert ist
- 27. Warum Java meinen Konstruktor nicht finden kann?
- 28. C++ Äußerer Klassenzugriff Innere Klasse ist privat - Warum verboten?
- 29. Warum String-Klasse nicht klonbar ist?
- 30. Warum Bash String-Array ist nicht Looping
Das war eine harte Lektion für mich vor etwa 5 Jahren gelernt. –
Es war eine schöne Vorlesung, aber es beantwortet keine Frage aus dem Header: "Warum ist nicht String-Konstruktor * privat *?" String_sring() kann all seine Optimierungen mit dem privaten Konstruktor als Methode der Klasse String implementieren. Die Frage ist, warum ist dieser Konstruktor öffentlich ?! – AlexR
@AlexR: Lesen Sie die Antwort erneut, insbesondere den letzten Satz des ersten Absatzes. –