JavaRush /Blog Java /Random-PL /Analiza pytań i odpowiedzi z rozmów kwalifikacyjnych dla ...

Analiza pytań i odpowiedzi z rozmów kwalifikacyjnych dla programisty Java. Część 8

Opublikowano w grupie Random-PL
Praktyka czy teoria? Co jest ważniejsze? Wielu powie, że oczywiście ważniejsza jest praktyka. Na przykład ćwicz tak ciężko, jak tylko możesz, a będziesz szczęśliwy. Ośmielam się się z tym nie zgodzić. Analiza pytań i odpowiedzi z rozmów kwalifikacyjnych dla programisty Java.  Część 8 - 1Podczas rozmów kwalifikacyjnych nikt nie będzie wiedział, jak dobry jesteś w praktyce. Zostaniesz poproszony o pełną treść, dokładnie zgodnie z teorią. I dopiero wtedy, gdy przejdziesz wszystkie rundy rozmów kwalifikacyjnych i dostaniesz się do projektu, wykorzystasz swoje praktyczne umiejętności. Możesz sprzeciwić się: czasami dają ci zadanie testowe i nadal potrzebna jest praktyka. Nie upieram się, czasem się je podaje, ale faktem jest, że CZASAMI, ale ZAWSZE odbywa się wywiad teoretyczny. Czy czujesz różnicę? Dlatego trzeba mieć pod nogami solidny fundament teoretyczny, który dzisiaj będziemy nadal wzmacniać. Mianowicie będziemy w dalszym ciągu analizować pytania , które często pojawiają się podczas rozmów kwalifikacyjnych.

71. Co się stanie, jeśli nie zastąpimy metody toString() dla Enum?

Powiedzmy, że mamy następujące wyliczenie :
public enum Role {
   STUDENT,
   TEACHER,
   DIRECTOR,
   SECURITY_GUARD;
}
Wyświetlmy ucznia w konsoli, wywołując na nim funkcję toString() :
System.out.println(Role.STUDENT.toString());
Wynik w konsoli:
STUDENT
Oznacza to, że domyślnie toString() dla wyliczenia jest nazwą samej stałej.

72. Czy można określić konstruktor wewnątrz Enum?

Tak, oczywiście. To za pośrednictwem konstruktora ustawiane są wartości wewnętrznych zmiennych wyliczeniowych. Dla przykładu dodajmy do poprzedniego wyliczenia dwa pola – ageFrom i ageTo – aby wskazać przedział wiekowy dla każdej roli:
public enum Role {
   STUDENT(5,18),
   TEACHER(20,60),
   DIRECTOR(40,70),
   SECURITY_GUARD(18,50);

   int ageFrom;
   int ageTo;

   Role(int ageFrom, int ageTo) {
       this.ageFrom = ageFrom;
       this.ageTo = ageTo;
   }
}

73. Jaka jest różnica między == i równości()?

To jedno z najczęstszych pytań na rozmowach kwalifikacyjnych z programistami Java. Zacznijmy od tego, że gdy porównujemy proste wartości ( int , char , double ...), robimy to za pomocą == , ponieważ zmienne zawierają określone wartości i możemy je porównywać. Zmienne prymitywne nie są pełnoprawnymi obiektami - nie dziedziczą po Object i nie mają metody równości() . Kiedy mówimy o porównywaniu zmiennych, które odnoszą się do obiektów, == porówna tylko wartość referencji - niezależnie od tego, czy odnoszą się one do tego samego obiektu, czy nie. Nawet jeśli jeden obiekt jest identyczny z drugim, porównanie przez == da wynik negatywny ( false ), ponieważ jest to inny obiekt. Jak rozumiesz, metoda równości() służy do porównywania zmiennych referencyjnych . Jest to jedna ze standardowych metod klasy Object , która jest potrzebna do pełnego porównania obiektów. Ale warto od razu wyjaśnić: aby ta metoda działała poprawnie, należy ją na nowo zdefiniować, pisząc dokładnie, jak należy porównywać obiekty tej klasy. O ile nie zastąpisz metody, domyślnie porówna ona obiekty według == . W IntelliJ IDEA możesz to zmienić automatycznie (używając narzędzi IDEA) -> alt + wstaw , w oknie, które się pojawi, wybierz równości() i hashCode() -> wybierz, które pola klasy mają brać udział -> i voila, automatyczna implementacja metody są zakończone. Oto przykład tego, jak wyglądałaby automatycznie wygenerowana metoda równości dla prostej klasy Cat z dwoma polami - int age i String name :
@Override
public boolean equals(final Object o) {
   if (this == o) return true;
   if (o == null || this.getClass() != o.getClass()) return false;
   final Cat cat = (Cat) o;
   return this.age == cat.age &&
           Objects.equals(this.name, cat.name);
}
Jeśli mówimy o różnicy między == i równości dla enums , nie ma jej zbyt wiele. Analiza pytań i odpowiedzi z rozmów kwalifikacyjnych dla programisty Java.  Część 8 - 2Przecież enum przechowuje stałe i nawet porównując podobne wartości za pomocą == otrzymamy true , ponieważ odniesienia zawsze będą dotyczyć tych samych obiektów. Cóż, korzystając z równości, również poprawnie opracujemy funkcjonalność, zwłaszcza jeśli wejdziesz do treści metody równości dla enum , zobaczysz, że w klasie Enum implementacja metody wygląda następująco: Analiza pytań i odpowiedzi z rozmów kwalifikacyjnych dla programisty Java.  Część 8 - 3To znaczy, w środku - stare, dobre porównanie przez odniesienie! Podsumowując: w przypadku enum porównanie zarówno poprzez ==, jak i równa się jest poprawne.Analiza pytań i odpowiedzi z rozmów kwalifikacyjnych dla programisty Java.  Część 8 - 4

74. Do czego służy metoda ordinal() w Enum?

Wywołując metodę int ordinal() na elemencie wyliczeniowym , otrzymamy liczbę porządkową od zera tej wartości w ogólnym szeregu wyliczeń. Użyjmy tej metody na jednym elemencie z poprzedniego omówienia - Role :
System.out.println(Role.DIRECTOR.ordinal());
Odpowiednio konsola wyświetli:
2

75. Czy można używać Enum z TreeSet lub TreeMap w Javie?

Dopuszczalne jest używanie typów wyliczeniowych w TreeSet i TreeMap . I możemy napisać:
TreeSet<Role> treeSet = new TreeSet<>();
treeSet.add(Role.SECURITY_GUARD);
treeSet.add(Role.DIRECTOR);
treeSet.add(Role.TEACHER);
treeSet.add(Role.STUDENT);
treeSet.forEach(System.out::println);
A konsola wyświetli:
STUDENT NAUCZYCIEL DYREKTOR SECURITY_GUARD
Otrzymaliśmy dane wyjściowe w kolejności alfabetycznej. Chodzi o to, że jeśli użyjemy elementów wyliczeniowych dla wartości TreeSet lub jako kluczy dla TreeMap , to elementy zostaną posortowane w ich naturalnej kolejności (kolejności, w jakiej są określone w wyliczeniu ). Zrozumienie tych funkcji pomaga nam pisać lepszy kod.Analiza pytań i odpowiedzi z rozmów kwalifikacyjnych dla programisty Java.  Część 8 - 5

76. W jaki sposób metody ordinal() i CompareTo() są ze sobą powiązane w Enum?

Jak wspomniano wcześniej, funkcja ordinal() zwraca liczbę porządkową wartości z ogólnej listy wyliczeniowej. Ponadto, analizując poprzednie pytanie, zauważyłeś, że elementy wyliczeń, gdy na przykład znajdą się w TreeSet (posortowanym zestawie), przyjmują kolejność, w jakiej są zadeklarowane w enum . Jak wiemy, TreeSet i TreeMap sortują elementy, wywołując metodę CompareTo() interfejsu Comparable . Na tej podstawie możemy założyć, że klasa Enum implementuje interfejs Comparable , implementując go w metodzie CompareTo() , w ramach której ordinal() służy do ustawiania kolejności sortowania. Po wejściu do klasy Enum widzimy potwierdzenie tego: Analiza pytań i odpowiedzi z rozmów kwalifikacyjnych dla programisty Java.  Część 8 - 6Oraz treść samej metody: Analiza pytań i odpowiedzi z rozmów kwalifikacyjnych dla programisty Java.  Część 8 - 7Metoda ordinal() nie jest tutaj wywoływana. Zamiast tego używana jest zmienna porządkowa - numer porządkowy elementu w wyliczeniu. Sama metoda ordinal() to Analiza pytań i odpowiedzi z rozmów kwalifikacyjnych dla programisty Java.  Część 8 - 8nic innego jak moduł pobierający zmienną porządkową .

77. Napisz przykład EnumM

W pytaniach omawianych powyżej podałem już przykłady wyliczeń i nie widzę sensu powielania kodu (przykładowo pytanie nr 72 o konstruktor w wyliczeniu).

78. Czy można używać Enum w przypadku przełącznika?

Jest to możliwe i konieczne! Patrząc wstecz na moją praktykę, zauważam, że jednym z najczęstszych miejsc użycia wyliczenia są konstrukcje logiczne, takie jak switch . W takim przypadku można podać wszystkie możliwe warianty case , a po zapisaniu logiki dla wszystkich wartości wyliczeniowych - a użycie operatora domyślnego może nawet nie być konieczne! W końcu, jeśli użyjesz ciągu lub wartości liczbowej, na przykład typu int , możesz otrzymać nieoczekiwaną wartość, co z kolei jest niemożliwe przy użyciu wyliczenia . Jak wyglądałby przełącznik w przykładzie omówionym wcześniej:
public void doSomething(Role role) {
   switch (role) {
       case STUDENT:
           // некая логика для STUDENT
           break;
       case TEACHER:
           // некая логика для TEACHER
           break;
       case DIRECTOR:
           // некая логика для DIRECTOR
           break;
       case SECURITY_GUARD:
           // некая логика для SECURITY_GUARD
           break;
   }
}

79. Jak uzyskać wszystkie dostępne wartości w instancji Enum?

Jeśli potrzebujesz uzyskać wszystkie wystąpienia wyliczenia, istnieje metoda wartości() , która zwraca tablicę wszystkich dostępnych wartości danego wyliczenia w kolejności naturalnej (w kolejności, w jakiej zostały określone w wyliczeniu ). Przykład:
Role[] roles = Role.values();
for (Role role : roles) {
   System.out.println(role);
}
Konsola wyświetli następujące dane wyjściowe:
STUDENT NAUCZYCIEL DYREKTOR SECURITY_GUARD

Strumieniowe API

80.Co to jest strumień w Javie?

Java Stream to stosunkowo nowy sposób interakcji ze strumieniem danych, który z kolei pozwala na wygodniejsze i bardziej kompaktowe przetwarzanie dużych danych, a także zrównoleglanie przetwarzania danych pomiędzy określoną liczbą wątków, co może dać wzrost wydajności w użyciu funkcjonalność. Tego tematu nie da się szerzej omówić w skrócie, dlatego pozostawię tutaj link do artykułu, który może pomóc zgłębić ten temat.Analiza pytań i odpowiedzi z rozmów kwalifikacyjnych dla programisty Java.  Część 8 - 9

81. Jakie są główne właściwości transakcji?

Temat nazywa się Stream API, ale pytanie dotyczy transakcji. Hmm... Najpierw ustalmy, czym jest transakcja. Transakcja to grupa kolejnych operacji na bazie danych, która reprezentuje logiczną jednostkę pracy z danymi. Transakcja może zostać zrealizowana całkowicie i pomyślnie, przy zachowaniu integralności danych i niezależnie od innych transakcji przebiegających równolegle, lub może w ogóle nie zostać zrealizowana i w takim przypadku nie ma to żadnego skutku. Zatem transakcje mają cztery główne właściwości, które w skrócie nazywane są ACID . Przyjrzyjmy się, jak każda litera tego skrótu oznacza: A - Atomowość - atomowość - ta właściwość gwarantuje, że żadna transakcja nie zostanie częściowo zarejestrowana w systemie. Albo zostaną wykonane wszystkie jego podoperacje, albo nie zostanie wykonana żadna ( wszystko albo nic ). C - Spójność - spójność to właściwość zapewniająca, że ​​każda udana transakcja rejestruje tylko prawidłowe wyniki. Oznacza to, że jest to gwarancja, że ​​w przypadku udanej transakcji zostaną spełnione wszystkie zasady i ograniczenia, jakie system narzuca konkretnym danym, w przeciwnym razie transakcja nie zostanie sfinalizowana, a dane w systemie wrócą do poprzedniego stanu. państwo. I - Izolacja - izolacja to właściwość mówiąca, że ​​podczas realizacji transakcji transakcje równoległe nie powinny mieć wpływu na jej wynik. Ta właściwość wymaga dużych zasobów, dlatego zazwyczaj jest realizowana częściowo poprzez umożliwienie pewnych poziomów izolacji, które rozwiązują określone problemy z izolacją. Omówimy to bardziej szczegółowo w następnym pytaniu. Analiza pytań i odpowiedzi z rozmów kwalifikacyjnych dla programisty Java.  Część 8 - 10D - Trwałość - ta właściwość sprawia, że ​​jeśli użytkownik otrzyma z systemu potwierdzenie, że transakcja została zakończona, ma pewność, że wprowadzone przez niego zmiany nie zostaną anulowane z powodu jakiejś awarii. Oznacza to, że możesz być pewien, że jakaś awaria systemu operacyjnego nie zrobi nic z Twoimi danymi, jeśli otrzymałeś już potwierdzenie pomyślnego zakończenia transakcji.

82. Jakie są poziomy izolacji transakcji?

Jak powiedziałem wcześniej, zapewnienie izolacji ACID jest procesem wymagającym dużych zasobów. Dlatego ta właściwość jest częściowo spełniona. Istnieją różne poziomy izolacji, a im wyższy poziom, tym większy wpływ na produktywność. Zanim przejdziemy do poziomów izolacji transakcji, musimy przyjrzeć się różnym problemom związanym z niewystarczającą izolacją transakcji :
  • odczyt fantomowy - w przypadku wielokrotnego wywoływania tej samej próbki (tego samego zapytania) w ramach tej samej transakcji otrzymane dane różnią się, co następuje na skutek wstawienia danych przez inną transakcję;

  • odczyt jednorazowy - w przypadku wielokrotnego wywoływania tej samej próbki (tego samego zapytania) w ramach tej samej transakcji otrzymane dane różnią się, co następuje na skutek zmian (aktualizacji) i usunięcia danych przez inną transakcję;

  • brudny odczyt - proces odczytu danych dodanych lub zmienionych w wyniku transakcji, które następnie nie są potwierdzane (cofnięte), tj. odczytanie nieprawidłowych danych;

  • utracona aktualizacja - gdy różne transakcje zmieniają te same dane w tym samym czasie, wszystkie zmiany oprócz ostatniej zostają utracone (co przypomina problem „warunków wyścigu” w środowisku wielowątkowym).

Poziomy izolacji transakcji charakteryzują się tym, przed jakimi problemami izolacji chronią. Rozważmy w formie tabeli poziomy izolacji i przed jakimi problemami chronią:
Poziom izolacji Czytanie fantomowe Niepowtarzalne czytanie Brudna lektura Utracona aktualizacja
SERIALIZOWALNE + + + +
POWTARZALNA CZYTANIE - + + +
CZYTAJ ZOBOWIĄZANIE - - + +
CZYTAJ NIEZOBOWIĄZANE - - - +
NIC - - - -
I nie zapomnij o drugiej stronie medalu: im wyższy poziom izolacji, tym dłużej trwa przetwarzanie transakcji (jeśli kilka transakcji jest realizowanych równolegle). Jeśli chcesz zgłębić ten temat, oto świetny artykuł na początek.

83. Jaka jest różnica między Statement a PreparedStatement?

I tutaj przejście do funkcji technologii JDBC nie przebiega zbyt płynnie . Najpierw ustalmy, czym właściwie jest Statement . Jest to obiekt służący do generowania zapytań SQL. JDBC używa trzech typów Statement , PreparedStatement i CallableStatement . Nie będziemy dzisiaj patrzeć na CallableStatement : porozmawiajmy o różnicy pomiędzy Statement i PrzygotowanieStatement .
  1. Instrukcja służy do wykonywania prostych zapytań SQL bez przychodzących, dynamicznie wstawianych parametrów. PrzygotowanieStatement jest używane z możliwością dynamicznego wstawiania parametrów wejściowych.

  2. Aby ustawić parametry w PrzygotowaniedStatement, parametry wejściowe w żądaniu są zapisywane jako znaki zapytania, dzięki czemu zamiast tego można wstawić wartość za pomocą różnych metod ustawiających, takich jak setDouble() , setFloat() , setInt() , setTime() ... . Dzięki temu nie wstawisz do zapytania niewłaściwego typu danych.

  3. PrzygotowanaStatement jest „prekompilowana” i korzysta z buforowania, więc jej wykonanie może być nieco szybsze niż wykonywanie zapytań z obiektów Statement . W rezultacie często wykonywane zapytania SQL są zapisywane jako obiekty PrzygotowaniedStatement w celu poprawy wydajności .

  4. Instrukcja jest podatna na zastrzyki SQL, podczas gdy PrzygotowanaStatement zapobiega im. Przeczytaj więcej na temat eliminowania wstrzykiwań SQL i innych najlepszych praktyk w zakresie bezpieczeństwa Java w tym artykule .

Jeśli zaczynasz studiować technologię łączenia aplikacji Java z bazą danych - JDBC, radzę zacząć od tego artykułu . Cóż, w tym miejscu dzisiaj się zatrzymamy.Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 8 - 11
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION