Syvemmälle Merkkijonoon
Miten String-luokka toimii Javassa
Tiedät jo, mikä String on ja kuinka sitä käytetään. Tässä luvussa käsitellään teoreettisia näkökulmia siitä, mitä String-luokan sisällä tapahtuu.
Tutustutaan String-arvojen taustalla olevaan esitystapaan Javassa. Alun perin String toteutettiin char-taulukon avulla, mikä oli suoraviivaista ja intuitiivista. Myöhemmin siirryttiin kuitenkin käyttämään byte-taulukkoa. Tarkastellaan syitä tähän muutokseen.
char-muuttuja Javassa vie 2 tavua muistia, kun taas byte-muuttuja tarvitsee vain 1 tavun. Käyttämällä byte-arvoja voimme huomattavasti pienentää muistinkulutusta, sillä tilantarve on vain neljäsosa alkuperäisestä.
Miten String sitten mahdollistaa erilaisten merkkien, myös ei-numeeristen, tallentamisen? Mekanismi on samankaltainen kuin char-muuttujalla. Hyödynnämme ASCII-taulukkoa, jossa numeeriset arvot yhdistetään tiettyihin merkkeihin. Näin voidaan esittää laaja joukko merkkejä String-muuttujassa.
Tarkastellaan esimerkkiä, jossa kuvataan String-arvoa "Hello":
Solut sisältävät byte-tyyppisiä alkioita, jotka otetaan ASCII-taulukosta. Voimme tarkastella koodissa tarkkaa byte-taulukkoa, joka tallennetaan String-muuttujan arvoksi. Tämä onnistuu getBytes()-metodilla.
Main.java
12345678910111213141516package com.example; public class Main { public static void main(String[] args) { String hello = "Hello"; byte[] bytes = hello.getBytes(); printArray(bytes); } static void printArray(byte[] bytes) { for (byte element: bytes) { System.out.print(element + " "); } System.out.println(); } }
Voimme huomata, että byte-arvot ovat identtiset yllä olevan kaavion kanssa. Lisäksi, jos olet kiinnostunut, voit tarkastella ASCII-taulukkoa ja verrata kunkin alkion koodia sen vastaavaan arvoon.
Voimme käsitellä tätä byte[]-taulukkoa, jonka saamme String-oliosta.
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Can you explain why Java switched from char[] to byte[] for String storage?
How does Java handle non-ASCII characters in Strings if it uses byte arrays?
Can you show an example of using getBytes() with a String in Java?
Awesome!
Completion rate improved to 2.63
Syvemmälle Merkkijonoon
Pyyhkäise näyttääksesi valikon
Miten String-luokka toimii Javassa
Tiedät jo, mikä String on ja kuinka sitä käytetään. Tässä luvussa käsitellään teoreettisia näkökulmia siitä, mitä String-luokan sisällä tapahtuu.
Tutustutaan String-arvojen taustalla olevaan esitystapaan Javassa. Alun perin String toteutettiin char-taulukon avulla, mikä oli suoraviivaista ja intuitiivista. Myöhemmin siirryttiin kuitenkin käyttämään byte-taulukkoa. Tarkastellaan syitä tähän muutokseen.
char-muuttuja Javassa vie 2 tavua muistia, kun taas byte-muuttuja tarvitsee vain 1 tavun. Käyttämällä byte-arvoja voimme huomattavasti pienentää muistinkulutusta, sillä tilantarve on vain neljäsosa alkuperäisestä.
Miten String sitten mahdollistaa erilaisten merkkien, myös ei-numeeristen, tallentamisen? Mekanismi on samankaltainen kuin char-muuttujalla. Hyödynnämme ASCII-taulukkoa, jossa numeeriset arvot yhdistetään tiettyihin merkkeihin. Näin voidaan esittää laaja joukko merkkejä String-muuttujassa.
Tarkastellaan esimerkkiä, jossa kuvataan String-arvoa "Hello":
Solut sisältävät byte-tyyppisiä alkioita, jotka otetaan ASCII-taulukosta. Voimme tarkastella koodissa tarkkaa byte-taulukkoa, joka tallennetaan String-muuttujan arvoksi. Tämä onnistuu getBytes()-metodilla.
Main.java
12345678910111213141516package com.example; public class Main { public static void main(String[] args) { String hello = "Hello"; byte[] bytes = hello.getBytes(); printArray(bytes); } static void printArray(byte[] bytes) { for (byte element: bytes) { System.out.print(element + " "); } System.out.println(); } }
Voimme huomata, että byte-arvot ovat identtiset yllä olevan kaavion kanssa. Lisäksi, jos olet kiinnostunut, voit tarkastella ASCII-taulukkoa ja verrata kunkin alkion koodia sen vastaavaan arvoon.
Voimme käsitellä tätä byte[]-taulukkoa, jonka saamme String-oliosta.
Kiitos palautteestasi!