[Java] Wat is String.intern()

Pagina: 1
Acties:
  • 100 views sinds 30-01-2008
  • Reageer

  • Baron
  • Registratie: Juli 2000
  • Laatst online: 30-01 15:04
Ik heb een probleem gehad, maar heb het slechts per toeval kunnen oplossen.

Dit was mijn debug code:
Java:
1
2
3
  String fromConnection2 = "out1";
  if (fromConnection.equals(fromConnection2)) System.out.println("Ze zijn gelijk");
  iod.Connect(fromIOblock, fromConnection, toIOblock);


Dit is de output
code:
1
  Ze zijn gelijk


Wijzig ik regel 3 in
Java:
1
  iod.Connect(fromIOblock, fromConnection2, toIOblock);

Dan werkt het wel.

Ik heb uiteindelijk het probleem kunnen oplossen op volgende manier:
Java:
1
  iod.Connect(fromIOblock, fromConnection.intern(), toIOblock);


Kan iemand mij vertellen waarom mijn eerste manier niet werkte en waarom ik intern moet gebruiken?

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • sphere
  • Registratie: Juli 2003
  • Laatst online: 12:43

sphere

Debian abuser

Volgens mij is wat er in de titel staat geen "soup question", maar wil de TS weten waarom hij intern() op zijn String from fromConnection moet aanroepen. Kennelijk faalt het als hij dat niet doet, maar ik ben wel geinteresseerd in de foutmelding.

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454


  • Baron
  • Registratie: Juli 2000
  • Laatst online: 30-01 15:04
Deze link had ik ook al gevonden, maar het geeft geen antwoord op mijn vraag.

  • Baron
  • Registratie: Juli 2000
  • Laatst online: 30-01 15:04
sphere schreef op donderdag 28 september 2006 @ 15:25:
Volgens mij is wat er in de titel staat geen "soup question", maar wil de TS weten waarom hij intern() op zijn String from fromConnection moet aanroepen. Kennelijk faalt het als hij dat niet doet, maar ik ben wel geninteresseerd in de foutmelding.
Ik was eigenlijk vertrokken van constante Strings in het programma en toen werkte alles prima.
Achteraf heb ik variabelen toegevoegd, en toen werkte het niet meer.
Ik geen fout gehad, maar het programma werkte gewoon niet.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 13-02 14:38
Ik weet niet wat die iod doet, maar blijkbaar vergelijkt hij objecten op identiteit (met ==) in plaats van op structurele gelijkheid (met equals). Twee 'gelijke' strings kunnen best verschillende objecten zijn (dus: a.equals(b) terwijl a != b); het punt van intern() is dat die methode voor gelijke strings een unieke representant oplevert, waardoor de vergelijking op identiteit (met == in plaats van equals) ook werkt.

De reden dat het met constanten wel werkte, is waarschijnlijk dat literals automatisch geinternalized worden. Dat geldt niet voor dynamische strings.

De echte vraag is natuurlijk waarom dat iod-ding objecten met == vergelijkt. Dat lijkt me een implementatiefout.

[ Voor 12% gewijzigd door Soultaker op 28-09-2006 15:30 ]


  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Met String.intern() krijg je gewoon een reference terug naar een reeds bestaande string aan de hand van de inhoud van die string. Als je een klasse hebt die references naar objecten gebruikt ipv te kijken naar de inhoud ervan zul je een reference naar je originele string nodig hebben ipv een nieuwe string met dezelfde inhoud. Met String.intern() krijg je die.

Ik weet niet in hoeverre dat van toepassing is want ik weet niet welke objecten je gebruikt.

offtopic:
*Shakes fist at Soultaker*

[ Voor 3% gewijzigd door CyBeR op 28-09-2006 15:31 ]

All my posts are provided as-is. They come with NO WARRANTY at all.


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 13-02 11:06

Janoz

Moderator Devschuur®

!litemod

Misschien kun je iets meer vertellen over wat er in het oid object gebeurt? Dat is duidelijk geen standaar java object aangezien de methodenaam met een hoofdletter begint. Waarschijnlijk is hierin een fout gemnaakt door een string te vergelijken met == ipv .equals().

edit:hmmm, volgende keer gewoon op submit drukken ipv eerst een binnengekomen telefoontje afhandelen :X..

[ Voor 16% gewijzigd door Janoz op 28-09-2006 15:36 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Baron
  • Registratie: Juli 2000
  • Laatst online: 30-01 15:04
Jullie hebben allemaal gelijk. Ik heb me gewoon blind gestaard op de werkende code en de inhoud van de string.
Er is ergens s1 == s2 gebruikt ipv s1.equals(s2)
Pagina: 1