Heim Java javaLernprogramm Detaillierte Erläuterung des String-Konstantenpools in Java

Detaillierte Erläuterung des String-Konstantenpools in Java

Oct 16, 2018 pm 05:01 PM
java字符串

Dieser Artikel enthält eine detaillierte Erklärung des String-Konstantenpools in Java. Ich hoffe, dass er für Freunde hilfreich ist.

Als grundlegendster Referenzdatentyp stellen Java-Designer einen String-Konstantenpool zur Verfügung, um dessen Leistung zu verbessern. Was ist also das spezifische Prinzip des String-Konstantenpools? Wir haben die folgenden drei Fragen: Um den String-Konstanten-Pool zu verstehen:

Was ist die Entwurfsabsicht des String-Konstanten-Pools?

Wo ist der String-Konstantenpool?

Wie betreibe ich den String-Konstantenpool?

Die Designidee des String-Konstantenpools

a Die Zuweisung von Strings ist wie andere Objektzuweisungen zeitaufwändig Da es sich um den grundlegendsten Datentyp handelt, ist es teuer, häufig eine große Anzahl von Zeichenfolgen zu erstellen, was sich stark auf die Leistung des Programms auswirkt.

b. Um die Leistung zu verbessern und den Speicheraufwand zu reduzieren, hat die JVM einige Optimierungen bei der Instanziierung von String-Konstanten vorgenommen.

Öffnen Sie einen String-Konstantenpool für Strings, ähnlich einem Cache-Bereich.

Überprüfen Sie beim Erstellen einer Zeichenfolgenkonstante zunächst, ob die Zeichenfolge im Zeichenfolgenkonstantenpool vorhanden ist.

Wenn die Zeichenfolge vorhanden ist, geben Sie die Referenzinstanz zurück. Wenn sie nicht vorhanden ist, instanziieren Sie die Zeichenfolge und fügen Sie sie in den Pool ein.

c. Grundlage der Implementierung

Die Grundlage für die Implementierung dieser Optimierung ist, dass Zeichenfolgen unveränderlich sind und geteilt werden können, ohne sich Gedanken über Datenkonflikte machen zu müssen.

Im von der Laufzeitinstanz erstellten globalen String-Konstantenpool gibt es eine Tabelle, die immer eine Referenz für jedes eindeutige String-Objekt im Pool verwaltet, was bedeutet, dass sie immer auf den String-Konstantenpool verweisen. Daher werden diese Zeichenfolgen im konstanten Pool vom Garbage Collector nicht recycelt.

Code: Holen Sie sich die entsprechende Zeichenfolge aus dem String-Konstantenpool

  String str1 = “hello”;
  String str2 = “hello”;
  System.out.printl("str1 == str2" : str1 == str2 ) //true
Nach dem Login kopieren
Nach dem Login kopieren

Wo ist der String-Konstantenpool

Bei der Analyse Um den Speicherort des String-Konstantenpools zu ermitteln, verstehen Sie zunächst den Heap, den Stapel und den Methodenbereich:

Detaillierte Erläuterung des String-Konstantenpools in Java

Heap

gespeichert Es ist ein Objekt. Jedes Objekt enthält eine entsprechende Klasse

Die JVM verfügt nur über einen Heap-Bereich (Heap), der von allen Threads gemeinsam genutzt wird. Der Heap speichert keine Basistypen und Objektreferenzen, sondern nur das Objekt selbst

Das Objekt wird vom Garbage Collector recycelt, sodass Größe und Lebenszyklus nicht bestimmt werden müssen

Stapel

Jeder Thread enthält einen Stapelbereich und den Nur Stapel. Speichern Sie Objekte grundlegender Datentypen und Verweise auf benutzerdefinierte Objekte (keine Objekte).

Die Daten in jedem Stapel (primitive Typen und Objektreferenzen) sind privat.

Der Stapel ist in drei Teile unterteilt : Basistyp-Variablenbereich, Ausführungsumgebungskontext, Betriebsanweisungsbereich (Speicherbetriebsanweisungen)

Die Datengröße und der Lebenszyklus können bestimmt werden. Wenn kein Verweis auf die Daten vorhanden ist, verschwinden die Daten automatisch.

Methodenbereich

Der statische Bereich wird wie der Heap von allen Threads gemeinsam genutzt

Was im Methodenbereich enthalten ist, ist im gesamten Programm immer eindeutig Im Methodenbereich sind Elemente wie Klasse, statische Variablen

und String-Konstantenpools vorhanden

Code: Der Stack-Methodenbereich speichert Strings

String str1 = “abc”;
String str2 = “abc”;
String str3 = “abc”;
String str4 = new String(“abc”);
String str5 = new String(“abc”);
Nach dem Login kopieren

Detaillierte Erläuterung des String-Konstantenpools in Java

Erstellung von String-Objekten

Interviewfrage: Wie viele Objekte werden durch String str4 = new String("abc") erstellt?

1. Finden Sie heraus, ob sich im Konstantenpool ein „abc“-Objekt befindet.

Wenn ja, geben Sie die entsprechende Referenzinstanz zurück.

Wenn nicht, erstellen Sie das entsprechende Instanzobjekt

2. Erstellen Sie ein neues String("abc")-Objekt im Heap

3. Weisen Sie str4 die Objektadresse zu und erstellen Sie eine Referenz

Es gibt also keine „abc“-Literal im Konstantenpool Erstellen Sie dann zwei Objekte, andernfalls erstellen Sie ein Objekt und erstellen Sie eine Referenz

Basierend auf dem Literal wird häufig eine solche Variantenfrage gestellt:

String str1 = new String("A"+ "B") ; Wie viele Objekte werden erstellt?

String str2 = new String("ABC") + "ABC" ;

str1:

Zeichen String-Konstantenpool: "A", "B", "AB": 3
Heap: new String("AB"): 1
Referenz: str1: 1
Gesamt: 5

str2:

String-Konstantenpool: „ABC“: 1
Heap: neuer String(“ABC“): 1
Referenz: str2: 1
Gesamt : 3

Codes: Basistypvariablen und -konstanten, Variablen und Referenzen werden auf dem Stapel gespeichert und Konstanten werden im Konstantenpool

int a1 = 1;
int a2 = 1;
int a3 = 1;
public static int INT1 =1 ;
public static int INT2 =1 ;
public static int INT3 =1 ;
Nach dem Login kopieren

Detaillierte Erläuterung des String-Konstantenpools in Java

< gespeichert 🎜>

So bedienen Sie den String-KonstantenpoolWenn die JVM den String-Konstantenpool instanziiert

  String str1 = “hello”;
  String str2 = “hello”;
  System.out.printl("str1 == str2" : str1 == str2 ) //true
Nach dem Login kopieren
Nach dem Login kopieren

String.intern()

通过new操作符创建的字符串对象不指向字符串池中的任何对象,但是可以通过使用字符串的intern()方法来指向其中的某一个。java.lang.String.intern()返回一个保留池字符串,就是一个在全局字符串池中有了一个入口。如果以前没有在全局字符串池中,那么它就会被添加到里面

// Create three strings in three different ways.
    String s1 = "Hello";
    String s2 = new StringBuffer("He").append("llo").toString();
    String s3 = s2.intern();
    // Determine which strings are equivalent using the ==
    // operator
    System.out.println("s1 == s2? " + (s1 == s2)); // false
    System.out.println("s1 == s3? " + (s1 == s3)); // true
Nach dem Login kopieren

字面量和常量池初探

字符串对象内部是用字符数组存储的,那么看下面的例子:

String m = "hello,world";
String n = "hello,world";
String u = new String(m);
String v = new String("hello,world");
Nach dem Login kopieren

1.会分配一个11长度的char数组,并在常量池分配一个由这个char数组组成的字符串,然后由m去引用这个字符串

2.用n去引用常量池里边的字符串,所以和n引用的是同一个对象

3.生成一个新的字符串,但内部的字符数组引用着m内部的字符数组

4.同样会生成一个新的字符串,但内部的字符数组引用常量池里边的字符串内部的字符数组,意思是和u是同样的字符数组

使用图来表示的话,情况就大概是这样的(使用虚线只是表示两者其实没什么特别的关系):

Detaillierte Erläuterung des String-Konstantenpools in Java


测试demo:

 String m = "hello,world";        
 String n = "hello,world";        
 String u = new String(m);        
 String v = new String("hello,world");        
 System.out.println(m == n); //true         
 System.out.println(m == u); //false        
 System.out.println(m == v); //false        
 System.out.println(u == v); //false
Nach dem Login kopieren

结论:

m和n是同一个对象

m,u,v都是不同的对象

m,u,v,n但都使用了同样的字符数组,并且用equal判断的话也会返回true

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des String-Konstantenpools in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie funktioniert der Klassenladungsmechanismus von Java, einschließlich verschiedener Klassenloader und deren Delegationsmodelle? Wie funktioniert der Klassenladungsmechanismus von Java, einschließlich verschiedener Klassenloader und deren Delegationsmodelle? Mar 17, 2025 pm 05:35 PM

Mit der Klassenbelastung von Java wird das Laden, Verknüpfen und Initialisieren von Klassen mithilfe eines hierarchischen Systems mit Bootstrap-, Erweiterungs- und Anwendungsklassenloadern umfasst. Das übergeordnete Delegationsmodell stellt sicher

Wie implementiere ich mehrstufige Caching in Java-Anwendungen mit Bibliotheken wie Koffein oder Guava-Cache? Wie implementiere ich mehrstufige Caching in Java-Anwendungen mit Bibliotheken wie Koffein oder Guava-Cache? Mar 17, 2025 pm 05:44 PM

In dem Artikel wird in der Implementierung von mehrstufigem Caching in Java mithilfe von Koffein- und Guava-Cache zur Verbesserung der Anwendungsleistung erläutert. Es deckt die Einrichtungs-, Integrations- und Leistungsvorteile sowie die Bestrafung des Konfigurations- und Räumungsrichtlinienmanagements ab

Wie kann ich JPA (Java Persistence-API) für Objektrelationszuordnungen mit erweiterten Funktionen wie Caching und faulen Laden verwenden? Wie kann ich JPA (Java Persistence-API) für Objektrelationszuordnungen mit erweiterten Funktionen wie Caching und faulen Laden verwenden? Mar 17, 2025 pm 05:43 PM

In dem Artikel werden mit JPA für Objektrelationszuordnungen mit erweiterten Funktionen wie Caching und faulen Laden erläutert. Es deckt Setup, Entity -Mapping und Best Practices zur Optimierung der Leistung ab und hebt potenzielle Fallstricke hervor. [159 Charaktere]

Wie benutze ich Maven oder Gradle für das fortschrittliche Java -Projektmanagement, die Erstellung von Automatisierung und Abhängigkeitslösung? Wie benutze ich Maven oder Gradle für das fortschrittliche Java -Projektmanagement, die Erstellung von Automatisierung und Abhängigkeitslösung? Mar 17, 2025 pm 05:46 PM

In dem Artikel werden Maven und Gradle für Java -Projektmanagement, Aufbau von Automatisierung und Abhängigkeitslösung erörtert, die ihre Ansätze und Optimierungsstrategien vergleichen.

Wie erstelle und verwende ich benutzerdefinierte Java -Bibliotheken (JAR -Dateien) mit ordnungsgemäßem Versioning und Abhängigkeitsmanagement? Wie erstelle und verwende ich benutzerdefinierte Java -Bibliotheken (JAR -Dateien) mit ordnungsgemäßem Versioning und Abhängigkeitsmanagement? Mar 17, 2025 pm 05:45 PM

In dem Artikel werden benutzerdefinierte Java -Bibliotheken (JAR -Dateien) mit ordnungsgemäßem Versioning- und Abhängigkeitsmanagement erstellt und verwendet, wobei Tools wie Maven und Gradle verwendet werden.

See all articles