I tipi raw (grezzi)

  • Per retrocompatibilitĂ  è possibile istanziare una classe generica senza specificare il tipo parametrico
Pila <Integer> p1 = new Pila <Integer> (10);
Pila p2 = new Pila (10);
  • E’ possibile assegnare un’istanza con tipo parametrico a una con tipo raw
p2 = p1;
  • E viceversa:
p1 = p2;

Ricorsione in Java

Pensare ricorsivamente

  • Dato un problema, bisogna identificare
    • I casi base
    • Il passo ricorsivo
Ex. Fattoriale
public int fattorialeRicorsivo(int n)
{
	if (n == 0) return 1;
	return n*fattorialeRicorsivo(n-1);
}
public int fattorialeIterativo(int n)
{
	int v = 1;
	for (int k = 1; k <= n; k++) v *= k;
	return v;
}

L’idea della ricorsione

  • Sequenza di chiamate ricorsive:

  • Valori restituiti da ciascuna chiamata

Come funziona?

  • Ogni volta che viene effettuata una chiamata a un metodo viene creato un nuovo ambiente, detto record di attivazione
  • Un record di attivazione contiene la zona di memoria per le variabili locali del metodo e l’indirizzo di ritorno al metodo chiamante
    • A ogni chiamata, il record corrispondente viene aggiunto sullo stack
  • Lo stack è la pila dei record di attivazione delle chiamate annidate effettuate

Mutua induzione

  • A volte può verificarsi i caso in cui il metodo a richiami b e b, a sua volta, richiami a
  • Questo meccanismo di reciproca chiamata è detto mutua ricorsione
  • Ovviamente è sempre necessario stabilire uno o piĂą casi base, onde evitare un ciclo infinito di chiamate tra a e b

Input e Output

  • Usando la classe System.out (oggetto dello standard output)
  • E’ un campo statico, pubblico, final di System di tipo java.io.PrintStream (estende java.io.OutputStream)

java.io.PrintStream

Input da tastiera

  • Usando la classe java.util.Scnner costruita con la standard input stream_
  • System.in è un campo statico, pubblico, final, di System di tipo java.io.InputStream
Scanner s = new Scanner (System.in);
int k = s.nextIn();
System.out.println ("Hai disgitato: " + k);
String string = s.next();
System.out.println ("Hai digitato: " + string);

Stream

  • E’ un’astrazione derivata da dispositivi di input o di output
  • Uno stream di input riceve uno stream di caratteri “Uno alla volta”
  • Uno stream di output produce uno stream di caratteri
  • Non si applicano solo ai file, ma anche a dispostivi i/o, internet, ecc…
  • Un file può essere trattato come uno stream di input o output
    • In realtĂ  i file sono bufferizzati per questioni di efficienza

Quattro gerarchie di classi in java

  • Per leggere o scrivere caratteri (16 alla volta):
    • java.io.Read/Writer
  • Per leggere o scrivere byte (da file binari, 8 bit alla volta)
    • java.io.InputStream/OutputStream
  • L’accesso ai file di testo è stato semplificato in Java 5 mediante l’aggiunta di una classe java.util.Scanner
    • Che tuttavia è piĂą lenta proprio perchĂ© piĂą potente

FileReader e BufferedReader