Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Syvemmälle Merkkijonoon | Merkkijonon Jatkotaso
Java Laajennettu

bookSyvemmä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

Main.java

copy
12345678910111213141516
package 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.

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 3. Luku 1

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Suggested prompts:

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

bookSyvemmä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

Main.java

copy
12345678910111213141516
package 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.

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 3. Luku 1
some-alt