Sunday, March 8, 2009

Java -- tricks

Drobne tricki niespotykane w C++:

1. inicjalizacja atrybutów klasy: jak wiadaomo bywa to problematyczne. Ale jest magiczny trick

class Spoon {
static int i;
static {
i = 47;
}
}


który można również zastosować dla niestatycznych atrybutów.

2. metoda finalize() jest wywoływana _przed_ zebraniem przez Garbage Collector. Nie można nią więc czyścić elementu z ekranu (trzeba to zrobić manualnie), ale można np. sprawdzić czy obiekt został wyczyszczony (i znaleźć tym sposobem ew. pluskwiaka
).

Źródło: Thinking in Java 3rd edition

Sunday, February 15, 2009

Array vs LinkedList vs ArrayList vs Vector

Męczy nas ostatnio problem wydajności kolekcji w Javie.

Przeprowadziliśmy więc kilka zasadniczych testów, z których główny wniosek jest taki, że najszybsze są zwykłe tablice.

TODO: zrobić z tego jakies obrazki.

przebieganie listy (for each):
























































































LinkedListArrayListArrayList.ensureCapacity()VectorVector.ensureCapacity()Array
50 14 5 1 2 2 0
100 3 3 3 3 4 1
200 7 6 5 7 7 1
500 17 19 13 18 18 7
1000 36 31 26 35 36 1
2000 84 67 53 65 65 23
5000 422 169 292 172 163 99
10000 1950 654 1023 489 491 636




tworzenie i wypełnianie:

LinkedList ArrayList ArrayList.ensureCapacity() Vector Vector.ensureCapacity() Array
1 0 0 0 0 0 0
5 0 0 0 0 0 0
10 0 0 0 0 0 0
50 14 5 1 2 2 0
100 3 3 3 3 4 1
200 7 6 5 7 7 1
500 17 19 13 18 18 7
1000 36 31 26 35 36 11
2000 84 67 53 65 65 23
5000 422 169 292 172 163 99
10000 1950 654 1023 489 491 636

W razie gdyby od czasu do czasu była potrzebna reprezentacja tablicy jako listy istnieje metody statyczna Arrays.asList(), która "w miejscu" przekonwertuje nam tablicę na listę. Tutaj "w miejscu" oznacza, że lista ta będzie niemodyfikowalna, a dane nie zostaną skopiowane. Nałożenie interfejsu listy na tablicę troszkę jednak trwa (patrz wynik), choć i tak jest szybsze niż działanie bezpośrednio na listach (pod warunkiem, że działanie na listach jest nam potrzebne rzadko)

http://java.sun.com/j2se/1.5.0/docs/api/java/util/Arrays.html#asList(T...)







inne informacje na podobny temat:
linked list vs array list

chaoticjava.com

Saturday, February 7, 2009

Locale w Javie

Statyczna metoda String.format() zawsze zwraca wynik w aktualnych (dla JVM) localsach (źródło: sun).
Można je wprawdzie zmienić używając metody setDefault() z klasy java.util.Locale, ale zwykle nie będzie to najładniejsze rozwiązanie.

W takim wypadku lepiej użyć klasy Formatter i metody format().