2011-03-05 15 views
7

L'ultimo giorno ho affrontato un'intervista e mi hanno fatto domande java tra cui per alcune domande non sapevo la risposta. Sono curioso di sapere la risposta a questa domanda. L'intervistatore non mi ha detto la risposta. Sto ponendo le domande qui:Comprendere le domande basilari sull'intervento di Java

  • Java fornisce qualche costrutto per scoprire la dimensione di un oggetto?
  • Dare un modo più semplice per scoprire il tempo che un metodo richiede per l'esecuzione senza l'utilizzo di uno strumento di profilazione?
  • Quali sono le eccezioni controllate e le eccezioni del runtime?
  • Se scrivo il ritorno alla fine del blocco try, il blocco finally verrà ancora eseguito?
  • Se scrivo System.exit (0); alla fine del blocco try, il blocco finally verrà ancora eseguito?

Desidero conoscere le risposte della domanda di cui sopra in modo che possa aiutarmi la prossima volta.

Spiegazioni, note e/o collegamenti pertinenti alle specifiche sarebbero molto apprezzate rispetto alle semplici risposte - e quale è un buon modo per imparare queste cose?

+5

-1 Man ... qui mi aspettavo interessanti domande ... Non credo che questa è una buona domanda (ad esempio, le informazioni sono facilmente ricercabili e testabile e probabilmente incredibilmente duplicato) - tuttavia, spero che ne emergano alcune risposte dettagliate. –

+8

Dato che ora hai accesso a un compilatore/run-time ea Google, cosa ** pensi ** che siano le risposte? –

risposta

17

Penso che tutti questi possano essere risolti cercando le domande esistenti di Stack Overflow. Il motivo per cui penso valga la pena di rispondere a questa domanda con i link alle risposte precedenti è che hai chiesto un sacco di problemi diversi, ognuno dei quali è interessante di per sé. Non è così probabile che tu possa avere una discussione approfondita di questi quando chiedi loro tutti insieme, ma nelle risposte e nei commenti alle domande precedenti qui troverai molti dettagli e discussioni che (a) potrebbero essere interessanti e (b) può aiutare in ulteriori interviste. (Potrebbero esserci scelte migliori: queste sono solo le prime risposte SO ragionevoli che ho trovato)

Java fornisce qualche costrutto per scoprire la dimensione di un oggetto?

Dare un modo più semplice per scoprire il tempo di un metodo richiede per l'esecuzione senza utilizzare alcun strumento di profiling?

Quali sono controllati eccezioni e le eccezioni di runtime?

Se scrivo ritorno alla fine del blocco try, sarà il blocco finally ancora eseguire?

Se scrivo System.exit (0); alla fine del blocco try, il blocco finally verrà ancora eseguito?

+0

+1. Ottima ricerca) –

+0

questa è una risposta modello. – Andrey

+0

A volte la dimensione della risposta è piccola, ma per ottenere quel contenuto ci vuole un sacco di ricerche e sforzi. Questo è il tipo di risposta che richiede molto tempo per cercare e l'hai fatto con successo. Grazie Molto bella risposta @ Mark Longair – zeeshan

0

1.

no, non per oggetti in genere. .length per array e stringhe ...

2.

final long startTime = System.nanoTime(); 
final long endTime; 
try { 
    methodToTime(); 
} finally { 
    endTime = System.nanoTime(); 
} 
final long duration = endTime - startTime; 

da How do I time a method's execution in Java?

3.

eccezioni unchecked sono bug, vedere http://download.oracle.com/javase/tutorial/essential/exceptions/runtime.html

eccezioni controllate sono per esempio, input utente non validi, eccezioni che possono essere gestite.

4.

blocco finally sarà comunque eseguirà

5.

blocco finally non esegue

+2

come si misura la dimensione dell'oggetto con '.length'. Non esiste questo campo nel 'java.lang.Object'. –

+0

Penso che l'OP sia dopo qualcosa di più generico degli array .length. –

+0

grazie, non stavo leggendo bene, ho aggiunto la risposta – Orbit

3

fa Java fornisce alcun costrutto per scoprire la dimensione di un oggetto?

AFAIK n.

Dare un modo più semplice per scoprire il tempo che un metodo richiede per l'esecuzione senza l'utilizzo di uno strumento di profilatura?

Misurare il tempo con System.currentTimeMillis(), System.nanoTime().

Quali sono le eccezioni controllate e le eccezioni del runtime?

Per la spiegazione dettagliata, verificare this thread.

Se scrivo il ritorno alla fine del blocco try, il blocco finally verrà ancora eseguito?

sì.

Se scrivo System.exit (0); alla fine del blocco try, il blocco finally verrà ancora eseguito?

no.

0

Java fornisce alcun costrutto per scoprire la dimensione di un oggetto?

Non proprio. È possibile creare un oggetto e annotare le differenze di memoria, oppure leggere le specifiche per vedere di cosa è composto un oggetto.

Dare un modo più semplice per scoprire il tempo che un metodo richiede per l'esecuzione senza l'utilizzo di uno strumento di profilatura?

Ti piace questa:

long start = System.currentTimeMillis(); 
// do something 
System.out.println("Time: " + (System.currentTimeMillis() - start)); 

Quali sono controllati eccezioni e le eccezioni di runtime?

Le eccezioni controllate sono eccezioni dichiarate nella sezione throws di una routine. Analogamente, le exction non controllate sono quelle che non sono dichiarate, ad esempio sottoclassi di RuntimeException.

Se scrivo il ritorno alla fine del blocco try, il blocco finally verrà ancora eseguito?

Sì, almeno sul sole/oracolo jvm. Non bello però ..

Se scrivo System.exit (0); alla fine del blocco try, il blocco finally verrà ancora eseguito?

No

+0

http://download.oracle.com/javase/6/docs/api/java/lang/instrument/Instrumentation.html getObjectSize? – Andrey

+0

@Andrey, questo è un buon metodo ma secondo la javadoc fornisce una stima e non è una dimensione. –

+0

@Alex Nikolaenkov vale almeno la pena menzionare – Andrey

1

fa Java fornisce alcun costrutto per scoprire le dimensioni di un oggetto?

Non esiste un modo cross-platform/cross-VM, come so.

Dare un modo più semplice per scoprire il tempo che un metodo richiede per l'esecuzione senza l'utilizzo di uno strumento di profilatura?

creando nuova Data() prima e dopo l'esecuzione.

Quali sono le eccezioni controllate e le eccezioni del runtime?

Si dovrebbe avvolgere eccezioni controllate in blocco try/catch

Se scrivo ritorno alla fine del blocco try, sarà il blocco finally ancora eseguire?

Se scrivo System.exit (0); alla fine del blocco try, il blocco finally verrà ancora eseguito?

No.

0

fa Java fornisce alcun costrutto per scoprire la dimensione di un oggetto?

No, non è così.

Dare un modo più semplice per scoprire il tempo un metodo prende per l'esecuzione senza utilizzare alcun strumento di profiling?

long begTime = System.currentTimeInMillis(); 
x.method(); 
long endTime = System.currentTimeInMillis(); 
System.out.println("method running time: " + (endTime-begTime)); 

eccezioni Quali sono controllati e eccezioni di runtime?

Le eccezioni controllate devono essere rilevate o il compilatore verrà contrassegnato; le eccezioni di runtime non richiedono blocchi catch.

Se scrivo ritorno alla fine del blocco try , sarà il blocco finally ancora eseguire?

Sì.

Se scrivo System.exit (0); alla fine del blocco try, il blocco finally sarà ancora eseguito?

No. http://download.oracle.com/javase/tutorial/essential/exceptions/finally.html

+0

'System.exit' non è garantito per l'esecuzione. Può essere annullato dal responsabile della sicurezza e, più in generale, tutto ciò che riguarda una chiamata al metodo può fallire se lo stack si trova all'interno di un frame di overflow. –

+0

Non il caso di vaniglia, ma sei certamente corretto. Grazie per l'educazione, Mike. – duffymo

3

fa Java fornisce alcun costrutto per scoprire le dimensioni di un oggetto?

No.

Dare un modo semplice per scoprire il tempo di un metodo richiede per l'esecuzione senza utilizzare alcun strumento di profiling?

long t0 = System.nanoTime(); 
// code to profile 
long timeTaken = System.nanoTime() - t0; 

eccezioni Quali sono controllati ed eccezioni di runtime?

Un'eccezione è verificata alcuna Throwable che non si estende da java.lang.Error o java.lang.RuntimeException. Il compilatore java ti darà un errore se non gestisci o propaghi esplicitamente le eccezioni controllate.

Se scrivo il ritorno alla fine del blocco try, il blocco finally verrà ancora eseguito?

Se scrivo System.exit (0); alla fine del blocco try, il blocco finally verrà ancora eseguito?

Forse. Se c'è un SecurityManager allora può lanciare un SecurityException invece di uscire che attiverà il blocco finally.

Se lo stack è troppo grande, chiamare System.exit potrebbe causare un'eccezione di overflow dello stack che attiverebbe il blocco finally.

0

Le dimensioni degli oggetti (serializable) può essere trovato con relativa facilità.

import javax.swing.*; 
import java.io.*; 

class HowLongIsAPieceOfString { 

    public static int getObjectSize(Object object) throws IOException { 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     ObjectOutputStream oos = new ObjectOutputStream(baos); 
     oos.writeObject(object); 
     return baos.toByteArray().length; 
    } 

    public static void main(String[] args) throws IOException { 
     Object object = "string"; 
     System.out.println("String size: \t" + getObjectSize(object)); 

     object = new JButton("Click Me!"); 
     System.out.println("Button size: \t" + getObjectSize(object)); 

     object = new JTree(); 
     System.out.println("Tree size: \t" + getObjectSize(object)); 

     object = new Object(); 
     System.out.println("Object size: \t" + getObjectSize(object)); 
    } 
} 

uscita:

String size: 13 
Button size: 4347 
Tree size:  5628 
Exception in thread "main" java.io.NotSerializableException: java.lang.Object 
     at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156) 
     ... 
+0

+1 per la ricerca sulla dimensione ........ ;-) –

+1

questa non è la dimensione dell'oggetto, ma la dimensione dell'oggetto in forma serializzata. Penso che questi valori siano più o meno validi solo per DTO e altri oggetti di trasporto, non per quelli complessi. Non ha molto sulla quantità di memoria utilizzata dall'oggetto. – Andrey