Υποθέτοντας String a και b:
a += b
a = a.concat(b)
Κάτω από την κουκούλα, είναι το ίδιο πράγμα;
Εδώ είναι το concat αποσυμπιεσμένο ως αναφορά. Θα ήθελα να μπορέσω να αποσυμπιέσω και τον τελεστή +
για να δω τι κάνει.
public String concat(String s) {
int i = s.length();
if (i == 0) {
return this;
}
else {
char ac[] = new char[count + i];
getChars(0, count, ac, 0);
s.getChars(0, i, ac, count);
return new String(0, count + i, ac);
}
}
Ο Niyaz είναι σωστός, αλλά αξίζει επίσης να σημειωθεί ότι ο ειδικός τελεστής + μπορεί να μετατραπεί σε κάτι πιο αποδοτικό από τον μεταγλωττιστή της Java. Η Java έχει μια κλάση StringBuilder η οποία αναπαριστά ένα μη ασφαλές για νήματα, μεταβλητό String. Όταν εκτελείτε μια δέσμη από συνδέσεις αλφαριθμητικών, ο μεταγλωττιστής της Java μετατρέπει σιωπηρά τον
String a = b + c + d;
σε
String a = new StringBuilder(b).append(c).append(d).toString();
το οποίο για μεγάλες συμβολοσειρές είναι σημαντικά πιο αποδοτικό. Απ' όσο γνωρίζω, αυτό δεν συμβαίνει όταν χρησιμοποιείτε τη μέθοδο concat.
Ωστόσο, η μέθοδος concat είναι πιο αποδοτική κατά τη συνένωση ενός κενού String σε ένα υπάρχον String. Σε αυτή την περίπτωση, η JVM δεν χρειάζεται να δημιουργήσει ένα νέο αντικείμενο String και μπορεί απλώς να επιστρέψει το υπάρχον. Δείτε την τεκμηρίωση concat για να το επιβεβαιώσετε αυτό.
Έτσι, αν'σας ενδιαφέρει πάρα πολύ η αποδοτικότητα, τότε θα πρέπει να χρησιμοποιείτε τη μέθοδο concat όταν συνδέετε πιθανώς κενές Συμβολοσειρές, και να χρησιμοποιείτε την + αλλιώς. Ωστόσο, η διαφορά απόδοσης θα πρέπει να είναι αμελητέα και πιθανώς δεν θα πρέπει ποτέ να'ανησυχείτε γι' αυτό.
Ο τελεστής + μπορεί να λειτουργήσει μεταξύ μιας συμβολοσειράς και μιας τιμής τύπου συμβολοσειράς, char, ακέραιου, διπλού ή κινητού. Απλώς μετατρέπει την τιμή στην αναπαράστασή της με συμβολοσειρά πριν από τη συνένωση.
Ο τελεστής concat μπορεί να γίνει μόνο σε και με συμβολοσειρές. Ελέγχει τη συμβατότητα των τύπων δεδομένων και πετάει ένα σφάλμα, αν δεν ταιριάζουν.
Εκτός από αυτό, ο κώδικας που δώσατε κάνει τα ίδια πράγματα.
Δεν το νομίζω.
Η a.concat(b)
υλοποιείται σε String και νομίζω ότι η υλοποίηση δεν άλλαξε πολύ από τις πρώτες μηχανές java. Η υλοποίηση της πράξης +
εξαρτάται από την έκδοση της Java και τον μεταγλωττιστή. Επί του παρόντος, το +
υλοποιείται χρησιμοποιώντας StringBuffer
για να γίνει η λειτουργία όσο το δυνατόν πιο γρήγορη. Ίσως στο μέλλον, αυτό να αλλάξει. Σε προηγούμενες εκδόσεις της java η λειτουργία +
σε Strings ήταν πολύ πιο αργή καθώς παρήγαγε ενδιάμεσα αποτελέσματα.
Υποθέτω ότι το +=
υλοποιείται χρησιμοποιώντας το +
και βελτιστοποιείται ομοίως.