/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
java.util.Vector problemer
Fra : Janus


Dato : 23-11-05 15:56


Jeg sidder her og er ved at hive håret ud af mig selv, forstår slet
ikke, hvad der sker her:

Jeg opretter en Vector ( Vector v = new Vector() )og tilføjer i en løkke
nogle elementer til den vha. addElement().

Elementerne jeg add'er er af typen String[][], men når jeg printer
elementerne ud igen, er de alle ens! De er alle sammen det sidste
element, jeg tilføjede.

Jeg ved, at det er forskellige elementer jeg tilføjer, har testet det, men

Object[] w = v.toArray();
for (int i = 0; i < w.length; i++) {
   String[][] ww = (String[][])w[i];
   System.out.println(ww[1][1] + " " + ww[2][1]);
}

giver samme resultat ("3 3", "3 3", "3 3") i stedet for det korrekte ("1
3", "2 3", "3 3").

Java build 1.5.0_05-b05


Med venlig hilsen

Janus

 
 
Thorbjoern Ravn Ande~ (23-11-2005)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 23-11-05 16:08

Janus <nospam@nomail.com> writes:

> Elementerne jeg add'er er af typen String[][], men når jeg printer
> elementerne ud igen, er de alle ens! De er alle sammen det sidste
> element, jeg tilføjede.

Har du lige saa mange new String[][] som du har elementer?

--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk/ravn/

Janus (23-11-2005)
Kommentar
Fra : Janus


Dato : 23-11-05 16:57

Thorbjoern Ravn Andersen wrote:
> Janus <nospam@nomail.com> writes:
>
>
>>Elementerne jeg add'er er af typen String[][], men når jeg printer
>>elementerne ud igen, er de alle ens! De er alle sammen det sidste
>>element, jeg tilføjede.
>
>
> Har du lige saa mange new String[][] som du har elementer?
>

Tænkte netop på, hvad problemet nok er:

Jeg opretter eet element af typen String[][] og genbruger det, når jeg
tilføjer til Vectoren. Eftersom Vectoren (åbenbart) bruger referencer
til objektet, er det jo klart, at det bliver til x kopier af det sidst
indsatte!!



--

Kids, try this at home: http://www.legendsrpg.net/index.php?refid=799

Thorbjoern Ravn Ande~ (23-11-2005)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 23-11-05 21:39

Janus <nospam@nomail.com> writes:

> Jeg opretter eet element af typen String[][] og genbruger det, når jeg
> tilføjer til Vectoren. Eftersom Vectoren (åbenbart) bruger referencer
> til objektet, er det jo klart, at det bliver til x kopier af det sidst
> indsatte!!

Der bruges altid referencer i forbindelse med objekter.

Vil du have nye objekter er der ingen vej uden om en new. Det er til
gengaeld ogsaa billigt i Java.
--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk/ravn/

Janus (25-11-2005)
Kommentar
Fra : Janus


Dato : 25-11-05 02:35

Thorbjoern Ravn Andersen wrote:
> Janus <nospam@nomail.com> writes:
>
>
>>Jeg opretter eet element af typen String[][] og genbruger det, når jeg
>>tilføjer til Vectoren. Eftersom Vectoren (åbenbart) bruger referencer
>>til objektet, er det jo klart, at det bliver til x kopier af det sidst
>>indsatte!!
>
>
> Der bruges altid referencer i forbindelse med objekter.
>
> Vil du have nye objekter er der ingen vej uden om en new. Det er til
> gengaeld ogsaa billigt i Java.

Ja, det kostede mig kun et par timer at lære ... billigt sluppet.
Jeg itererede over nogle objekter, hvis data jeg lagde over i en række
af static String[] S_n = {"object_property", "value"} og smed ned i en
Vector for at samle dem sammen og efterfølgende skrive dem til disken.
Lod blot String[]s'nes konstruktører indgå som del af løkken, så var den
s**** slået.

Og til efterfølgende replies:

Det er nu kun ganske få objekter jeg skal iterere over (vel maks 20
stykker) og så er det blot til lidt I/O en sjælden gang imellem, så
performance er ikke et problem. Men tak for tippet med ArrayList, det må
jeg lige kigge lidt nærmere på i fremtidige projekter :)

Er der egentlig en nem måde at lave en shallow copy eller hvad det nu
hedder, af et objekt?


Mvh Janus


Thorbjoern Ravn Ande~ (25-11-2005)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 25-11-05 04:08

Janus <nospam@nomail.com> writes:

> af static String[] S_n = {"object_property", "value"} og smed ned i en
> Vector for at samle dem sammen og efterfølgende skrive dem til
> disken. Lod blot String[]s'nes konstruktører indgå som del af løkken,

Det lyder som Properties du skal have fat i.

> Er der egentlig en nem måde at lave en shallow copy eller hvad det nu
> hedder, af et objekt?

clone(). Kraever normalt kodning.
--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk/ravn/

Thorbjoern Ravn Ande~ (25-11-2005)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 25-11-05 04:10

Thorbjoern Ravn Andersen <nospam0000@gmail.com> writes:

> > Er der egentlig en nem måde at lave en shallow copy eller hvad det nu
> > hedder, af et objekt?
>
> clone(). Kraever normalt kodning.

Overholder dine objekter kravene til JavaBeans (saedvanligvis
Serializable og getXXX/setXXX) saa kig paa BeanUtils fra Jakarta.

--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk/ravn/

Soren Kuula (23-11-2005)
Kommentar
Fra : Soren Kuula


Dato : 23-11-05 23:27

Janus wrote:
> Thorbjoern Ravn Andersen wrote:

En sidebemaerkning: Brug ikke Vector, brug List -- LinkedList eller
ArrayList. De er nyere, paenere i APIet og lidt hurtigere fordi de ikke
er synchronized.

MVH.
Soeren

Thorbjoern Ravn Ande~ (24-11-2005)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 24-11-05 00:05

Soren Kuula <dongfang@dongfang.dk> writes:

> En sidebemaerkning: Brug ikke Vector, brug List -- LinkedList eller
> ArrayList. De er nyere, paenere i APIet og lidt hurtigere fordi de
> ikke er synchronized.

ArrayList er generelt god at bruge i stedet for Vector, men med mindre
man VED hvorfor, er det emm mindre vigtigt.

--
Thorbjørn Ravn Andersen


Simon [2700] (26-11-2005)
Kommentar
Fra : Simon [2700]


Dato : 26-11-05 14:37


> ArrayList er generelt god at bruge i stedet for Vector, men med mindre
> man VED hvorfor, er det emm mindre vigtigt.

jeg kunne da godt tænke mig at vide hvorfor, så hvis du har lyst til at
skrive en forklaring læser jeg den gerne :)
mvh:Simon



Thorbjoern Ravn Ande~ (26-11-2005)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 26-11-05 17:00

"Simon [2700]" <devnull@linux.org> writes:

> > ArrayList er generelt god at bruge i stedet for Vector, men med mindre
> > man VED hvorfor, er det emm mindre vigtigt.
>
> jeg kunne da godt tænke mig at vide hvorfor, så hvis du har lyst til at
> skrive en forklaring læser jeg den gerne :)

Der er flere ting:

1) Pænere API

http://java.sun.com/docs/books/tutorial/collections/interfaces/list.html

2) List er en del af Collections oprydnigen som har mange faciliteter
til at konvertere frem og tilbage mellem de forskellige ting. Det
er nemmere at håndtere. ArrayList er den List implementation der
ligner Vector mest.

se fx Arrays.asList(..) og List.toArray(...).


3) Vector er Synchronized. Det er ArrayList ikke.

Se fx punkt 17 i
http://www.javacommerce.com/displaypage.jsp?name=java_performance.sql&id=18264

Der antydes også at der ikke checkes eksplicit for
OutOfBoundsException. Eftersom moderne JIT'er kan både inline
metodekald (så get(12) erstattes med koden i get() med værdien 12)
samt bortoptimere unødvendige checks giver dette en bedre hastighed.


Personligt er jeg efterhånden gået helt over til:

List l = new ArrayList();

og så bruge Collections tingene herefter.

--
Thorbjørn Ravn Andersen


Arne Vajhøj (21-12-2005)
Kommentar
Fra : Arne Vajhøj


Dato : 21-12-05 19:25

Thorbjoern Ravn Andersen wrote:
> 2) List er en del af Collections oprydnigen som har mange faciliteter
> til at konvertere frem og tilbage mellem de forskellige ting. Det
> er nemmere at håndtere. ArrayList er den List implementation der
> ligner Vector mest.

Da Vector er en List implementation så ...

> 3) Vector er Synchronized. Det er ArrayList ikke.
>
> Se fx punkt 17 i
> http://www.javacommerce.com/displaypage.jsp?name=java_performance.sql&id=18264
>
> Der antydes også at der ikke checkes eksplicit for
> OutOfBoundsException. Eftersom moderne JIT'er kan både inline
> metodekald (så get(12) erstattes med koden i get() med værdien 12)
> samt bortoptimere unødvendige checks giver dette en bedre hastighed.

Vector er simpelthen langsommere end ArrayList p.g.a.
overheadet ved synchronized.

Og jeg vil også anbefale ArrayList i multithreaded
sammenhæng.

Min erfaring er at man i de fleste tilfælde alligevel
skal synkronisere på et højere niveau.

En klassisk fejl er når folk tror at fordi Vector
har synchronized metoder så er deres app som bruger Vector
automatisk thread safe.

> Personligt er jeg efterhånden gået helt over til:
>
> List l = new ArrayList();

Det er vist det som alle anbefaler.

Arne

Søg
Reklame
Statistik
Spørgsmål : 177547
Tips : 31968
Nyheder : 719565
Indlæg : 6408797
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste