1. StringTokenizer
klasse
En nu een paar meer voorkomende scenario's met betrekking tot het werken met tekenreeksen. Hoe splits je een string in meerdere delen? Er zijn verschillende manieren om dit te doen.
split()
methode
De eerste manier om een string in meerdere delen te splitsen is door de split()
methode te gebruiken. Een reguliere expressie die een speciale begrenzende tekenreeks definieert, moet als argument worden doorgegeven. Je leert wat een reguliere expressie is in de Java Multithreading- zoektocht.
Voorbeeld:
Code | Resultaat |
---|---|
|
Het resultaat is een array van drie strings:
|
Eenvoudig, maar soms is deze aanpak overdreven. Als er veel scheidingstekens zijn (bijvoorbeeld spaties, tekens voor nieuwe regels, tabs, punten), dan moet u een vrij complexe reguliere expressie maken. Het is moeilijk te lezen en daarom moeilijk te wijzigen.
StringTokenizer
klas
Java heeft een speciale klasse wiens taak het is om een string op te splitsen in substrings.
Deze klasse gebruikt geen reguliere expressies: in plaats daarvan geeft u gewoon een string door die bestaat uit scheidingstekens. Het voordeel van deze benadering is dat de hele reeks niet in één keer in stukken wordt gebroken, maar in plaats daarvan stap voor stap van het begin naar het einde wordt verplaatst.
De klasse heeft een constructor en twee belangrijke methoden. We geven de constructor een tekenreeks door die we in delen splitsen, en een tekenreeks die bestaat uit een reeks begrenzingstekens.
methoden | Beschrijving |
---|---|
|
Retourneert de volgende subtekenreeks |
|
Controleert of er meer subtekenreeksen zijn. |
Deze klasse doet op de een of andere manier denken aan de klasse Scanner, die ook methoden nextLine()
en heeft hashNextLine()
.
U kunt een StringTokenizer
object maken met deze opdracht:
StringTokenizer name = new StringTokenizer(string, delimiters);
Waar string
is de string die in delen moet worden verdeeld. En delimiters
is een tekenreeks en elk teken erin wordt behandeld als een scheidingsteken. Voorbeeld:
Code | Console-uitvoer |
---|---|
|
|
Merk op dat elk teken in de tekenreeks die als tweede tekenreeks aan de StringTokenizer
constructor wordt doorgegeven, wordt beschouwd als een scheidingsteken.
2. String.format()
methode en StringFormatter
klasse
Een andere interessante methode van de klasse String is format()
.
Stel dat u verschillende variabelen hebt die gegevens opslaan. Hoe geef je ze in één regel op het scherm weer? We hebben bijvoorbeeld enkele gegevens (linkerkolom) en gewenste uitvoer (rechterkolom):
Code | Console-uitvoer |
---|---|
|
|
Je code ziet er waarschijnlijk ongeveer zo uit:
Programmacode |
---|
|
Dergelijke code is niet erg leesbaar. En als de variabelenamen langer waren, zou de code nog moeilijker worden:
Programmacode |
---|
|
Niet erg leesbaar, is het?
Maar dit is een veel voorkomende situatie in real-world programma's, dus ik wil je vertellen over een manier om deze code eenvoudiger en beknopter te schrijven.
String.format
De klasse String heeft een statische format()
methode: hiermee kunt u een patroon specificeren voor het samenstellen van een string met gegevens. Het algemene uiterlijk van de opdracht is als volgt:
String name = String.format(pattern, parameters);
Voorbeeld:
Code | Resultaat |
---|---|
|
|
|
|
|
|
De format()
eerste parameter van de methode is een opmaaktekenreeks die alle gewenste tekst bevat, samen met speciale tekens die opmaakspecificaties worden genoemd (zoals %d
en %s
) op de plaatsen waar u gegevens moet invoegen.
De format()
methode vervangt deze %s
en %d
formaatspecificaties door de parameters die volgen op de formaattekenreeks in de parameterlijst. Als we een string willen invoegen, schrijven we %s
. Als we een getal willen invoegen, dan is de formaatspecificatie %d
. Voorbeeld:
Code | Resultaat |
---|---|
|
s is gelijk aan"a=1, b=4, c=3" |
Hier is een korte lijst met indelingsspecificaties die kunnen worden gebruikt in de indelingsreeks:
Specificatie | Betekenis |
---|---|
|
String |
|
interger: byte , short , int ,long |
|
echt nummer: float ,double |
|
boolean |
|
char |
|
Date |
|
% karakter |
Deze specifiers geven het type data aan, maar er zijn ook specifiers die de volgorde van de data aangeven. Om een argument op nummer te krijgen (de nummering begint bij één), moet u " " schrijven in plaats van " ". Voorbeeld:%1$d
%d
Code | Resultaat |
---|---|
|
s is gelijk aan"a=13, b=12, c=11" |
%3$d
krijgt het 3e argument, %2$d
krijgt het tweede argument en %d
krijgt het allereerste argument. De %s
en %d
formaatspecificaties verwijzen naar argumenten, ongeacht de specificatie zoals %3$d
of%2$s
3. Stringpool
Elke tekenreeks die in code is gespecificeerd als een letterlijke tekenreeks, wordt opgeslagen in een geheugengebied dat de wordt genoemd StringPool
terwijl het programma wordt uitgevoerd. StringPool
is een speciale array voor het opslaan van strings. Het doel is om stringopslag te optimaliseren:
Ten eerste moeten de strings die in de code zijn gespecificeerd ergens worden opgeslagen, toch? Code bestaat uit opdrachten, maar gegevens (vooral grote strings) moeten apart van de code in het geheugen worden opgeslagen. Alleen verwijzingen naar tekenreeksobjecten verschijnen in code.
Ten tweede moeten alle identieke letterlijke tekenreeksen slechts één keer in het geheugen worden opgeslagen. En dat is precies hoe het werkt. Wanneer uw klassecode wordt geladen door de Java-machine, worden alle letterlijke tekenreeksen toegevoegd aan de StringPool
als ze er nog niet zijn. Als ze er al zijn, gebruiken we gewoon een tekenreeksreferentie uit de StringPool
.
Dienovereenkomstig, als u dezelfde letterlijke waarde toewijst aan verschillende String
variabelen in uw code, dan zullen deze variabelen dezelfde referentie bevatten. Er wordt een letterlijke waarde toegevoegd aan de StringPool
enige keer. In alle andere gevallen krijgt de code een verwijzing naar de string die al in het StringPool
.
Hier is ongeveer hoe het werkt:
Code | Werken met de StringPool |
---|---|
|
|
Daarom zullen de variabelen a
en b
dezelfde referenties opslaan.
intern()
methode
En het beste is dat je programmatisch elke string aan het StringPool
. Om dit te doen, hoef je alleen maar de methode String
van de variabele aan te roepen intern()
.
De intern()
methode voegt de string toe aan de StringPool
als deze er nog niet is, en retourneert een verwijzing naar de string in de StringPool
.
Als twee identieke strings worden toegevoegd aan de StringPool
met behulp van de intern()
methode, retourneert de methode dezelfde referentie. Dit kan worden gebruikt om tekenreeksen op basis van referentie te vergelijken. Voorbeeld:
Code | Opmerking |
---|---|
|
|
|
|
Het is onwaarschijnlijk dat je deze methode vaak gebruikt, maar mensen vragen er graag naar in interviews . Het is dus beter om er iets van te weten dan om het niet te weten.
GO TO FULL VERSION