JavaRush /Blog Java /Random-PL /Przerwa kawowa #176. Podobieństwa i różnice między Array ...

Przerwa kawowa #176. Podobieństwa i różnice między Array i ArrayList. Jak napisać efektywną metodę równości().

Opublikowano w grupie Random-PL

Podobieństwa i różnice między Array i ArrayList

Źródło: Medium W tym artykule skupiono się na zrozumieniu pojęć Array i ArrayList oraz różnic między nimi. Przerwa kawowa #176.  Podobieństwa i różnice między Array i ArrayList.  Jak napisać wydajną metodę równości() - 1

Tablica Java

Tablica to struktura danych, która umożliwia przechowywanie uporządkowanej sekwencji wartości tego samego typu. Można na przykład utworzyć tablicę znaków, liczb i tak dalej. Dotyczy to wszystkich typów pierwotnych, a nawet obiektów takich jak String . Po utworzeniu tablicy nie możemy zmienić jej rozmiaru. Oto ogólny przykład deklarowania zmiennej referencyjnej tablicy i alokacji tablicy:
dataType[] arrayName = new dataType[numElements];
Jeśli spróbujemy dodać więcej niż rozmiar tablicy, otrzymamy wyjątek ArrayIndexOutOfBoundsException .

Deklaracja tablicy

Aby zadeklarować tablicę, użyj znaków [ ] po typie danych. Wskazują, że zmienna jest referencją do tablicy. Zmienna odniesienia do tablicy może odnosić się do tablic o różnych rozmiarach. Słowo kluczowe new tworzy miejsce w pamięci do przechowywania tablicy z określoną liczbą elementów. Przypisana jest zmienna odniesienia do tablicy, która odnosi się do nowo przydzielonej tablicy. Poniższy przykład deklaruje zmienną odniesienia do tablicy gameScores , przydziela tablicę czterech liczb całkowitych i przypisuje gameScores tak, aby odnosiła się do przydzielonej tablicy.
int[] gameScores = new int[4];
Elementy tablicy są automatycznie inicjowane do wartości domyślnych, gdy użyjesz słowa kluczowego new do zainicjowania odwołania do tablicy. Wartość domyślna dla elementów typu danych całkowitych i zmiennoprzecinkowych to zero, a wartość domyślna dla elementów typu Boolean to false . Można także zadeklarować zmienną odniesienia do tablicy bez natychmiastowego przydzielania tablicy, a następnie przypisać zmienną do przydzielonej tablicy.
int[] gameScores;

gameScores = new int[4];

Inicjowanie tablicy z wartościami innymi niż domyślne

Możesz inicjować elementy tablicy wartościami innymi niż domyślne, podając wartości początkowe w nawiasach klamrowych {} oddzielonych przecinkami.
int [] myArray = { 5 , 7 , 11 };
Powyższy przykład tworzy tablicę trzech elementów całkowitych o wartościach 5, 7 i 11. Inicjalizacja tablicy nie wymaga użycia słowa kluczowego new , ponieważ rozmiar tablicy jest automatycznie ustawiany na liczbę elementów w nawiasy klamrowe. W przypadku dużych tablic inicjalizację można przeprowadzić, najpierw definiując tablicę, a następnie używając pętli do przypisania elementów tablicy. Dostęp do elementów tablicy można uzyskać za pomocą ich indeksów liczonych od zera.
Int[ ] intArray = new int [ ] {2};
intArray [0] = 1;
intArray [1] = 2;

Lista tablic

ArrayList to uporządkowana lista elementów typu referencyjnego o zmiennym rozmiarze . Jest to także klasa z pakietu java.util należąca do Java Collection Framework. ArrayList udostępnia nam dynamiczne tablice i automatycznie obsługuje zmianę ich rozmiaru. W miarę dodawania elementów do listy ArrayList rozmiar jej pamięci automatycznie wzrasta. Możesz użyć ArrayList za pomocą importu java.util.ArrayList; . Możemy również utworzyć instancję ArrayList za pomocą następującej instrukcji:
ArrayList<Type> arrayList = new ArrayList<Type>();
ArrayList może się powiększać , aby pomieścić potrzebne elementy. ArrayList nie obsługuje typów pierwotnych, takich jak int , ale raczej typy referencyjne, takie jak Integer . Częstym błędem wśród początkujących jest deklarowanie ArrayList typu pierwotnego, takiego jak int , jak w ArrayList<int> myVals . Powoduje to błąd kompilacji: „nieoczekiwany typ, znaleziony: int, wymagany: odwołanie”. Przykład: Stwórzmy obiekt ArrayList o nazwie samochody , w którym będą przechowywane ciągi znaków:
import java.util.ArrayList;

ArrayList<String> cars = new ArrayList<String>();
Aby dodać elementy do ArrayList , użyj metody add() . Aby uzyskać dostęp do elementu tablicy ArrayList , używana jest metoda get() .
cars.add("Tesla");
cars.add("BMW");
cars.add("Kia");
cars.get(0);
Różnica pomiędzy wbudowaną tablicą a ArrayList w Javie polega na tym, że w pierwszym przypadku nie można zmienić rozmiaru tablicy (jeśli chcesz dodać lub usunąć elementy do/z tablicy, musisz utworzyć nową ). Natomiast w ArrayList elementy można dodawać i usuwać w dowolnym momencie.

Podobieństwa między Array i ArrayList

  • Array i ArrayList służą do przechowywania elementów.
  • Array i ArrayList mogą przechowywać wartości null.
  • Obydwa procesy zachodzą w stałym czasie.
  • Mogą mieć zduplikowane wartości.
  • Array i ArrayList nie gwarantują obecności uporządkowanych elementów.

Kluczowe różnice między Array i ArrayList

Główną różnicą pomiędzy tablicą ( Array ) a ArrayList jest statyczna natura tablicy i dynamiczna natura ArrayList . Po utworzeniu nie można zmienić rozmiaru tablicy, natomiast ArrayList może zmienić jej rozmiar w razie potrzeby. Kolejną ważną różnicą jest to, że tablica jest podstawową funkcjonalnością zapewnianą przez Javę. Z drugiej strony ArrayList jest częścią frameworku kolekcji w Javie. Dostęp do elementów tablicy możemy uzyskać za pomocą nawiasu kwadratowego, w którym możemy określić indeks. Chociaż istnieje zestaw metod uzyskiwania dostępu do elementów ArrayList i ich zmiany. Chociaż są one różne, oba są jednak porównywalne pod innymi względami. Obie te struktury danych w Javie opierają się na indeksach i umożliwiają przechowywanie obiektów. Dodatkowo dopuszczają wartości null i duplikaty. Jeśli znasz z góry rozmiar obiektów, lepiej użyć tablicy. Jeśli jednak nie jesteś pewien rozmiaru, powinieneś zamiast tego użyć ArrayList .

Jak napisać efektywną metodę równości().

Źródło: Medium Ten post pomoże Ci lepiej zrozumieć użycie metody równości() podczas pracy z kodem Java. Jeśli mówimy o domyślnej metodzie równości() i bez żadnej implementacji, to pod wieloma względami jest ona podobna do operacji == . Oznacza to, że ta metoda porównuje obiekty. Na przykład funkcja równa() porównuje dwa ciągi znaków i zwraca wartość true , jeśli ciągi są równe, lub false , jeśli nie są. Należy pamiętać, że operator == nie jest zalecany do porównywania obiektów w Javie. Powodem jest to, że podczas porównywania obiektów == zwróci wartość true tylko wtedy, gdy odniesienia wskazują na ten sam obiekt. Najłatwiejszym sposobem uniknięcia problemów jest nie zastępowanie metody równości , w którym to przypadku każda instancja klasy jest równa tylko sobie. Przesłonięcie równości jest konieczne tylko wtedy, gdy klasa ma koncepcję równości logicznej różniącą się od prostej tożsamości obiektu, a nadklasa nie nadpisała jeszcze równości. Zatem korzystając z metody równości() należy sprawdzić, czy odniesienia do obiektów są logicznie równoważne i czy odnoszą się do tego samego obiektu.

Właściwości metody równości

Każda metoda równości implementuje relację równoważności . Posiada następujące właściwości:
  • Odruchowe : dla dowolnej wartości referencyjnej innej niż null x, x.equals (x) musi zwracać wartość true .

  • Symetryczny : Dla dowolnych niezerowych wartości referencyjnychx i y , x.equals(y) musi zwracać wartość true tylko wtedy, gdy y.equals(x) zwraca wartość true .

  • Przechodni : Dla dowolnych wartości referencyjnych x , y , z , które nie są null, jeśli x.equals(y) zwraca true i y.equals(z) zwraca true , to x.equals(z) również musi zwracać true .

  • Spójne : Dla dowolnych niezerowych wartości referencyjnych x i y, wielokrotne wywołania x.equals(y) muszą konsekwentnie zwracać wartość true lub konsekwentnie zwracać wartość false .

  • Non-nullity : dla dowolnej wartości referencyjnej x innej niż null wartość x.equals (null) musi zwracać false .

Przyjrzyjmy się bliżej każdej nieruchomości:

refleksyjność:

Obiekt musi być równy sobie. Aby to sprawdzić, dodaj instancję swojej klasy do kolekcji. Metoda zawiera może wskazywać, że kolekcja nie zawiera właśnie dodanej instancji.

Symetria:

Dwa obiekty (mogą należeć do różnych klas) muszą być sobie równe.

Podsekwencja:

Nie pisz metody równości , która zależy od zawodnych/niestabilnych zasobów.

Niezerowe:

Zawsze zwraca wartość true , jeśli obiekt przekazany do równości ma wartość null .

Podsumujmy:

Oto przepis na metodę równości jakości :
  1. Użyj operatora == , aby sprawdzić, czy argument jest referencją do tego obiektu.

  2. Użyj operatora instancjiof , aby sprawdzić, czy argument jest poprawnego typu.

  3. Rzuć argument na właściwy typ.

  4. Dla każdego „istotnego” pola w klasie sprawdź, czy to pole argumentu pasuje do odpowiedniego pola tego obiektu:

    • W przypadku pól pierwotnych: których typ nie jest typu float ani double , do porównań użyj operatora == .
    • W przypadku pól referencyjnych do obiektów: wywołaj rekurencyjnie metodę równości; dla pól zmiennoprzecinkowych użyj metody statycznej Float.compare(float, float); a dla podwójnych pól użyj Double.compare(double, double) .
    • W przypadku pól tablicowych: Zastosuj te wytyczne do każdego elementu. Jeśli każdy element w polu tablicowym jest znaczący, użyj jednej z metod Arrays.equals() .
    • Niektóre pola odnośników do obiektów mogą zawierać wartości null . Aby uniknąć zgłaszania wyjątku NullPointerException , sprawdź równość takich pól przy użyciu metody statycznej Objects.equals(Object, Object) .
  5. Kiedy skończysz pisać metodę równości , zadaj sobie trzy pytania: Czy jest ona symetryczna? Czy jest przechodni? Czy jest konsekwentny?

I pamiętaj, zawsze zastępuj hashCode , gdy nadpisujesz równa się .
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION