Virkņu savienošana: concat() vs "+" operators

Pieņemot, ka virknes a un b:

a += b
a = a.concat(b)

Vai zem pārsega tās ir vienas un tās pašas lietas?

Šeit ir concat dekompilēts kā atsauce. Es gribētu dekompilēt arī + operatoru, lai redzētu, ko tas dara.

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 ir taisnība, bet ir vērts arī atzīmēt, ka īpašo + operatoru Java kompilators var pārveidot par efektīvāku. Java ir StringBuilder klase, kas atveido mainīgu virkni, kas nav aizsargāta pret vītņu drošību. Veicot virkni virkņu sakopojumu, Java kompilators klusējot konvertē

String a = b + c + d;

uz

String a = new StringBuilder(b).append(c).append(d).toString();

kas lielām virknēm ir ievērojami efektīvāk. Cik man zināms, tas nenotiek, ja tiek izmantota concat metode.

Tomēr concat metode ir efektīvāka, ja tukšu virkni pievieno jau esošai virknei. Šādā gadījumā JVM nav jārada jauns string objekts un var vienkārši atgriezt esošo objektu. Lai to apstiprinātu, skatiet concat dokumentāciju.

Tātad, ja jums ir ļoti svarīga efektivitāte, tad, savienojot, iespējams, tukšas virknes, jums vajadzētu izmantot concat metodi, bet citos gadījumos izmantot +. Tomēr veiktspējas atšķirībai vajadzētu būt nenozīmīgai, un, iespējams, par to nevajadzētu uztraukties.

Komentāri (3)

Operators + var darboties starp virkni un virknes, rakstzīmju, veselu skaitli, divciparu vai pludiņskaitļa datu tipa vērtību. Tas tikai pārvērš vērtību tās virknes attēlojumā pirms apvienošanas.

Operatoru concat var izmantot tikai virknēm un tikai ar tām. Tas pārbauda datu tipu savietojamību un izmet kļūdu, ja tie nesakrīt.

Izņemot šo, jūsu sniegtais kods dara to pašu.

Komentāri (0)

Es tā nedomāju.

a.concat(b) ir implementēts string valodā, un, manuprāt, tā implementācija nav daudz mainījusies kopš agrīnajām java mašīnām. Operācijas + implementācija ir atkarīga no Java versijas un kompilatora. Pašlaik + tiek īstenots, izmantojot StringBuffer, lai operācija būtu pēc iespējas ātrāka. Iespējams, nākotnē tas mainīsies. Agrākās Java versijās `+`` operācija ar virknēm bija daudz lēnāka, jo tika radīti starprezultāti.

Domāju, ka +=`` ir ieviests, izmantojot+``, un līdzīgi optimizēts.

Komentāri (2)