JavaRush /Blog Java /Random-PL /Przerwa kawowa #221. Trzy sposoby znalezienia elementu w ...

Przerwa kawowa #221. Trzy sposoby znalezienia elementu w tablicy Java. Co to jest lokalny wątek Java i jak z niego korzystać

Opublikowano w grupie Random-PL

Trzy sposoby znalezienia elementu w tablicy Java

Źródło: Asyncq Ten post pomoże Ci lepiej zrozumieć różne sposoby wyszukiwania elementu w tablicy w Javie. Przerwa kawowa #221.  Trzy sposoby znalezienia elementu w tablicy Java.  Co to jest lokalny wątek Java i jak go używać - 1Znalezienie konkretnego elementu w zbiorze wartości jest bardzo powszechną i często stosowaną operacją w tworzeniu oprogramowania. Istnieją różne podejścia do rozwiązania tego problemu, od prostych po zoptymalizowane. Przyjrzyjmy się im.

Dane wejściowe

Tablica wejściowa zawiera pierwotne dane identyfikacyjne i musimy wiedzieć, czy zawiera ona id->3.
int[] ids = { 1,2,13,14,15,3,10,11,12,4,5,6,7,8,9 };
int inputId = 3;

Metoda 1 (prosta)

  1. Odwiedzamy wszystkie elementy tablicy, po jednym elemencie na raz.
  2. Dodatkowo śledzimy stan elementu docelowego, jeśli istnieje w tablicy.
  3. Gdy tylko znajdziemy ten element, zmieniamy status z false na true .
  4. Po zakończeniu pętli zwracamy flagę stanu.
boolean valExist = false;
for (int id : ids) {
   if (inputId == id) {
             valExist = true;
   }
}
return valExist;
To rozwiązanie działa, ale nie jest zbyt wydajne. Jeśli spojrzysz na warunek if , zdasz sobie sprawę, że testujemy ten warunek dla wszystkich elementów. Powiedzmy, że element, którego szukamy, jest pierwszym elementem, ale nasza pętla będzie nadal działać dla wszystkich elementów. Tutaj rozsądniej byłoby wyjść z pętli, gdy tylko znajdziemy element. Robiąc to zaoszczędzilibyśmy na obliczeniach, gdy szukany element nie znajduje się na ostatniej pozycji.
boolean valExist = false;
for (int id : ids) {
    if (inputId == id) {
                valExist = true;
                break;
     }
}
return valExist;
Możesz uczynić swój kod jeszcze bardziej zwięzłym, używając return . Możemy zwrócić wartość true , gdy tylko zobaczymy element, którego szukamy, w przeciwnym razie zwrócimy wartość false , gdy tylko pętla się zakończy. I nie musimy tworzyć i utrzymywać zmiennej stanu.
for (int id : ids) {
      if (inputId == id) {
                return true;
       }
  }
  return false;

Metoda 2

  1. Możemy użyć ArrayList zawierającej metodę, która domyślnie szuka elementu docelowego na liście.
  2. Ponieważ tę metodę udostępnia List , musimy przekonwertować naszą pierwotną tablicę na listę.
  3. Możemy użyć pojedynczego ciągu lambda, który konwertuje element pierwotny na typ obiektowy i tworzy z niego listę.
    return Arrays.asList(Arrays.stream(ids).boxed().toArray())
                  .contains(inputId);
  4. Możemy użyć Java 8 Stream API, aby nasz kod był funkcjonalny i znacznie krótszy.
  5. Aby zrozumieć, jak interfejsy Stream API współpracują ze strumieniami, musimy przekonwertować naszą tablicę wejściową na strumień.
  6. Arrays.stream pobiera tablicę wejściową i konwertuje ją na strumienie.
  7. Teraz, gdy mamy wątki, możemy użyć wielu przydatnych metod, z których jedną jest anyMatch . Zwraca element pasujący do predykatu (id == inputId) .
  8. Wszystko to sprawia, że ​​nasz kod jest znacznie krótszy i łatwiejszy do odczytania.
    return Arrays.stream(ids)
              .anyMatch(id -> id == inputId);

Metoda 3 (zoptymalizowana)

Tak, kod pokazany powyżej działa i jest łatwy do odczytania, ale nadal musimy odwiedzić i porównać każdy element w strumieniu.
  1. Jeśli pamięć nie stanowi problemu i chcemy zoptymalizować obliczenia, jedną z rzeczy, które możemy tutaj zrobić, jest utworzenie zestawu z tablicy wejściowej.
  2. Możemy ponownie użyć kodu stylu funkcjonalnego, aby przekonwertować pierwotną tablicę na Set .
  3. Teraz, gdy mamy już Set , możemy szukać elementu w stałym okresie czasu.
S
et<Integer> idsSet = Arrays.stream(ids).boxed().collect(Collectors.toSet());
return idsSet.contains(inputId);

Premia

Wyszukiwanie pojedynczego elementu można uznać za typową operację, ale bardziej powszechne jest wyszukiwanie wielu elementów w tablicy. W tym przypadku, jeśli nie użyjemy Set , będziemy mieli dwie pętle, a złożoność czasowa wzrośnie, aby pomnożyć długość dwóch kolekcji. Poniżej znajduje się przykład, w którym konwertujemy jedną z tablic jako zbiór, a następnie iterujemy po drugiej tablicy i przeprowadzamy wyszukiwanie w operacji na zestawie. W ten sposób zwiększamy pamięć i jednocześnie oszczędzamy na obliczeniach.
int[] targetIds = { 1, 3, 6, 88, 999, 34, 44, 55};
int[] ids = { 1,2,13,14,15,3,10,11,12,4,5,6,7,8,9 };


Set<Integer> idsSet = Arrays.stream(ids).boxed().collect(Collectors.toSet());
return Arrays.stream(targetIds)
            .boxed()
            .filter(id -> !idsSet.contains(id))
            .mapToInt(a -> a)
            .toArray();

Co to jest lokalny wątek Java i jak z niego korzystać

Źródło: Medium W tym artykule przyjrzymy się lokalnemu wątkowi Java i sposobom jego efektywnego wykorzystania w aplikacjach Java. Przerwa kawowa #221.  Trzy sposoby znalezienia elementu w tablicy Java.  Co to jest lokalny wątek Java i jak go używać - 2Java Thread Local to zaawansowana funkcja, która umożliwia programistom tworzenie zmiennych tylko dla określonego wątku. Oznacza to, że każdy wątek może mieć własną kopię zmiennej, a zmiany wprowadzone w zmiennej w jednym wątku nie będą miały wpływu na jej wartość w innym wątku.

Co to jest wątek lokalny

Thread Local to klasa w interfejsie API języka Java, która umożliwia tworzenie zmiennych lokalnych dla określonego wątku. Oznacza to, że każdy wątek ma własną kopię zmiennej, a zmiany wprowadzone w zmiennej w jednym wątku nie wpływają na jej wartość w innym wątku. To sprawia, że ​​Thread Local jest idealnym rozwiązaniem do przechowywania danych specyficznych dla wątku, takich jak informacje uwierzytelniające użytkownika, połączenia z bazą danych lub inne informacje specyficzne dla wątku.

Jak działa wątek lokalny w Javie

Aby używać Thread Local w aplikacji Java, musisz najpierw utworzyć instancję klasy Thread Local . Można to zrobić wywołując konstruktor ThreadLocal , który utworzy nową instancję tej klasy. Następnie, tworząc obiekt Thread Local , możesz go używać do przechowywania i pobierania danych specyficznych dla wątku. Oto przykład użycia Thread Local w aplikacji Java:
public class MyThreadLocalClass {
  private static final ThreadLocal<String> threadLocal = new ThreadLocal<>();

  public static void set(String value) {
    threadLocal.set(value);
  }

  public static String get() {
    return threadLocal.get();
  }
}
W tym przykładzie utworzyliśmy obiekt Thread Local o nazwie threadLocal typu String . Stworzyliśmy także dwie metody: set() i get() , które pozwalają nam przechowywać i pobierać wartość zmiennej lokalnej wątku . Aby zapisać wartość w zmiennej lokalnej wątku , po prostu wywołujemy metodę set() i przekazujemy wartość, którą chcemy przechowywać. Na przykład możemy wywołać MyThreadLocalClass.set("Hello, World!") , aby zapisać ciąg znaków "Hello, World!" w zmiennej lokalnej wątku . Aby uzyskać wartość zmiennej lokalnej wątku , po prostu wywołujemy metodę get() . Na przykład możemy wywołać String value = MyThreadLocalClass.get() , aby uzyskać wartość zmiennej lokalnej wątku .

Zalecenia dotyczące pracy z Thread Local

Chociaż Thread Local może być potężnym narzędziem w aplikacjach Java, ważne jest, aby używać go poprawnie, aby uniknąć potencjalnych problemów. Oto kilka wskazówek, o których należy pamiętać podczas korzystania z Thread Local :
  1. Używaj Thread Local tylko wtedy, gdy jest to konieczne: tylko dla danych specyficznych dla wątku. Jeśli dane nie są specyficzne dla wątku, muszą być przechowywane w inny sposób.
  2. Unikaj nadmiernego użycia pamięci: Thread Local może zużywać znaczną ilość pamięci, jeśli nie jest używany ostrożnie. Pamiętaj, aby wyczyścić zmienne lokalne wątku , gdy nie są już potrzebne, aby uniknąć nadmiernego zużycia pamięci.
  3. Używaj Thread Local ostrożnie w środowiskach wielowątkowych: ważne jest, aby zrozumieć potencjalne ryzyko i ograniczenia. Pamiętaj, aby dokładnie przetestować swój kod, aby upewnić się, że Thread Local działa zgodnie z oczekiwaniami w Twoim konkretnym środowisku.

Wniosek

Java Thread Local to świetne narzędzie, które pozwala programistom tworzyć zmienne tylko dla określonego wątku. Używając Thread Local , możesz przechowywać dane specyficzne dla wątku, takie jak informacje uwierzytelniające użytkownika, połączenia z bazą danych lub inne informacje specyficzne dla wątku. Chociaż Thread Local może być potężnym narzędziem, ważne jest, aby używać go poprawnie, aby uniknąć potencjalnych problemów. Postępując zgodnie z najlepszymi praktykami i testując swój kod, możesz go efektywnie wykorzystać do poprawy wydajności i niezawodności aplikacji Java.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION