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
course content

Kurssisisältö

Java Laajennettu

Java Laajennettu

1. Syvällinen Java-rakenne
2. Metodit
3. Merkkijonon Jatkotaso
4. Luokat
5. Luokat Jatko

book
Syvemmälle Merkkijonoon

Miten String todella toimii?

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-olion sisällä tapahtuu.

Tutustutaan String-arvojen taustalla olevaan esitystapaan Javassa. Alun perin String toteutettiin char-arvojen taulukkona, mikä oli suoraviivaista ja intuitiivista. Myöhemmin se kuitenkin muutettiin byte-arvojen taulukoksi. Ymmärretään tämän muutoksen taustalla oleva syy.

char-muuttuja Javassa vie 2 tavua muistia, kun taas byte-muuttuja tarvitsee vain 1 tavun. Käyttämällä byte-arvoja voimme merkittävästi pienentää muistinkulutusta, hyödyntäen vain neljäsosan tilasta.

Mutta miten String voi sisältää erilaisia merkkejä, myös ei-numeerisia? Mekanismi on samanlainen kuin char-muuttujalla. Hyödynnämme ASCII-taulukkoa, jossa numeeriset arvot on yhdistetty tiettyihin merkkeihin, mahdollistaen laajan merkkivalikoiman esittämisen String-muuttujassa.

Tarkastellaan seuraavaksi havainnollistusta, joka esittää String-arvon "Hello":

Solut sisältävät byte-tyyppisiä alkioita, jotka otetaan ASCII-taulukosta. Voimme jopa 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 nähdä, että byte-arvot ovat identtisiä 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

course content

Kurssisisältö

Java Laajennettu

Java Laajennettu

1. Syvällinen Java-rakenne
2. Metodit
3. Merkkijonon Jatkotaso
4. Luokat
5. Luokat Jatko

book
Syvemmälle Merkkijonoon

Miten String todella toimii?

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-olion sisällä tapahtuu.

Tutustutaan String-arvojen taustalla olevaan esitystapaan Javassa. Alun perin String toteutettiin char-arvojen taulukkona, mikä oli suoraviivaista ja intuitiivista. Myöhemmin se kuitenkin muutettiin byte-arvojen taulukoksi. Ymmärretään tämän muutoksen taustalla oleva syy.

char-muuttuja Javassa vie 2 tavua muistia, kun taas byte-muuttuja tarvitsee vain 1 tavun. Käyttämällä byte-arvoja voimme merkittävästi pienentää muistinkulutusta, hyödyntäen vain neljäsosan tilasta.

Mutta miten String voi sisältää erilaisia merkkejä, myös ei-numeerisia? Mekanismi on samanlainen kuin char-muuttujalla. Hyödynnämme ASCII-taulukkoa, jossa numeeriset arvot on yhdistetty tiettyihin merkkeihin, mahdollistaen laajan merkkivalikoiman esittämisen String-muuttujassa.

Tarkastellaan seuraavaksi havainnollistusta, joka esittää String-arvon "Hello":

Solut sisältävät byte-tyyppisiä alkioita, jotka otetaan ASCII-taulukosta. Voimme jopa 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 nähdä, että byte-arvot ovat identtisiä 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