Cet article étudie principalement la question de la création d'objets dans Java String, comme suit.
Tout d'abord, nous devons comprendre deux concepts: référencer les variables et les objets. Les objets sont généralement créés dans le tas via nouveau, et la chaîne n'est qu'une variable de référence.
Toutes les chaînes sont des objets de chaîne. En raison de la grande quantité d'utilisation des constantes de chaîne, afin de gagner du temps en Java, dans l'étage de compilation, toutes les constantes de chaîne seront placées dans le pool constant de chaîne. Un avantage du pool constant de chaîne est que la même chaîne peut être fusionnée et occupée un espace.
Bien que l'adresse d'une variable ne puisse pas être directement obtenue en Java, vous pouvez utiliser == pour déterminer si les deux variables de référence pointent vers une adresse, c'est-à-dire un objet.
| Empiler la mémoire | Mémoire de tas |
|---|---|
| Type de base, référence d'objet (adresse de mémoire du tas) | Objets et tableaux créés par nouveau |
| Vitesse d'accès rapide | Mémoire plus lente que pile |
| La taille des données doit être déterminée pendant le cycle de déclaration | La mémoire allouée est gérée par le collecteur de déchets automatique de la machine virtuelle Java. Taille de la mémoire allouée dynamiquement |
| Fonctionnalités partagées, s'il y a une chaîne dans la pile, elle sera référencée directement; Sinon, ouvrez un nouvel espace pour stocker la valeur | Chaque nouveau génère un nouvel objet dans la mémoire du tas. Aucune réutilisation n'existe |
package com.demo.test; import java.lang.reflect.field; classe publique StringDemo {public static void main (string [] args) {// recherche d'abord si cet objet de chaîne existe en mémoire. S'il existe, indiquez cet objet de chaîne; String str1 = "ABC"; String str2 = "ABC"; / * public String toString () {return this; } * / String str3 = "abc" .toString (); // Peu importe si cet objet de chaîne existe déjà en mémoire, un nouvel objet sera créé. String str4 = new String ("ABC"); String str5 = new String ("ABC"); String str6 = str5; String str7 = "a" + "b" + "c"; String str8 = "a" + "b" + nouvelle chaîne ("c"); // String est un objet String immuable, StringBuilder et StringBuffer sont des objets de chaîne de variables (la longueur du tableau de caractères à l'intérieur est la variable), StringBuffer est thread-safe, StringBuilder n'est pas une chaîne thread-safe str9 = new StringBuilder (). String str10 = new StringBuffer (). APPEND ("A"). APPEND ("B"). APPEND ("C"). TOSTRING (); System.out.println ("---------> =="); System.out.println ("---> 1"); System.out.println (str1 == str2); // true System.out.println ("---> 3"); System.out.println (str3 == str1); // true System.out.println ("-> 4"); System.out.println (str4 == str1); // false System.out.println (str4 == str3); // false System.out.println (str4 == str5); // false system.out.println (str4 == str6); // false system.out.println ("---> 7"); System.out.println (str7 == str1); // true System.out.println (str7 == str3); // true system.out.println (str7 == str4); // false system.out.println ("---> 8"); System.out.println (str8 == str1); // false System.out.println (str8 == str3); // false System.out.println (str8 == str4); // false System.out.println (str8 == str7); // false System.out.println (str8 == Str7); // false System.out.print. System.out.println (str9 == str1); // false System.out.println (str9 == str3); // false System.out.println (str9 == str4); // false System.out.println (str9 == str7); // false System.out.println (str9 == Str8); // false System.out.Printl (")"); System.out.println (str10 == str1); // false System.out.println (str10 == str3); // false system.out.println (str10 == str4); // false system.out.println (str10 == str7); // false System.out.println (str10 == Str8); // FAUX System.out.println (str10 == str9); // false System.out.println ("--------> égal"); System.out.println (str1.equals (str4)); // true System.out.println (str1.equals (str7)); // true System.out.println (str1.equals (str8)); // true System.out.println ("---------> hashcode"); / * HashCode Calcul Formula: S [0] * 31 ^ (n-1) + s [1] * 31 ^ (n-2) + ... + s [n-1] Par conséquent, le hashcode est le même, et il est le même à chaque fois qu'il exécute * / System.out.println (str1.hashcode ()); // 96354 System.out.println (Str2.hashcode ()); System.out.println (str3.hashcode ()); System.out.println (str4.hashcode ()); System.out.println (str5.hashcode ()); System.out.println (str6.hashcode ()); System.out.println (str7.hashcode ()); System.out.println ("--------> Valeur de modification normale"); // String est une classe immuable. La chaîne pointe uniquement vers une référence dans la mémoire du tas. Il stocke l'adresse de l'objet dans le tas, pas l'objet lui-même. L'attribution d'une valeur à une chaîne est juste de modifier son objet de référence au lieu de l'objet lui-même str6 = "123"; System.out.println (Str5); // ABC System.out.println (str6); // 123 System.out.println ("--------> refléter la valeur de changement"); / * Si vous devez modifier la valeur de la chaîne, ce n'est pas impossible. Seule la réflexion peut être utilisée. La chaîne de classe finale publique implémente java.io.serializable, comparable <string>, chardequence {// La valeur est utilisée pour le stockage des caractères. Valeur charbon finale privée []; …} * / Str6 = str5; try {field field = string.class.getDeclaredField ("Value"); // Field Field = str6.getClass (). GetDeclaredField ("Value"); if (! field.isaccessible ()) {field.setAccessible (true); } char [] value = (char []) field.get (str6); valeur [0] = '0'; System.out.println (str5); // 0bc System.out.println (str6); // 0bc} catch (NosuchFieldException | SecurityException | IllégalArgumentException | illégalaccessException e) {e.printStackTrace (); } System.out.println ("-------> obj.toString ()"); Objet obj = nouveau objet (); / * public String toString () {return getClass (). getName () + "@" + integer.tohexString (hashcode ()); } * / System.out.println (obj.toString ()); // java.lang.object@15db9742 String [] arr1 = {"0"}; String [] arr2 = {"0"}; System.out.println (arr1.equals (arr2)); // false}}Résumer
Ce qui précède concerne l'analyse des instances de création de création de chaînes Java, et j'espère que cela sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à d'autres sujets connexes sur ce site. S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!