Pourquoi SsortingngBuilder quand il y a Ssortingng?

Je viens de rencontrer SsortingngBuilder pour la première fois et j’ai été surpris car Java possède déjà une classe Ssortingng très puissante qui permet l’ajout.

Pourquoi une deuxième classe de Ssortingng ?

Où puis-je en savoir plus sur SsortingngBuilder ?

Ssortingng n’autorise pas l’ajout. Chaque méthode que vous appelez sur une Ssortingng crée un nouvel object et le renvoie. C’est parce que Ssortingng est immuable – il ne peut pas changer son état interne.

D’autre part, SsortingngBuilder est mutable. Lorsque vous appelez append(..) il modifie le tableau de caractères interne plutôt que de créer un nouvel object chaîne.

Il est donc plus efficace d’avoir:

 SsortingngBuilder sb = new SsortingngBuilder(); for (int i = 0; i < 500; i ++) { sb.append(i); } 

plutôt que str += i , ce qui créerait 500 nouveaux objects ssortingng.

Notez que dans l'exemple, j'utilise une boucle. Comme le note helios dans les commentaires, le compilateur traduit automatiquement les expressions comme Ssortingng d = a + b + c en quelque chose comme

 Ssortingng d = new SsortingngBuilder(a).append(b).append(c).toSsortingng(); 

Notez également qu'il existe SsortingngBuffer en plus de SsortingngBuilder . La différence est que le premier a des méthodes synchronisées. Si vous l'utilisez comme variable locale, utilisez SsortingngBuilder . S'il arrive qu'il soit possible d'y accéder par plusieurs threads, utilisez SsortingngBuffer (c'est plus rare)

Voici un exemple concret sur pourquoi –

 int total = 50000; Ssortingng s = ""; for (int i = 0; i < total; i++) { s += String.valueOf(i); } // 4828ms StringBuilder sb = new StringBuilder(); for (int i = 0; i < total; i++) { sb.append(String.valueOf(i)); } // 4ms 

Comme vous pouvez le constater, la différence de performance est significative.

La classe Ssortingng est immuable alors que SsortingngBuilder est mutable.

 Ssortingng s = "Hello"; s = s + "World"; 

Le code ci-dessus créera deux objects car Ssortingng est immuable

 SsortingngBuilder sb = new SsortingngBuilder("Hello"); sb.append("World"); 

Le code ci-dessus ne créera qu’un seul object car SsortingngBuilder n’est pas immuable.

Leçon: Chaque fois qu’il est nécessaire de manipuler / mettre à jour / append Ssortingng plusieurs fois, choisissez SsortingngBuilder comme étant efficace par rapport à Ssortingng.

SsortingngBuilder est destiné à la création de chaînes. Plus précisément, en les construisant de manière très performante. La classe Ssortingng est bonne pour beaucoup de choses, mais elle a en fait des performances vraiment désagréables lors de l’assemblage d’une nouvelle chaîne à partir de parties de chaîne plus petites, car chaque nouvelle chaîne est une chaîne totalement réatsortingbuée. (C’est immuable ) SsortingngBuilder garde la même séquence en place et la modifie ( mutable ).

La classe SsortingngBuilder est mutable et contrairement à Ssortingng, elle vous permet de modifier le contenu de la chaîne sans avoir à créer d’autres objects Ssortingng, ce qui peut être un gain de performance lorsque vous modifiez fortement une chaîne. Il existe également un équivalent de SsortingngBuilder appelé SsortingngBuffer, qui est également synchronisé, ce qui en fait un outil idéal pour les environnements multithread.

Le plus gros problème avec Ssortingng est que toute opération que vous faites avec elle renverra toujours un nouvel object, par exemple:

 Ssortingng s1 = "something"; Ssortingng s2 = "else"; Ssortingng s3 = s1 + s2; // this is creating a new object. 

Efficacité.

Chaque fois que vous concaténez des chaînes, une nouvelle chaîne est créée. Par exemple:

 Ssortingng out = "a" + "b" + "c"; 

Cela crée une nouvelle chaîne temporaire, y copie “a” et “b” pour obtenir “ab”. Ensuite, il crée une autre nouvelle chaîne temporaire, copie “ab” et “c” pour y créer “abc”. Ce résultat est ensuite atsortingbué à out .

Le résultat est un algorithme de Schlemiel the Painter de complexité temporelle (quadratique) O (n²).

SsortingngBuilder , d’autre part, vous permet d’append des chaînes sur place, en redimensionnant la chaîne de sortie si nécessaire.

SsortingngBuilder est bon lorsque vous avez affaire à des chaînes plus grandes. Cela vous aide à améliorer les performances.

Voici un article que j’ai trouvé utile.

Une recherche rapide sur Google aurait pu vous aider. Maintenant, vous avez embauché 7 personnes différentes pour faire une recherche Google pour vous. 🙂

Pour être précis, SsortingngBuilder ajoutant toutes les chaînes est O (N) alors que l’ajout de Ssortingng est O (N ^ 2). En vérifiant le code source, ceci est réalisé en interne en conservant un tableau de caractères modifiable. SsortingngBuilder utilise la technique de duplication de longueur de tableau pour obtenir des performances O (N ^ 2) amputées , au risque de doubler la mémoire requirejse. Vous pouvez appeler sortingmToSize à la fin pour résoudre ce problème, mais généralement les objects SsortingngBuilder ne sont utilisés que temporairement. Vous pouvez encore améliorer les performances en fournissant une bonne estimation de la taille finale de la chaîne.

Java a Ssortingng, SsortingngBuffer et SsortingngBuilder:

  • Ssortingng: c’est immuable

  • SsortingngBuffer: Mutable et ThreadSafe

  • SsortingngBuilder: Mutable mais pas ThreadSafe, introduit dans Java 1.5

Chaîne par exemple:

 public class T1 { public static void main(Ssortingng[] args){ Ssortingng s = "Hello"; for (int i=0;i<10;i++) { s = s+"a"; System.out.println(s); } } } 

}

output: 10 chaînes différentes seront créées au lieu de 1 chaîne.

 Helloa Helloaa Helloaaa Helloaaaa Helloaaaaa Helloaaaaaa Helloaaaaaaa Helloaaaaaaaa Helloaaaaaaaaa Helloaaaaaaaaaa 

SsortingngBuilder par exemple: 1 seul object SsortingngBuilder sera créé.

 public class T1 { public static void main(Ssortingng[] args){ SsortingngBuilder s = new SsortingngBuilder("Hello"); for (int i=0;i<10;i++) { s.append("a"); System.out.println(s); } } } 
 int wiek = (int)roznica.TotalDays; public double GetRandomNumber(double minimum, double maximum) { Random random = new Random(); return random.NextDouble() * (maximum - minimum) + minimum; } SsortingngBuilder sb = new SsortingngBuilder(); sb.Append(producent + " " + kolor + " " + dataWaznosci.Date + " "); sb.Append(Ssortingng.Format(" {0:0.00} zł", ObliczCene())); return sb.ToSsortingng(); using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace kolos_grD { internal class CenaMinimalnaException:Exception { public CenaMinimalnaException(ssortingng exc) : base(exc) { } } } using System.Runtime.Serialization.Formatters.Binary; using System.IO; public void Zapisz(ssortingng nazwa) { BinaryFormatter bf = new BinaryFormatter(); FileStream fs = new FileStream(nazwa + ".bin", FileMode.Create); bf.Serialize(fs, this); fs.Close(); } public static Bank Odczytaj(ssortingng nazwa) { BinaryFormatter bf = new BinaryFormatter(); FileStream fs = new FileStream(nazwa + ".bin", FileMode.Open); Bank nowy = (Bank) bf.Deserialize(fs); Konto.current_numer_konta = nowy.lista_kont.Last().numer_konta; fs.Close(); return nowy; } public void Sortuj() { List pom = lista_kont.ToList(); pom.Sort(); LinkedList nowa_lista = new LinkedList(pom); lista_kont = nowa_lista; } public int CompareTo(Farba other) { return -this.ObliczCene().CompareTo(other.ObliczCene()); }