73 votes

Est « new String() » immuables ainsi ?

J'ai étudié Java Chaîne pendant un certain temps. Les questions suivantes sont basées sur les postes ci-dessous

Java Chaîne est spécial
L'immuabilité de la Chaîne string en java

  1. L'immuabilité: Maintenant, en passant par l'immutabilité, la classe String a été conçu de telle sorte que les valeurs dans la commune de piscine peuvent être réutilisés dans d'autres endroits/les variables. Ce qui est vrai si l' String a été créé comme

    String a = "Hello World!"; Cependant, si je crée la Chaîne

    String b = new String("Hello World!"); pourquoi est-ce immuables? (ou est-il?). Depuis cela a un segment dédié mémoire, je devrais être en mesure de modifier ce sans préjudice de tout autre variable. Donc, de par sa conception, avait-il une autre raison pourquoi String ensemble est considéré comme immuable? Ou est mon hypothèse ci-dessus le mal?

  2. Deuxième chose que je voulais poser est sur la commune de la chaîne de la piscine. Si je crée un objet de type string comme

    String c = ""; est une entrée vide créé dans la piscine?

Est-il un post déjà sur ces? Si oui, quelqu'un pourrait-il partager le lien?

105voto

Stephen C Points 255558

new String() est une expression qui produit une String ... et un String est immuable, peu importe comment il est produit.

(En demandant si new String() est mutable ou pas, c'est absurde. C'est le code de programme, pas une valeur. Mais je suppose que ce n'est pas vraiment ce qu'on voulait dire.)


Si je crée un objet de type string comme String c = ""; est une entrée vide créé dans la piscine?

Oui, c'est, une entrée est créée pour la chaîne vide. Il n'y a rien de spécial au sujet d'un vide String.

(Pour être pédant, la piscine d'entrée de "" est créée, longtemps avant que votre code est exécuté. En fait, il est créé lorsque votre code est chargé ... ou peut-être même plus tôt que cela.)


Donc, j'ai voulu savoir si le nouveau segment de l'objet est immuable, ...

Oui, il est. Mais l'immutabilité est une propriété fondamentale des objets String. Tous String objets.

Vous le voyez, l' String API n'est tout simplement pas fournir toutes les méthodes pour modifier un String. Donc (en dehors de quelques dangereux et insensé1 astuces en utilisant la réflexion), vous ne pouvez pas muter un String.

et si oui, quel était le but?.

La raison en est que Java String est conçu comme un immuable de la classe, c'est la simplicité. Il le rend plus facile d'écrire des programmes corrects, et de lire / raison à propos d'autres personnes de code si la base de la chaîne de la classe fournit un immuable de l'interface. (Ou au moins, qui est la raison de cette décision de conception, tel que je le comprends.)

En fonction de la réponse, je suppose que d'autres références à la même variable est l'une des raisons. S'il vous plaît laissez-moi savoir si je suis en droit de le comprendre.

Pas de. Il est plus fondamental que cela. Simplement, tout String des objets sont immuables. Il n'est pas compliqué cas particulier de raisonnement nécessaires pour comprendre le présent. Il vient de >>est<<.

Pour l'enregistrement, si vous voulez un mutables "chaîne comme" objet en Java, vous pouvez utiliser StringBuilder ou StringBuffer. Mais ce sont les différents types de Chaîne.


1 - La raison pour laquelle ces astuces sont (OMI) dangereux et stupide, c'est qu'ils affectent les valeurs de chaînes qui sont potentiellement partagées par d'autres parties de votre application via la chaîne de la piscine. Cela peut provoquer le chaos ... dans les moyens que le gars à côté, le maintien de votre code a peu de chance de la traque.

42voto

Narendra Pathai Points 12172

String est immuable indépendamment de la façon dont il est instancié

1) réponse Courte est oui, new String() est immuable.

Parce que chaque mutable opération (comme replace,toLowerCase etcetra) que vous effectuez sur String n'affecte pas l'original, String de l'instance et vous renvoie une nouvelle instance.

Vous pouvez le vérifier dans la Javadoc pour String. Chaque public méthode de String qui est exposé renvoie un nouveau String exemple et de ne pas modifier la présente instance à laquelle vous avez appelé la méthode.

C'est très utile, dans un environnement Multi-thread que vous n'avez pas à penser à la mutabilité (quelqu'un va modifier la valeur) chaque fois que vous passez ou de partager l' String autour de. String peut facilement être le plus utilisé type de données, de sorte que les concepteurs ont bénédiction pour nous tous de ne pas penser à la mutabilité, à chaque fois, et nous a fait économiser beaucoup de douleur.

L'immutabilité autorisée de la Chaîne de la piscine ou de la mise en cache

C'est à cause de l'immutabilité de la propriété que la piscine interne de la chaîne a été possible, comme lors de la même Chaîne de valeur est nécessaire à un autre endroit alors que immuables de référence est retourné. Si String aurait été mutable, il n'aurait pas été possible de partager, Strings de ce genre pour économiser de la mémoire.

Chaîne immutablity n'était pas à cause de la mise en commun, mais l'immuabilité a plus d'avantages attachés à elle.

Chaîne de stage ou de mise en commun est un exemple de la Mouche modèle de Conception

2) Oui, il sera interné comme n'importe quel autre String comme un vide String est aussi un String autres String des cas.

Références:

18voto

chrylis Points 22655

Les bibliothèques Java sont optimisés autour de la contrainte que tout String objet est immuable, indépendamment de la façon dont cet objet est construit. Même si vous créez vous - b l'aide new, autre code que vous passez cette instance à la volonté de traiter la valeur comme immuable. Ceci est un exemple de la Valeur de l'Objet modèle, et tous les avantages (fil de sécurité, pas besoin de faire des copies privées) s'appliquent.

La chaîne vide "" est légitime String objet tout comme toute autre chose, il arrive juste ne pas avoir de contenu, et depuis toutes constante à la compilation des chaînes sont internés, je vais garantissent pratiquement que certains de la bibliothèque d'exécution a déjà causé qu'il soit ajouté à la piscine.

14voto

Cubic Points 5227

1) La partie immuable n'est pas à cause de la piscine; il fait juste de la piscine possible en premier lieu. Les chaînes sont souvent passés en argument à une autre fonction ou même partagé avec d'autres threads; Fabrication de Chaînes immuable était une décision de conception pour faire de raisonnement dans de telles situations plus facile. Donc, oui - Strings en Java sont toujours immuable, peu importe comment vous les créer (notez qu'il est possible d'avoir mutable chaînes de caractères en java tout simplement pas avec l' String de la classe).

2) Oui. Probablement. Je ne suis pas sûr à 100%, mais cela devrait être le cas.

7voto

venergiac Points 2905

De la Java Oracle de la documentation:

Les chaînes sont constants; leurs valeurs ne peuvent pas être modifiés une fois qu'ils sont créée.

Et encore:

Chaîne de tampons de soutien mutable cordes. Car Les Chaînes De Caractères les objets sont immuables, elles peuvent être partagées.

De manière générale: "tous les primitifs" (ou connexes) de l'objet sont immuables (s'il vous plaît, acceptez mon manque de formalisme).

Related post sur Stack Overflow:

À propos de l'objet de la piscine: pool d'objet java est l'optimisation qui n'est PAS liée à l'immuable.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X