Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 12-12-2007, 17:01   #1
redcloud
Bannato
 
L'Avatar di redcloud
 
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
[JAVA] String e equals

Perche equals serve a confrontare due stringhe quando esiste compareTo? Forse perchè le stringhe sono oggetti immutabili e hanno preferito sfruttare anche il metodo equals per effettuare il confronto altrimenti non avrebbe avuto senso?
redcloud è offline   Rispondi citando il messaggio o parte di esso
Old 12-12-2007, 17:38   #2
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
Iscritto dal: Oct 2006
Messaggi: 1105
Quote:
Originariamente inviato da redcloud Guarda i messaggi
Perche equals serve a confrontare due stringhe quando esiste compareTo? Forse perchè le stringhe sono oggetti immutabili e hanno preferito sfruttare anche il metodo equals per effettuare il confronto altrimenti non avrebbe avuto senso?
equals dovrebbe ritornare true se e solo se compareTo ritorna 0...
compareTo è un operatore di ordinamento, equals è un operatore di uguaglianza,
puoi usare quello che vuoi, però è più comodo scrivere string1.equals(string2) piuttosto che string1.compareTo(string2) == 0

inoltre tu potresti voler ridefinire l'operatore equals, ma tenere compareTo immutato
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 12-12-2007, 17:49   #3
redcloud
Bannato
 
L'Avatar di redcloud
 
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
Quote:
Originariamente inviato da mad_hhatter Guarda i messaggi
equals dovrebbe ritornare true se e solo se compareTo ritorna 0...
compareTo è un operatore di ordinamento, equals è un operatore di uguaglianza,
puoi usare quello che vuoi, però è più comodo scrivere string1.equals(string2) piuttosto che string1.compareTo(string2) == 0

inoltre tu potresti voler ridefinire l'operatore equals, ma tenere compareTo immutato
Si lo so, era solo una curiosità del perchè hanno fatto questa scelta, e la mia motivazione mi sembra quella più logica.
redcloud è offline   Rispondi citando il messaggio o parte di esso
Old 13-12-2007, 00:45   #4
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
Iscritto dal: Oct 2006
Messaggi: 1105
Quote:
Originariamente inviato da redcloud Guarda i messaggi
Si lo so, era solo una curiosità del perchè hanno fatto questa scelta, e la mia motivazione mi sembra quella più logica.
in realta' non vedo perche' l'essere immutabili influisca sull'uso del metodo equals... equals e compareTo li ho sempre visti in coppia (per ogni classe che implementa un ordinamento tra le sue istanze) e il motivo e' quello che ti ho scritto nella prima risposta.

Ultima modifica di mad_hhatter : 13-12-2007 alle 00:50.
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 13-12-2007, 09:15   #5
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da redcloud Guarda i messaggi
Perche equals serve a confrontare due stringhe quando esiste compareTo? Forse perchè le stringhe sono oggetti immutabili e hanno preferito sfruttare anche il metodo equals per effettuare il confronto altrimenti non avrebbe avuto senso?
No.

Innanzitutto equals() è definito nella classe Object. Ogni sottoclasse di Object quindi ha la possibilità di fare l'override di equals() per definire in modo più corretto come stabilire se due oggetti sono "meaningfully equivalent" (di significato equivalente). E se si fa l'override di equals() si dovrebbe anche fare l'override di hashCode(). I due metodi sono legati tra di loro da un "contratto" ben preciso. Se si implementa equals() ma non hashCode() tale contratto non verrebbe più rispettato.

compareTo() invece ha un obiettivo diverso ed è legato all'interfaccia Comparable. Mai notato che se una classe ha il compareTo(), è anche Comparable??
Comparable e il metodo compareTo() servono tipicamente per determinare un ordine tra due oggetti. L'ordine fornito da un Comparable viene chiamato il "natural ordering" (ordinamento naturale). Ma è anche possibile definire N altri ordinamenti specifici implementando l'interfaccia Comparator in apposite classi separate.

Quindi, come vedi, equals() e compareTo() hanno obiettivi diversi. E infine, nota, la documentazione di compareTo() dice:

It is strongly recommended, but not strictly required that (x.compareTo(y)==0) == (x.equals(y)).

Quindi potrebbe anche capitare che equals() e compareTo() non abbiano alcuna relazione tra di loro.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 13-12-2007, 16:46   #6
redcloud
Bannato
 
L'Avatar di redcloud
 
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
Quote:
Originariamente inviato da andbin Guarda i messaggi
No.

Innanzitutto equals() è definito nella classe Object. Ogni sottoclasse di Object quindi ha la possibilità di fare l'override di equals() per definire in modo più corretto come stabilire se due oggetti sono "meaningfully equivalent" (di significato equivalente). E se si fa l'override di equals() si dovrebbe anche fare l'override di hashCode(). I due metodi sono legati tra di loro da un "contratto" ben preciso. Se si implementa equals() ma non hashCode() tale contratto non verrebbe più rispettato.

compareTo() invece ha un obiettivo diverso ed è legato all'interfaccia Comparable. Mai notato che se una classe ha il compareTo(), è anche Comparable??
Comparable e il metodo compareTo() servono tipicamente per determinare un ordine tra due oggetti. L'ordine fornito da un Comparable viene chiamato il "natural ordering" (ordinamento naturale). Ma è anche possibile definire N altri ordinamenti specifici implementando l'interfaccia Comparator in apposite classi separate.

Quindi, come vedi, equals() e compareTo() hanno obiettivi diversi. E infine, nota, la documentazione di compareTo() dice:

It is strongly recommended, but not strictly required that (x.compareTo(y)==0) == (x.equals(y)).

Quindi potrebbe anche capitare che equals() e compareTo() non abbiano alcuna relazione tra di loro.
Si questo si sapeva. Mi ero solo posto l'interrogativo. Mi hanno sempre insegnato che per comparare due oggetti si deve usare il compareTo, per verificare l'uguaglianza tra due oggetti si deve usare equals invece. Sulla maggior parte degli oggetti che ereditano Object, il metodo equals confronta soltanto gli indirizzi. Caso particolare la classe String che fa assumere al metodo equals e compareTo == 0 lo stesso significato. Perchè hanno fatto questa scelta? A mio avviso perchè dato che di default il metodo equals serve a confrontare due indirizzi, e dato che sugli oggetti String questa operazione non avrebbe senso in quanto oggetti immutabili, hanno preferito sfruttare equals per fare il confronto come per compareTo. Tutto qua. Per confrontare due oggetti io preferisco usare il compareTo, equals lo uso solo per confrontare se due riferimenti puntano allo stesso oggetto. Infatti ci sono rimasto male quando ho scoperto che

"ABC".equals("ABC")

restituisce true
redcloud è offline   Rispondi citando il messaggio o parte di esso
Old 13-12-2007, 18:02   #7
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da redcloud Guarda i messaggi
Sulla maggior parte degli oggetti che ereditano Object, il metodo equals confronta soltanto gli indirizzi.
Se equals() non viene ridefinito, sì. equals() in Object, non potendo fare in altro modo, si limita solo a confrontare i due reference.
Ma in una sottoclasse che ha un qualche stato è buona norma ridefinire correttamente equals() altrimenti due oggetti diversi ma con lo stesso identico stato non verrebbero visto come "uguali".

Quote:
Originariamente inviato da redcloud Guarda i messaggi
Caso particolare la classe String che fa assumere al metodo equals e compareTo == 0 lo stesso significato. Perchè hanno fatto questa scelta? A mio avviso perchè dato che di default il metodo equals serve a confrontare due indirizzi, e dato che sugli oggetti String questa operazione non avrebbe senso in quanto oggetti immutabili, hanno preferito sfruttare equals per fare il confronto come per compareTo.
Non vedo alcun caso particolare e non centra nulla la immutabilità.
String ha uno stato e quindi equals() viene ridefinito in modo che non si basi solamente sui reference. In più implementa Comparable e viene fatto in modo che la uguaglianza coincida per equals() e compareTo().

Come hai letto nella nota che ho riportato, è raccomandato ma non strettamente obbligatorio/richiesto. Non so dirti se nel framework ci sono delle classi che non fanno coincidere l'uguaglianza per equals() e compareTo().
Se non devi fare cose davvero particolari o "strane" è bene far coincidere l'uguaglianza.

Quote:
Originariamente inviato da redcloud Guarda i messaggi
equals lo uso solo per confrontare se due riferimenti puntano allo stesso oggetto.
equals() NON serve per confrontare i reference. Serve per stabilire se due oggetti sono di significato (contenuto) equivalente.

Quote:
Originariamente inviato da redcloud Guarda i messaggi
Infatti ci sono rimasto male quando ho scoperto che

"ABC".equals("ABC")

restituisce true
Non capisco lo stupore. equals() di String utilizza il contenuto delle stringhe per stabilire se sono uguali.
Tra l'altro, le due stringhe che hai usato sopra sono stringhe literal uguali. Il compilatore lo capisce e ne mette solo una nel constant-pool. Quindi quelle due stringhe hanno lo stesso identico reference. Ma ti dico di più. equals() di String innanzitutto verifica se this == oggetto_passato. Quindi nel caso particolare sopra ritorna subito true senza nemmeno vedere il contenuto delle stringhe.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 13-12-2007, 19:07   #8
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Quote:
Originariamente inviato da andbin Guarda i messaggi
Se equals() non viene ridefinito, sì. equals() in Object, non potendo fare in altro modo, si limita solo a confrontare i due reference.
Si, ma se non ricordo male che confronti gli indirizzi non è garantito dalle specifiche java.
infatti:
Quote:
As much as is reasonably practical, the hashCode method defined by class Object does return distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the JavaTM programming language.)
Ad esempio, come diceva giustamente il buon vecchio pgi un pò di tempo fa, su una VM a 64 bit l'hashcode non può essere un indirizzo dato che un int è a 64 bit mentre un'indirizzo è a 64 bit.
Cmq solitamente nelle implementazioni a 32 bit viene usato il reference per generare l'hashcode.
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 13-12-2007, 21:10   #9
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da ^TiGeRShArK^ Guarda i messaggi
Si, ma se non ricordo male che confronti gli indirizzi non è garantito dalle specifiche java.
infatti:
As much as is reasonably practical, the hashCode method defined by class Object does return distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the JavaTM programming language.)
E cosa centra questo con equals()??? (prima si stava parlando di equals() .....)

Ciò che hai riportato vale per hashCode(), che è più particolare perché deve ritornare un int. Anche in questo caso, nella classe Object non è che si possa usare chissà che cosa e infatti tipicamente l'intero ritornato è basato sull'indirizzo interno dell'oggetto. E la nota spiega bene la questione.

Quote:
Originariamente inviato da ^TiGeRShArK^ Guarda i messaggi
Ad esempio, come diceva giustamente il buon vecchio pgi un pò di tempo fa, su una VM a 64 bit l'hashcode non può essere un indirizzo dato che un int è a 64 bit mentre un'indirizzo è a 64 bit.
In Java un int è sempre a 32 bit, indipendentemente dalla piattaforma. Se poi l'architettura è a 64 bit e gli indirizzi sono appunto a 64 bit, per il programmatore Java non cambia nulla.

Il metodo hashCode() in Object è marcato "native", non so esattamente cosa faccia (bisognerebbe vedere i sorgenti nativi). Su una architettura a 64 bit, se dovessi farlo io, farei in modo che hashCode() prenda l'indirizzo a 64 bit nativo e ne faccia lo XOR della parte alta e bassa per ottenere un valore a 32 bit da far ritornare. E magari funziona proprio così .... (non lo so).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 13-12-2007, 21:51   #10
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Quote:
Originariamente inviato da andbin Guarda i messaggi
Il metodo hashCode() in Object è marcato "native", non so esattamente cosa faccia (bisognerebbe vedere i sorgenti nativi). Su una architettura a 64 bit, se dovessi farlo io, farei in modo che hashCode() prenda l'indirizzo a 64 bit nativo e ne faccia lo XOR della parte alta e bassa per ottenere un valore a 32 bit da far ritornare. E magari funziona proprio così .... (non lo so).
mmm...
non lo so..
se per pure sfiga ti capita la parte bassa e alta di un oggetto uguali ma scambiate hai lo stesso hashcode
sinceramente non ho idea di come sia implementato e di guardarmi i sorgenyi della VM non ne ho proprio voglia dato che x oggi la mia dose quotidiana non voluta di c me la sono dovuta sorbire (maledetto linux )
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 13-12-2007, 22:31   #11
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da ^TiGeRShArK^ Guarda i messaggi
se per pure sfiga ti capita la parte bassa e alta di un oggetto uguali ma scambiate hai lo stesso hashcode
E allora?? hashCode() non è fatto per fornire un valore univoco per ogni oggetto!

La cosa che è veramente importante è che i valori che si possono ottenere da hashCode() siano molto ben "sparpagliati".
Se poi ci sono delle collisioni, chissenefrega (più o meno... ). hashCode() viene usato tipicamente nelle hash-table (java.util.HashMap e simili). Se c'è collisione vuol solo dire che oggetti diversi ma con lo stesso hashcode andranno certamente a finire nello stesso "bucket" (anzi ... è anche possibile che oggetti con hashcode diversi vadano lo stesso a finire nello stesso bucket). Sotto un bucket ci può essere una lista di N oggetti. La lista dovrà essere scansionata e l'oggetto andrà cercato basandosi su equals().
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)

Ultima modifica di andbin : 13-12-2007 alle 22:46.
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 17-12-2007, 17:37   #12
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
Iscritto dal: Oct 2006
Messaggi: 1105
Quote:
Originariamente inviato da andbin Guarda i messaggi
E allora?? hashCode() non è fatto per fornire un valore univoco per ogni oggetto!

La cosa che è veramente importante è che i valori che si possono ottenere da hashCode() siano molto ben "sparpagliati".
Se poi ci sono delle collisioni, chissenefrega (più o meno... ). hashCode() viene usato tipicamente nelle hash-table (java.util.HashMap e simili). Se c'è collisione vuol solo dire che oggetti diversi ma con lo stesso hashcode andranno certamente a finire nello stesso "bucket" (anzi ... è anche possibile che oggetti con hashcode diversi vadano lo stesso a finire nello stesso bucket). Sotto un bucket ci può essere una lista di N oggetti. La lista dovrà essere scansionata e l'oggetto andrà cercato basandosi su equals().
potresti esplicitare quel "più o meno" riferito al chissenefrega?
grazie mille
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 17-12-2007, 18:06   #13
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da mad_hhatter Guarda i messaggi
potresti esplicitare quel "più o meno" riferito al chissenefrega?
Se sei tu che devi implementare hashCode() è chiaro che non puoi "fregartene" delle collisioni. Devi realizzare un buon algoritmo di hash che minimizzi le collisioni. E come farlo dipende ovviamente da quanti/quali dati hai come "stato" nella tua classe.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 17-12-2007, 18:44   #14
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
Iscritto dal: Oct 2006
Messaggi: 1105
Quote:
Originariamente inviato da andbin Guarda i messaggi
Se sei tu che devi implementare hashCode() è chiaro che non puoi "fregartene" delle collisioni. Devi realizzare un buon algoritmo di hash che minimizzi le collisioni. E come farlo dipende ovviamente da quanti/quali dati hai come "stato" nella tua classe.
mmm... ti spiego qual è il mio problema.

ho una classe RfidTag che contiene il membro long id. Io voglio che per una Hashtable<RfidTag, Blabla> il metodo containsKey(tag) ritorni true se nella table c'è una key tag_1 avente lo stesso id di tag anche se tag e tag_1 sono oggetti distinti. Avevo ridefinito il metodo equals di RfidTag, ma poi mi sono accorto, leggendo il sorgente del metodo containsKey(), che oltre a equals viene testato anche l'hashCode. Allora ho ridefinito il metodo hashCode in RfidTag facendo lo xor della prima metà dell'id con la seconda metà... però mi viene il dubbio che questo possa avere degli effetti collaterali pur rispettando il contratto del metodo hashCode.

Dove posso trovare info su buoni algoritmi di hash?

grazie mille per l'aiuto

PS: a che scopo dobbiamo cercare di minimizzare le collisioni? per motivi prestazionali o logico-semantici?
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 17-12-2007, 20:51   #15
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da mad_hhatter Guarda i messaggi
Allora ho ridefinito il metodo hashCode in RfidTag facendo lo xor della prima metà dell'id con la seconda metà... però mi viene il dubbio che questo possa avere degli effetti collaterali pur rispettando il contratto del metodo hashCode.
Hai fatto bene. Se ti può tranquillizzare, la classe Long fa proprio la stessa identica cosa: XOR tra la parte alta e la parta bassa del valore.

Quote:
Originariamente inviato da mad_hhatter Guarda i messaggi
Dove posso trovare info su buoni algoritmi di hash?
Non saprei dirti. Però inizia a guardare a partire da <qui>.

Quote:
Originariamente inviato da mad_hhatter Guarda i messaggi
PS: a che scopo dobbiamo cercare di minimizzare le collisioni? per motivi prestazionali o logico-semantici?
Per motivi di prestazioni.

Un caso limite che in genere viene usato per spiegare questa questione è un hashCode() che restituisce un valore costante:
Codice:
public int hashCode () {
    return 123;
}
Sarebbe perfettamente legale e non violerebbe alcun contratto. Peccato che sarebbe spaventosamente inefficiente. Immagina che succederebbe se gli oggetti della classe che ha questo hashCode() venissero usati come chiavi in una, parlando in generale, "hash-table". Tutti gli oggetti finirebbero nello stesso medesimo "bucket".
Con un valore costante in pratica ci sarebbe sempre al 100% una "collisione".
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2007, 09:49   #16
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
Iscritto dal: Oct 2006
Messaggi: 1105
molte grazie andbin!

lo xor l'ho usato perché ne avevi parlato tu qualche post più su... mi fa piacere di aver azzeccato la tecnica giusta

grazie infinite!
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
Roscosmos ha posticipato (ancora) il lan...
Isar Aerospace si prepara al secondo lan...
Tory Bruno è entrato in Blue Orig...
Fujifilm lancia la cartuccia per archivi...
Dreame H15 Mix: la soluzione 7-in-1 per ...
AirPods Pro 3 in forte sconto su Amazon:...
36 offerte Amazon, molte appena partite:...
2 caricatori multipli eccezionali: da 28...
OLED e 360 Hz a un prezzo senza preceden...
Roborock Q10 S5+ a un prezzo molto conve...
Upgrade PC a prezzo ridotto: le migliori...
Sono i 6 smartphone migliori su Amazon: ...
Google Pixel 9a a 361€, mai così ...
Super sconti sugli spazzolini Oral-B, an...
Aspira a 6000Pa, lava bene, costa 139€: ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 01:13.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v