| 
					
							
        
    
        
						
			 | 
			
			
					    
					
        
         
          
         
	
            | 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
            
              |   |   
            
        
 
    
 
					
					 
			 | 
			
				
        
			 |