Terve! (aloittelija javassa)
Tuli eteen tilanne, että pitää tietokannasta hakea tietoa ja viedä se taulukkoon. Tietoa saattaa olla ihan muutamasta rivistiä tuhansiin riveihin. Tämän vuoksi taulukoista pitäisi varata tilaa isoja määriä, vaikka rivejä olisi muutama. Kehittelin tapaa käyttäen HashMappia ja nyt kysyisinkin, onko HashMappien käyttö ihan järkevää tälläisissä tilanteissa?
Nopeampi se on kuin taulukoiden käyttö. Alla esimerkki.
package testiymparisto; import java.util.HashMap; /** * * @author Erno */ public class Testiymparisto { public static void main(String args[]) { double hash_alku = System.currentTimeMillis(); HashMap<Integer, String> lista = new HashMap<Integer, String>(); lista.put(0, "Rivi1"); lista.put(1, "Rivi2"); lista.put(2, "Rivi3"); lista.put(3, "Rivi4"); lista.put(4, "Rivi5"); lista.put(5, "Rivi6"); HashMap<Integer, String> lista2 = new HashMap<Integer, String>(); lista2.put(0, "Rivi1"); lista2.put(1, "Rivi2"); lista2.put(2, "Rivi3"); lista2.put(3, "Rivi4"); lista2.put(4, "Rivi5"); lista2.put(5, "Rivi6"); HashMap<Integer, HashMap<Integer, String>> mappi = new HashMap<Integer, HashMap<Integer, String>>(); for(int i = 0; i < 1000; i++) { if(i % 2 == 0) mappi.put(i, lista); else mappi.put(i, lista2); } HashMap<Integer, String> temp = null; for(int i = 0; i < mappi.size(); i++) { temp = mappi.get(i); for(int j = 0; j < temp.size(); j++) { System.out.print(temp.get(j) + " "); } System.out.println(""); } double hash_loppu = System.currentTimeMillis(); double array_alku = System.currentTimeMillis(); String[][] taulukko = new String[1000][6]; String[] aputaulu = {"Rivi1", "Rivi2", "Rivi3", "Rivi4", "Rivi5", "Rivi6"}; String[] aputaulu2 = {"Rivi1", "Rivi2", "Rivi3", "Rivi4", "Rivi5", "Rivi6"}; for(int i = 0; i < 1000; i++) { if(i % 2 == 0) taulukko[i] = aputaulu; else taulukko[i] = aputaulu2; } for(int i = 0; i < taulukko.length; i++) { for(int j = 0; j < taulukko[i].length; j++) { System.out.print(taulukko[i][j] + " "); } System.out.println(""); } double array_loppu = System.currentTimeMillis(); System.out.println("Hash ms: " + (hash_loppu - hash_alku)); System.out.println("Array ms: " + (array_loppu - array_alku)); } }
T. Ernohac
Paras tietorakenne riippuu täysin siitä mitä aiot tiedoilla tehdä ja kuinka tietoon tarvitsee päästä käsiksi.
Luultavasti kuitenkin parhaiten käyttöösi sopiva tietorakenne on jokin lista. Jos alkiot tarvitsee vain käydä alusta loppuun (tai lopusta alkuun), niin esimerkiksi LinkedList tai ArrayList on toimiva ratkaisu. Jos tarvitset taulukkotyyppistä indeksointia, niin esimerkiksi ArrayList on toimiva ratkaisu.
Testisi ei edes testaa HashMapien ja taulukoiden nopeutta, vaan lähes pelkästään tulostuksen nopeutta, sillä suurin osa (jopa yli 99%) ajasta kuluu vain tulostamiseen! Lisäksi kopioit molemmissa tapauksissa vain viitteitä toisiin vastaaviin tietorakenteisiin, etkä itse tietoja.
Aihe on jo aika vanha, joten et voi enää vastata siihen.