[Java] Je me sentais comme un débutant en java. "Pourquoi le premier caractère est-il en majuscule uniquement dans le type String?" J'ai fait face au type String.

introduction

Ceci est un mémo de ce que j'ai appris pour approfondir ma compréhension de la façon de gérer le type String pendant que j'apprenais à acquérir la qualification java silver. Je vous serais reconnaissant si vous pouviez signaler les erreurs d'interprétation.

Le type de chaîne semble être un type de référence, pas un type de données de base

Lors de la définition de la variable, j'ai spécifié le type de données tel que «int »,« double »,« boolean »,« char »et j'ai défini la variable. Lors de la définition d'une variable qui gère les chaînes de la même manière, il était tout à fait naturel de spécifier le type String et de définir la variable.

Comme ça ↓

Définition variable.java


int i = 100
 // ->Remplacez l'entier 100 par le type int qui peut gérer les entiers
char c = 'Ah'
 /* ->Type de caractère pouvant gérer les caractères`Ah`Remplacer
Pour le type char, guillemets simples au lieu de guillemets doubles*/
double d = 10.0
 // ->10 pour "type virgule flottante" qui peut gérer les points décimaux.Remplaçant 0
String s = "C'est une chaîne de caractères."
 /* ->Type de chaîne qui peut gérer les chaînes de caractères"C'est une chaîne de caractères."Remplacer
Guillemets doubles au lieu de guillemets simples pour String*/

Cependant, je me suis toujours demandé. C'est ** "Pourquoi seul le type String commence-t-il par une majuscule?" **

Il existe des types de données de base et des types de référence

** "Pourquoi est-ce que seul le type String commence par une majuscule?" ** La réponse était que le type String n'est ** pas un type de données de base **. En d'autres termes, le ** type String était une classe **. Bien sûr, la première lettre de la classe est en majuscule, je vois! Je suis convaincu.

Jetez un œil à l'intérieur de la classe String

String est une classe. Si tel est le cas, vous pouvez voir le contenu. Ainsi, en regardant le contenu de la classe String, l'un des champs d'instance a cette définition.

String.java


private final char value[];

Ceci est un tableau de type de données de base «char type»! Ainsi, il semble que l'identité de String était un ensemble de tableaux de type de données de base «char type». En d'autres termes, String s =" est une chaîne. " Défini précédemment dans Variable definition.java.

private final char value[] = {'Phrase','Personnage','Colonne','alors','Su','。'}

C'était ça.

Il semble qu'il existe non seulement des types String mais également des types StringBuilder.

Si vous procédez à un apprentissage comme celui-ci, il existe également un StringBuilder autre que String.

Quelle est la différence?

C'est ce que je comprends à ce stade.

Type de chaîne Type de StringBuilder
Déclaration des variables Peut être sans nouveau Vous ne pouvez pas le déclarer sans utiliser de nouveau
Réaffecter à la variable La destination de référence change Réécrire le contenu

~~ Il ne suffisait pas d'en faire une table ... ~~

Comme pour la façon dont les données sont gérées, les classes sont différentes en premier lieu, et les méthodes fournies sont également différentes.

Déclaration des variables

La méthode de définition des variables est décidée entre String et StringBuilder.

Définition variable.java


String a = "AIUEO"; // ->ça peut
String b = new String("Kakikukeko");  // ->ça peut
StringBuilder c = "SA Shi Su Se So"; // ->Ne peux pas
StringBuilder d = "TA Chi Tsu Te à"; // ->ça peut

Quelle est la différence entre la méthode de déclaration de type String?

Il semble que la manière de gérer les chaînes de caractères soit différente. Si new n'est pas utilisé, une chaîne de caractères sera préparée pour la zone gérée par la classe String. Si vous utilisez new, une chaîne de caractères sera créée séparément de la zone gérée par la classe String.

Ainsi, même s'il s'agit du même type String, si vous le définissez avec new, il semble qu'une variable String d'un loup soit créée. Vous pouvez probablement imaginer en quoi ce sera différent en utilisant la méthode intern () de la classe String. (Voir ci-dessous)

À propos de la réaffectation aux variables

"Vous ne pouvez pas réattribuer à une variable? Non. Vous pouvez!" Ceux qui le pensent. n'est-ce pas. J'ai l'impression que c'est définitivement fait

Réaffectation variable.java


String a = "AIUEO";
a = "Kakikukeko";
// ->Le contenu d'un"Kakikukeko"devenir

Cependant, ceci n'est pas réécrit, mais il semble que la destination de référence de a soit ** basculée de "aiueo" à "kakikukeko" **.

Donc, à proprement parler, il n'est pas réécrit, mais commuté. il semble que.

À propos de la comparaison des types de chaînes

Je pense qu'il peut être nécessaire de comparer les chaînes de type String pour l'implémentation. Dans un tel cas, il est courant d'utiliser l'opérateur de comparaison, mais dans le cas du type String, utilisez la méthode ʻequals () `au lieu de l'opérateur de comparaison.

Est-ce Naze?

De la conclusion, il semble que l'opérateur de comparaison ** compare le référent **. Pour le dire plus simplement, s1 et s2 sont les mêmes "aiueo", mais lorsque s1 == s2, cela devient faux dans certains cas.

Comparaison de chaînes avec opérateur de comparaison.java


package sample20200728;

public class Sample02 {
    public static void main(String[] args){
        String s1 = new String("Ah");
        String s2 = "Ah";
        String s3 = "Ah";

        //Comparez s1 et s2 avec l'opérateur de comparaison
        if(s1 == s2){
            System.out.println("Les chaînes pour s1 et s2 sont les mêmes");
        }else{
            System.out.println("Les chaînes de caractères de s1 et s2 sont différentes");
        }

        //Comparez s1 et s3 avec l'opérateur de comparaison
        if(s1 == s3){
            System.out.println("Les chaînes pour s1 et s3 sont les mêmes");
        }else{
            System.out.println("Les chaînes de caractères de s1 et s3 sont différentes");
        }

        //Comparez s2 et s3 avec l'opérateur de comparaison
        if(s2 == s3){
            System.out.println("Les chaînes pour s2 et s3 sont les mêmes");
        }else{
            System.out.println("Les chaînes de caractères de s2 et s3 sont différentes");
        }
    }
}

** Résultat de sortie ** スクリーンショット 2020-07-28 23.21.44.png Les chaînes sont les mêmes, mais certaines sont différentes. A été refusé. Cela semble être un opérateur de comparaison qui compare les référents sans comparer les chaînes.

Je pense que c'est bien pour décider si les sources de référence sont les mêmes, mais compte tenu de l'opération réelle, si les chaînes de caractères correspondent. Vérifiez-vous souvent? Je pense. Dans ce cas, si false est renvoyé car la source de référence est différente même si les chaînes de caractères sont identiques, cela provoquera un bogue, non?

Je me fiche des détails. Tout ce que vous avez à faire est de faire correspondre les chaînes! La méthode masculine equals () est active.

equals()Comparaison dans.java


public class Sample02 {
    public static void main(String[] args){
        String s1 = new String("Ah");
        String s2 = "Ah";
        String s3 = "Ah";

        //Comparez s1 et s2 avec la méthode égale
        if(s1.equals(s2)){
            System.out.println("Les chaînes pour s1 et s2 sont les mêmes");
        }else{
            System.out.println("Les chaînes de caractères de s1 et s2 sont différentes");            
        }

        //Comparez s1 et s3 avec la méthode égale
        if(s1.equals(s3)){
            System.out.println("Les chaînes pour s1 et s3 sont les mêmes");
        }else{
            System.out.println("Les chaînes de caractères de s1 et s3 sont différentes");            
        }

        //Comparez s2 et s3 avec la méthode égale
        if(s2.equals(s3)){
            System.out.println("Les chaînes pour s2 et s3 sont les mêmes");
        }else{
            System.out.println("Les chaînes de caractères de s2 et s3 sont différentes");            
        }
    }
}

** Résultat d'exécution ** スクリーンショット 2020-07-28 23.24.06.png

Ouaip. Ils comparent bien les chaînes de caractères!

Méthode stagiaire bonus

La classe String a une méthode interne. La description de la méthode disait: «Renvoie une chaîne unique dans le pool de chaînes». En japonais k.

Mais je pensais que cela apparaîtrait dans le test java.

J'ai écrit le code source pour comprendre la méthode interne

"Renvoyer la chaîne de caractères de premier rang dans le pool de chaînes de caractères" ne m'est pas du tout venu à l'esprit, alors j'ai en fait écrit la source et vérifié le comportement.

Ce que je pourrais comprendre, c'est comme ça

  1. La méthode intern () vérifie si la chaîne de caractères cible existe dans la zone du type String. ʻS'il y a la même chaîne-> Reportez-vous-y. ** Image réutilisable ** ʻS'il n'y a pas la même chaîne de caractères-> Préparez la chaîne de caractères dans la zone du type String.
  2. Si vous définissez une valeur en utilisant new lors de la définition d'une variable de type chaîne, elle sera hors de la juridiction de la zone de type chaîne. -> Intenr () ne peut pas être utilisé pour rendre la source de référence identique

intern().java


public class Sample01 {
    public static void main(String[] args){

        String s1 = new String("tester"); //Zone de classe de type String"À l'extérieur"Avec variable s1"tester"Créer
        String s2 = s1.intern();  /* s1.intern()De la valeur de retour de"tester"Est affecté à s2.
Cependant, comme s1 est créé avec new, il s'agit d'une chaîne de caractères créée en dehors de la zone de la classe de type String, elle se trouve donc à l'intérieur de la classe de type String."tester"N'existe pas.
Dans ce cas, stagiaire()Dans la zone de la classe de type String au moment de l'utilisation"tester"Préparez la chaîne de caractères*/
        String s3 = "Mumumu"; //Zone de classe de type String"À l'intérieur"Avec variable s3"Mumumu"Créer
        String s4 = s3.intern(); /*s3.intern()De la valeur de retour de"Mumumu"Est affecté à s3.
Contrairement à s1, s3 est dans le domaine de la classe de type String"Mumumu"Je l'ai déjà fait"Mumumu"(C'est-à-dire non seulement la chaîne de caractères, mais également l'endroit auquel se référer)*/
        
        System.out.println("s1 est une variable utilisant new" + s1);
        System.out.println("s2 est s1.intern()Variable à laquelle la valeur de retour de" + s2);
        System.out.println("s3 est\"Mumumu\"Variable à laquelle" + s3);
        System.out.println("s4 est s3.intenr()Variable à laquelle la valeur de retour de" + s4);   

        //Fabriqué avec du neuf"tester"Et s1.intern()Fabriqué avec"tester"Comparer
        if(s1 == s2){
            System.out.println("true:Les références pour s1 et s2 sont les mêmes");
        }else{
            //Puisque la destination de référence de s1 et s2 est différente, elle devient fausse
            System.out.println("false:Les références pour s1 et s2 sont différentes");
        }

        //S3 préparé en utilisant la zone gérée par le type String"Mumumu"Et s3.intern()Ramassé à"Mumumu"Comparez S4 avec
        if(s3 == s4){
            //s3,Les deux s4 sont générés à partir de la zone de type String, pour s4 s3.intern()Est attribué en se référant à la chaîne de caractères de s3
            System.out.println("true:Les références pour s3 et s4 sont les mêmes");
        }else{
            System.out.println("false:Les références pour s3 et s4 sont différentes");
        }

        /*s2 est"tester"Est créé dans la zone de la classe de type String
Par conséquent, s5= s2.intern()Ensuite, s5 fera référence à la même chose que s2.*/
        String s5 = s2.intern();

        //Vérifiez si les référents de s2 et s5 sont les mêmes
        if(s2 == s5){
            //s2.intern()Puisqu'il est attribué à s5 using, la source de référence est la même.
            System.out.println("true:Les références pour s2 et s5 sont les mêmes");
        }else{
            System.out.println("false:Les références pour s2 et s5 sont différentes");
        }
        System.out.println("============");
    }
}

** Résultat d'exécution ** スクリーンショット 2020-07-28 22.55.05.png

Peu importe la façon dont vous luttez, s1 défini dans new sera hors du groupe.

fin

Ce qui précède est le contenu faisant face au type String. Il y a beaucoup de choses que je n'ai pas encore comprises, donc je suis sûr qu'il y a des malentendus. Dans ce cas, nous vous prions de nous excuser pour la gêne occasionnée, mais nous vous serions reconnaissants de bien vouloir nous le signaler.

Alors merci m (_ _) m

Recommended Posts

[Java] Je me sentais comme un débutant en java. "Pourquoi le premier caractère est-il en majuscule uniquement dans le type String?" J'ai fait face au type String.
[Supprimer la première lettre de la chaîne de caractères] Ruby
Je veux trouver la somme de contrôle MD5 d'un fichier en Java et obtenir le résultat sous forme de chaîne de caractères en notation hexadécimale.
J'ai essayé de convertir une chaîne de caractères en un type LocalDate en Java
[Java débutant] Conversion d'une chaîne de caractères en valeur numérique - Quelle est la méthode parseInt de la classe Integer? ~
J'ai essayé le type d'entrée / sortie de Java Lambda ~ Map edition ~
J'ai essayé de résumer les méthodes de Java String et StringBuilder
Comment vérifier le contenu de la chaîne de caractères java de longueur fixe
Pourquoi le modèle NullObject est inapproprié et Either est approprié comme méthode d'expression de l'échec
[Java] Comparaison correcte du type String
J'ai lu la source de String
[Servlet Java] La route de Senri est aussi la cinquième étape d'une étape
[Servlet Java] La route de Senri est également une étape vers la première
[Servlet Java] La route de Senri est aussi la troisième étape de la première étape
[Java] Comment accéder au début d'une chaîne spécifique à l'aide de la classe String
[Servlet Java] La route de Senri est aussi la quatrième étape de la première étape
[Java] Vérifiez si la chaîne de caractères est composée uniquement de blancs (= Vierge)
[jour: 5] J'ai résumé les bases de Java
[Java] Comment convertir un élément d'un tableau de type String en type Int
[Java] Différence entre equals et == dans une chaîne de caractères qui est un type de référence
Si le produit total des n premiers nombres premiers plus 1 est un nombre premier
[Java] Lors de la mise d'une chaîne de caractères dans le cas de l'instruction switch, il est nécessaire d'en faire une expression constante
Même si je souhaite convertir le contenu d'un objet de données en JSON en Java, il existe une référence circulaire ...