Initialisation avec une chaîne vide vers une instance de type Java String

Quel est le type de chaîne après tout?

Je pensais juste que je prenais un bain. Dans le langage Java, les littéraux sont les valeurs de type primitif, de type String et de type nul exprimées directement dans le code. Les types primitifs ont des caractéristiques différentes des types de référence, "c'est pourquoi cela ne peut pas être aidé" (bien que vous ne devriez pas le dire), et les types nuls sont également "nuls", vous pouvez donc directement décrire et gérer ces données. Je peux être d’accord avec vous. Alors pourquoi y a-t-il un littéral uniquement pour String dans le type de référence? Pourquoi? Pourquoi est-ce sensuellement? J'ai pensé. Très bien, découvrons.

Mon environnement

Pour le moment, regardez le type String

C'est le début de toutes les erreurs, mais puisqu'il s'agit d'une chaîne «littérale» (signifiant «littéralement»), c'est la chaîne elle-même. Mais "vide". Pas nul, mais "vide". "Sky" est un concept assez important, n'est-ce pas? Je ne pense pas qu'il soit écrit que vous puissiez comprendre pourquoi le littéral de chaîne a été préparé même si vous allez voir la classe String. Mais sans aucune réflexion, j'ai appuyé vaguement sur la touche F3 et suis allé voir la classe String. Bonjour. Une heure de mon mystère. La première chose qui saute

String.class


private final char value[];

Champ. Il s'agit d'un tableau invariant de valeurs char qui stocke des données de chaîne de type String. Puisque la séquence et le flux sont importants, cela s'appelle une séquence. J'ai appris au début que de nouvelles données seront générées lorsqu'elles seront nouvelles. C'est pourquoi vous pouvez utiliser StringBuilder pour les chaînes modifiables.

En regardant le début du grand nombre de constructeurs, cela ressemblait à "Ouais", et j'ai été surpris même maintenant.

String.class


public String() {
    this.value = "".value;
}

 
public String(String original) {
    this.value = original.value;
    this.hash = original.hash;
}

//Omis ci-dessous

Que se passe-t-il avec this.value =" ". Value;? est. Je vois qu'il est initialisé avec String str =" "; parce que c'est une chaîne de caractères vide, et je l'ai appris il y a longtemps et je l'utilise aussi, mais quand j'y pense, je pense que char c = ''; est impossible. .. N'est-il pas possible de créer une instance mais de ne pas attribuer de valeur initiale? ?? ??

Sample.java


String str = "";
System.out.println(str.length()); // 0
System.out.println(str.charAt(0)); // Exception!

Si vous y réfléchissez, la valeur initiale n'est pas incluse. Je peux le générer, mais il n'y a aucune valeur. J'ai rêvé qu'il contenait des données appelées une chaîne de caractères vide. Ce n'était pas le cas. Non, il y a un caractère qui n'est pas le caractère "vide", mais ce n'est pas un caractère même si la zone mémoire est sécurisée. Puisque les données sous forme de caractères sont "vides", la zone de mémoire est sécurisée même si la longueur de la chaîne de caractères est égale à 0. Il y a, mais il n'y a pas de concept de «vide». C'est profond. String.charAt () vient de cesser de chuchoter StringIndexOutOfBoundsException. Très bien, relancez le défi.

Sample.java


String str = "I love you.";
System.out.println(str.length()); // 11
str = "I love you." + "";
System.out.println(str.length()); // 11

Ouais, la longueur de la chaîne ne change pas. Bien sûr. Parce que c'est "vide". Je suis soudainement revenu à moi-même ici. Par exemple, Point p = new Point (); peut être défini avec une valeur initiale de 0 pour x et y car ce n'est pas une séquence.

séquence

La classe String implémente CharSequence, tout comme StringBuilder et StringBuffer. Donc, s'ils créent une instance sans rien donner à l'argument, seule la zone où placer les données est sécurisée, et c'est la caractéristique du tableau lui-même. C'est un peu différent de String, mais je ne savais pas pourquoi je ne pouvais pas simplement le générer. J'écris ceci dans l'agonie. La collection est également différente d'un tableau, mais d'abord une instance du framework lui-même telle que List est créée et les données sont entrées plus tard. Même s'il s'agissait d'une chaîne de caractères vide, je ne me sentais pas détendu que la chaîne de caractères serait une chaîne de caractères (certaines données importantes). Pourquoi l'as-tu oublié? La fondation de la fondation est importante, n'est-ce pas? J'étais parfaitement conscient. En même temps, j'ai ressenti la plus grande déception pour moi-même en ce siècle.

Importance de l'initialisation d'une chaîne vide d'une instance de type String

Je pense que l'initialisation consiste à attribuer une valeur avec une déclaration. Même si les données d'une chaîne de caractères claire ne peuvent pas être affectées, les informations d'une instance de String sont générées et complétées, donc je pense que l'initialisation est une initialisation, mais grâce au merveilleux concept de "vide" Je pense qu'il contient une certaine complexité d'initialisation que d'autres instances n'ont pas. Eh bien, comme une chaîne de caractères vide est le littéral d'une chaîne de caractères, il peut être significatif d'avoir des informations indiquant qu'il s'agit d'un type de chaîne de caractères (type String), mais j'ai été convaincu par le passé. Une des implications de l'attribution d'une chaîne vide pour "réduire le risque d'une exception due à null" (que je savais) n'est pas tout à fait maintenant. Est-ce parce que facultatif est maintenant disponible? Cependant, l'utilisation est étrange, comme facultative pour initialiser une instance à l'aide d'une chaîne littérale. Je pense que Optional peut être utilisé correctement lorsque la valeur de retour d'une méthode est censée être nulle. Je ne suis pas reconnaissant pour un tel endroit. Au contraire, c'est juste ennuyeux. Si vous utilisez Eclipse, vous vous fâcherez comme un démon si vous essayez d'utiliser une variable avant qu'elle ne soit initialisée, et il semble inutile de l'initialiser avec une chaîne de caractères nulle ou vide. Je remplace une chaîne de caractères vide avec le sentiment qu'il est désagréable de simplement déclarer et de ne plus entrer de valeur. null peut être initialisé, mais il est nul (rien, pas de référence), donc cela ressemble à une merde. C'est mauvais.

Toujours de la même manière (post-scriptum 2017-1-24)

@hiuchida a commenté que le plaisir de ne pas séparer null et non nul est merveilleux. Je publierai l'exemple tel quel.

String empty = "";
for (char ch : empty.toCharArray()) {

Certes, il est fatiguant de toujours être conscient de null ou non-null. Comme vous l'avez dit, le point de vue que vous pouvez vous amuser est également merveilleux.

C'était gudaguda, mais je vais le laisser tel quel comme commandement de ne pas être repris par le même "pourquoi?" Ensuite, nous nous sommes lancés dans un voyage pour trouver une manière saine d'utiliser des cordes vides.

Conclusion

Ce que j'ai juré à mon coeur

Recommended Posts

Initialisation avec une chaîne vide vers une instance de type Java String
À propos des instances Java
[Java] Comment convertir un élément d'un tableau de type String en type Int
[Java] Comparaison correcte du type String
[Java] Convertit null du type Object en type String
Conversion de type du type java Big Decimal au type String
Initialisation de for Essayez de changer le problème Java en TypeScript 5-4
J'étais accro à getXxxx de ResultSet car c'est un type primitif (Java)
[Java] Interdit d'utiliser un seul type d'alphabet FizzBuzz [Binding]
Une version Java non prise en charge Comment se débarrasser des erreurs
Comment utiliser le modèle entraîné Tensorflow 2.0 avec Kotlin / Java
Java pour jouer avec Function
[Java] Un type d'alphabet interdit Avec reliure Bonjour tout le monde! [Reliure]
Déployez des applications Java développées localement avec Cloud Toolkit sur des instances Alibaba Cloud ECS
Convertir le type String en type Timestamp
[Java] Pour connaître les informations de type des paramètres de type à l'exécution
Connectez-vous à DB avec Java
Connectez-vous à MySQL 8 avec Java
Qu'advient-il des variables d'instance lors de la copie d'une instance avec ruby
J'ai essayé de convertir une chaîne de caractères en un type LocalDate en Java
Pour recevoir une demande vide avec Spring Web MVC @RequestBody
Comment gérer les instances
Comment développer une application avec l'API Jersey Java RESTful sur une instance Alibaba Cloud ECS
Assurez-vous de comparer le résultat Java compareTo avec 0
[Introduction à Java] Gestion des chaînes de caractères (classe String, classe StringBuilder)
[Introduction à Java] À propos des variables et des types (déclaration de variable, initialisation, type de données)
Une histoire sur la connexion à un serveur CentOS 8 avec un ancien Ansible
L'histoire de toString () commençant par le passage d'un tableau à System.out.println
Convertir un tableau de chaînes en une liste d'entiers en Java
J'ai essayé de créer une application Android avec MVC maintenant (Java)
J'ai essayé de résumer les méthodes de Java String et StringBuilder
[Java] Comment convertir du type String en type Path et obtenir le chemin
Comment vérifier le contenu de la chaîne de caractères java de longueur fixe
Comment obtenir la longueur d'un fichier audio avec Java
[Java] Comparaison de vitesse de combinaison de chaînes
Créer une classe immuable avec JAVA
Java pour apprendre avec les ramen [Partie 1]
Osez défier Kaggle avec Java (1)
J'ai essayé d'interagir avec Java
Java, des tableaux pour débuter avec les débutants
Exécuter des applications écrites en Java8 en Java6
Comment utiliser le type enum Java
[Introduction à la table des matières Java] J'ai comparé Java avec d'autres langages (type d'interpréteur, type de compilateur, type dynamique, type statique)
[Java] Affiche le résultat de ffprobe -show_streams dans JSON et mappe-le à un objet dans Jackson
[Java] Comment transformer un tableau à deux dimensions avec une instruction for étendue
Utiliser un bloc d'initialisation statique pour initialiser la liste / l'ensemble de champs statiques en Java
Comment convertir un tableau de chaînes en un tableau d'objets avec l'API Stream
Obtenez le type d'un élément d'un tableau pour déterminer s'il s'agit d'un tableau
[Java] Comment utiliser une sous-chaîne pour découper une partie d'une chaîne de caractères
[Java] [ibatis] Comment obtenir des enregistrements de relation 1 à N avec List <Map <>>
[Java] Comment accéder au début d'une chaîne spécifique à l'aide de la classe String
Mémo: [Java] Identifiez les fichiers dont la date de mise à jour est inférieure ou égale à 1 jour
Je veux ForEach un tableau avec une expression Lambda en Java
Pratique des bases de la programmation Java - Je veux afficher un triangle avec une instruction for ②
Comment créer une application avec un mécanisme de plug-in [C # et Java]
<Java> Quiz pour convertir par lots les noms de fichiers séparés par une chaîne de caractères spécifique avec une partie du nom de fichier
Comment recadrer une image avec libGDX
[Java] Conversion de type implicite (somme AOJ10 de nombres)
Créons vous-même une instance avec .new. .. ..