2015-04-18 31 views
5

Sto prendendo strutture dati e analisi. Abbiamo esaminato in che modo l'assegnazione e il confronto dei tipi di oggetto è molto più lento dell'assegnazione e dei confronti per i tipi di base, come int.Sono numeri interi di puntatori Java?

Ricordo l'apprendimento C (tutti quelli quasi trent'anni fa) e il modo in cui i puntatori in C sono (o erano) chiamate in numeri interi. È Java simile oggi, è un riferimento a un oggetto istanziato internamente un indirizzo intero della memoria, e come tali sono paragoni, come

if (MyObject != null) {...} 

un'operazione intero nel quadro?

Spero che la mia domanda sia chiara. Ho fatto ricerche in giro e non riesco a trovare una risposta chiara su come Java gestisce la sua memoria dinamica.

+1

Trovo questo post pericolosamente confuso. Sembri insinuare che "il confronto degli oggetti è lento" e che confrontare i puntatori è veloce e quindi migliore. Ma quelle sono cose completamente diverse. Uno riguarda l'uguaglianza dei valori e l'altro riguarda l'identità dell'oggetto. Per dare un'analogia in Python, uno è su '99 == 99', e l'altro è su' 301 è 301' –

+0

Non sto insinuando, sto chiedendo. Grazie per il tuo contributo. – failure

+0

Tutti i valori in Java sono "interi" internamente, compresi i numeri in virgola mobile. È una questione di come vengono interpretati. Ma stai confondendo comparando * i puntatori * con gli * oggetti * a confronto * con due cose completamente diverse. Un confronto tra due "puntatori" di Java (riferimenti) con '==' è veloce quanto un confronto tra due valori * lunghi *. –

risposta

3

La risposta breve è sì, un riferimento a un oggetto viene memorizzato come puntatore come è in C.

Non sono sicuro di cosa si intende per memorizzato come "integer", ma se quello che vuoi è quello di fai qualche operazione su di loro come puoi fare in C (ad esempio aggiungi un intero a un puntatore, ecc.), quindi non puoi farlo con Java.

Per il resto, è praticamente lo stesso eccetto che è gestito da Java.

JLS 4.3.1 specifica che un riferimento a un oggetto è memorizzato come puntatore:

I valori di riferimento (spesso solo riferimenti) sono puntatori a questi oggetti e riferimento null speciale, che si riferisce a nessun oggetto.

+0

In C, originale, pre-ANSI C, i puntatori erano interi e quindi le operazioni sui puntatori, in particolare l'assegnazione, sono veloci quanto un'operazione su un numero intero. Non sto cercando un controllo diretto, sono solo curioso di sapere qual è il sovraccarico su tali operazioni. Grazie! – failure

+0

@failure Prego. –

Problemi correlati