wake-up-neo.com

Wie verkette ich zwei Strings in Java?

Ich versuche Strings in Java zu verketten. Warum funktioniert das nicht?

public class StackOverflowTest {  
    public static void main(String args[]) {
        int theNumber = 42;
        System.out.println("Your number is " . theNumber . "!");
    }
}
59
nn2

Sie können Strings mit dem Operator + verketten:

System.out.println("Your number is " + theNumber + "!");

theNumber wird implizit in den String "42" konvertiert.

86
Peter Lang

Der Verkettungsoperator in Java ist +, nicht ..

Lesen Sie dies (einschließlich aller Unterabschnitte), bevor Sie beginnen. Versuche zu stoppen, den ph-Weg zu denken;)

Um Ihre Sicht auf die Verwendung von Strings in Java zu erweitern, wird der +-Operator für Strings tatsächlich (vom Compiler) in Folgendes umgewandelt:

new StringBuilder().append("firstString").append("secondString").toString()
44
Bozho

Es gibt zwei grundlegende Antworten auf diese Frage:

  1. [einfach] Verwenden Sie den Operator + (String-Verkettung). "your number is" + theNumber + "!" (wie an anderer Stelle angegeben)
  2. [weniger einfach]: Verwenden Sie StringBuilder (oder StringBuffer).
StringBuilder value;
value.append("your number is");
value.append(theNumber);
value.append("!");

value.toString();

Ich empfehle gegen Stapelvorgänge wie folgt:

new StringBuilder().append("I").append("like to write").append("confusing code");

Edit: Ab Java 5 wird der String-Verkettungsoperator vom Compiler in StringBuilder-Aufrufe übersetzt. Aus diesem Grund sind beide Methoden gleich. 

Anmerkung: Weltraum ist von unschätzbarem Wert.

Vorbehalt: Beispiel 1 generiert mehrere StringBuilder-Instanzen und ist weniger effizient als Beispiel 2

Beispiel 1

String Blam = one + two;
Blam += three + four;
Blam += five + six;

Beispiel 2

String Blam = one + two + three + four + five + six;
14
DwB

Direkt aus der Box haben Sie 3 Möglichkeiten, um den Wert einer Variablen in ein String einzuspeisen, während Sie versuchen, Folgendes zu erreichen:

1. Der einfachste Weg

Sie können den Operator + einfach zwischen einem String und einem beliebigen Objekt- oder Primitivtyp verwenden. Die String und werden dabei automatisch verkettet 

  1. Im Falle eines Objekts ist der Wert von String.valueOf(obj) , der dem String "null" entspricht, wenn objnull ist, andernfalls der Wert von obj.toString().
  2. Im Falle eines primitiven Typs das Äquivalent von String.valueOf(<primitive-type>).

Beispiel mit einem Nicht-null-Objekt:

Integer theNumber = 42;
System.out.println("Your number is " + theNumber + "!");

Ausgabe:

Your number is 42!

Beispiel mit einem null-Objekt:

Integer theNumber = null;
System.out.println("Your number is " + theNumber + "!");

Ausgabe:

Your number is null!

Beispiel mit einem primitiven Typ:

int theNumber = 42;
System.out.println("Your number is " + theNumber + "!");

Ausgabe:

Your number is 42!

2. Der explizite Weg und möglicherweise der effizienteste

Sie können StringBuilder (oder StringBuffer das Thread-sichere veraltete Gegenstück) verwenden, um Ihr String mit den append-Methoden zu erstellen. 

Beispiel:

int theNumber = 42;
StringBuilder buffer = new StringBuilder()
    .append("Your number is ").append(theNumber).append('!');
System.out.println(buffer.toString()); // or simply System.out.println(buffer)

Ausgabe:

Your number is 42!

Hinter den Kulissen ist dies die Art und Weise, wie aktuelle Java-Compiler alle mit dem Operator + ausgeführten String-Verkettungen konvertieren. Der einzige Unterschied zur vorherigen Methode besteht darin, dass Sie full control haben. 

Tatsächlich verwenden die Compiler den default-Konstruktor, um die Standardkapazität (16) zu erhalten, da sie keine Ahnung haben, wie die endgültige Länge der zu erstellenden String-Funktion aussehen würde als 16 wird die Kapazität notwendigerweise erweitert, was einen Preis im Hinblick auf die Leistungen hat. 

Wenn Sie also im Voraus wissen, dass die Größe Ihres finalen String größer als 16 ist, ist es viel effizienter, diesen Ansatz zu verwenden, um eine bessere Anfangskapazität zu erreichen. In unserem Beispiel erstellen wir beispielsweise ein String, dessen Länge größer als 16 ist. Um bessere Leistungen zu erzielen, sollte es als nächstes umgeschrieben werden:

Beispiel optimiert:

int theNumber = 42;
StringBuilder buffer = new StringBuilder(18)
    .append("Your number is ").append(theNumber).append('!');
System.out.println(buffer)

Ausgabe:

Your number is 42!

3. Der lesbarste Weg

Sie können die Methoden String.format(locale, format, args) oder String.format(format, args) verwenden, die beide auf einem Formatter bauen, um Ihr String zu erstellen. Auf diese Weise können Sie das Format Ihres letzten String angeben, indem Sie Platzhalter verwenden, die durch den Wert der Argumente ersetzt werden. 

Beispiel:

int theNumber = 42;
System.out.println(String.format("Your number is %d!", theNumber));
// Or if we need to print only we can use printf
System.out.printf("Your number is still %d with printf!%n", theNumber);

Ausgabe:

Your number is 42!
Your number is still 42 with printf!

Der interessanteste Aspekt bei diesem Ansatz ist die Tatsache, dass wir eine klare Vorstellung davon haben, was das endgültige String sein wird, da es viel einfacher zu lesen ist und daher viel einfacher zu warten ist.

7
Nicolas Filotto

Der Java 8-Weg:

StringJoiner sj1 = new StringJoiner(", ");
String joined = sj1.add("one").add("two").toString();
// one, two
System.out.println(joined);


StringJoiner sj2 = new StringJoiner(", ","{", "}");
String joined2 = sj2.add("Jake").add("John").add("Carl").toString();
// {Jake, John, Carl}
System.out.println(joined2);
6
Andrejs

Sie müssen ein PHP -Programmierer sein.

Verwenden Sie ein +-Zeichen.

System.out.println("Your number is " + theNumber + "!");
4
Ed Manet

Zur genauen Verkettung von zwei Strings verwenden Sie bitte:

file_names = file_names.concat(file_names1);

In Ihrem Fall verwenden Sie + anstelle von .

3
Learner

Für eine bessere Leistung verwenden Sie str1.concat(str2), wobei str1 und str2 Zeichenfolgenvariablen sind.

3
amanraj

"+" statt "."

3
Mateusz Dymczyk

Verwenden Sie + für die Verkettung von Zeichenfolgen.

"Your number is " + theNumber + "!"
3
Greg

Das sollte funktionieren

public class StackOverflowTest
{  
    public static void main(String args[])
    {
        int theNumber = 42;
        System.out.println("Your number is " + theNumber + "!");
    }
}
3
bragboy

In Java ist das verkettete Symbol "+" . Wenn Sie versuchen, zwei oder drei Zeichenfolgen mit jdbc zu verketten, verwenden Sie Folgendes:

String u = t1.getString();
String v = t2.getString();
String w = t3.getString();
String X = u + "" + v + "" + w;
st.setString(1, X);

Hier wird "" nur für den Speicherplatz verwendet.

2
Surajchamp

In Java ist das Verkettungssymbol "+" und nicht ".".

1
Uncommented

"+" nicht "."

Aber seien Sie vorsichtig mit der String-Verkettung. Hier ist ein Link mit einigen Gedanken aus IBM DeveloperWorks .

1
JohnMetta
import com.google.common.base.Joiner;

String delimiter = "";
Joiner.on(delimiter).join(Lists.newArrayList("Your number is ", 47, "!"));

Dies ist möglicherweise zu viel für die Beantwortung der Op-Frage, für komplexere Join-Vorgänge ist es jedoch gut zu wissen. Diese Stackoverflow-Frage hat einen hohen Stellenwert in der allgemeinen Google-Suche in diesem Bereich, also gut zu wissen.

0
Daniel Gerson

Aus den möglichen Antworten haben Sie möglicherweise die Antwort, warum Ihr Snippet nicht funktioniert. Jetzt werde ich meine Vorschläge hinzufügen, wie man es effektiv macht. In diesem Artikel ist ein guter Ort spricht der Autor über verschiedene Arten der Verkettung der Zeichenfolge und gibt auch die Zeitvergleichsergebnisse zwischen verschiedenen Ergebnissen an.

Verschiedene Möglichkeiten, wie Strings in Java verkettet werden könnten

  1. Mit dem Operator + (20 + "")
  2. Mit der Methode concat in der Klasse String
  3. StringBuffer verwenden
  4. Mit StringBuilder

Methode 1:

Dies ist keine empfohlene Vorgehensweise. Warum? Wenn Sie es mit Ganzzahlen und Zeichen verwenden, sollten Sie sich ausdrücklich bewusst sein, die Ganzzahl in toString() umzuwandeln, bevor Sie die Zeichenfolge anhängen. Andernfalls werden die Zeichen mit ASCI-Ganzzahlen behandelt und oben hinzugefügt.

String temp = "" + 200 + 'B';

//This is translated internally into,

new StringBuilder().append( "" ).append( 200 ).append('B').toString();

Methode 2:

Dies ist die Implementierung der inneren concat -Methode

public String concat(String str) {
    int olen = str.length();
    if (olen == 0) {
        return this;
    }
    if (coder() == str.coder()) {
        byte[] val = this.value;
        byte[] oval = str.value;
        int len = val.length + oval.length;
        byte[] buf = Arrays.copyOf(val, len);
        System.arraycopy(oval, 0, buf, val.length, oval.length);
        return new String(buf, coder);
    }
    int len = length();
    byte[] buf = StringUTF16.newBytesFor(len + olen);
    getBytes(buf, 0, UTF16);
    str.getBytes(buf, len, UTF16);
    return new String(buf, UTF16);
}

Dadurch wird jedes Mal ein neuer Puffer erstellt und der alte Inhalt in den neu zugewiesenen Puffer kopiert. Dies ist also zu langsam, wenn Sie mehr Strings verwenden.

Methode 3:

Dies ist threadsicher und im Vergleich zu (1) und (2) vergleichsweise schnell. Dies verwendet StringBuilder intern und wenn es neuen Speicher für den Puffer reserviert (sagen wir, dass seine aktuelle Größe 10 ist), würde es seine 2 * Größe + 2 erhöhen (was 22 ist). Wenn das Array also immer größer wird, ist die Leistung wirklich besser, da die Puffergröße nicht jedes Mal für jeden append -Aufruf zugewiesen werden muss.

    private int newCapacity(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = value.length >> coder;
        int newCapacity = (oldCapacity << 1) + 2;
        if (newCapacity - minCapacity < 0) {
            newCapacity = minCapacity;
        }
        int SAFE_BOUND = MAX_ARRAY_SIZE >> coder;
        return (newCapacity <= 0 || SAFE_BOUND - newCapacity < 0)
            ? hugeCapacity(minCapacity)
            : newCapacity;
    }

    private int hugeCapacity(int minCapacity) {
        int SAFE_BOUND = MAX_ARRAY_SIZE >> coder;
        int UNSAFE_BOUND = Integer.MAX_VALUE >> coder;
        if (UNSAFE_BOUND - minCapacity < 0) { // overflow
            throw new OutOfMemoryError();
        }
        return (minCapacity > SAFE_BOUND)
            ? minCapacity : SAFE_BOUND;
    }

Methode 4

StringBuilder ist die schnellste Methode für die String -Verkettung, da sie nicht threadsicher ist . Sofern Sie nicht sehr sicher sind, dass Ihre Klasse, die dies verwendet, eine Tonne ist, würde ich dringend empfehlen, diese nicht zu verwenden.

Kurz gesagt, verwenden Sie StringBuffer, bis Sie nicht mehr sicher sind, ob Ihr Code von mehreren Threads verwendet werden kann. Wenn Sie sich verdammt sicher sind, dass Ihre Klasse Singleton ist, setzen Sie StringBuilder für die Verkettung fort.

0
rm -rf star

Es gibt mehrere Möglichkeiten, dies zu tun, aber Oracle und IBM sagen, dass die Verwendung von + eine schlechte Praxis ist, da Sie bei jeder Verkettung von String am Ende zusätzliche Objekte im Speicher erstellen. Dadurch wird zusätzlicher Speicherplatz in der JVM verwendet, und Ihr Programm ist möglicherweise nicht mehr ausreichend oder verlangsamt sich.

Verwenden Sie StringBuilder oder StringBuffer, um dies zu tun. Schauen Sie sich bitte den Kommentar von Nicolas Fillato an, der sich zum Beispiel auf StringBuffer bezieht.

String first = "I eat";  String second = "all the rats."; 
System.out.println(first+second);
0
surendrapanday

Sie können Strings mit dem Operator + verketten:

String a="hello ";
String b="world.";
System.out.println(a+b);

Ausgabe:

hello world.

Das ist es

0
user3176024

hier ist ein Beispiel zum Lesen und Verketten von 2 Zeichenfolgen ohne Verwendung der 3. Variablen:

public class Demo {
    public static void main(String args[]) throws Exception  {
        InputStreamReader r=new InputStreamReader(System.in);     
        BufferedReader br = new BufferedReader(r);
        System.out.println("enter your first string");
        String str1 = br.readLine();
        System.out.println("enter your second string");
        String str2 = br.readLine();
        System.out.println("concatenated string is:" + str1 + str2);
    }
}
0
Rejul jazz

sie können stringbuffer, stringbuilder und, wie jeder vor mir erwähnt hat, "+" verwenden. Ich bin nicht sicher, wie schnell "+" ist (ich denke, es ist das schnellste für kürzere Streicher), aber für längere Zeit sind Builder und Puffer ungefähr gleich (Builder ist etwas schneller, weil es nicht synchronisiert ist).

0
Goodwin Lu

Erste Methode: Sie können das Zeichen "+" zum Verketten von Zeichenfolgen verwenden. Dies geschieht jedoch immer in print . Eine andere Möglichkeit: Die Klasse String enthält eine Methode zum Verketten von zwei Zeichenfolgen: string1.concat (string2);

0
PJ Tang