CodeGym/Blog Java/Random-PL/Przeglądanie pytań i odpowiedzi z rozmowy kwalifikacyjnej...
John Squirrels
Poziom 41
San Francisco

Przeglądanie pytań i odpowiedzi z rozmowy kwalifikacyjnej na stanowisko programisty Java. Część 8

Opublikowano w grupie Random-PL
Praktyka czy teoria? Co jest ważniejsze? Wiele osób naturalnie powie, że praktyka jest ważniejsza. Na przykład ćwicz, aż zajdzie słońce i będziesz szczęśliwy. Ośmielę się z tym nie zgodzić. Przeglądanie pytań i odpowiedzi z rozmowy kwalifikacyjnej na stanowisko programisty Java.  Część 8 - 1Podczas rozmów kwalifikacyjnych nikt nie będzie wiedział, jaki jesteś fajny, kiedy ćwiczysz. Zamiast tego zostaniesz poproszony o zademonstrowanie swoich kotletów teoretycznych. Dopiero później, kiedy przejdziesz przez wszystkie etapy rozmów kwalifikacyjnych i zostaniesz przydzielony do projektu, wykorzystasz swoje praktyczne umiejętności. Możesz sprzeciwić się, mówiąc, że czasami dają ci zadanie testowe, więc nadal potrzebna jest praktyka. Nie zgadzam się, ale chodzi mi o to, że czasami tak się dzieje, ale ZAWSZE trzeba wykazać się znajomością teorii podczas rozmowy kwalifikacyjnej. Czy czujesz różnicę? Wszystko to oznacza, że ​​trzeba mieć pod nogami solidny fundament teoretyczny i to właśnie będziemy dzisiaj dalej budować. Mówiąc dokładniej, będziemy w dalszym ciągu przyglądać się pytaniom często zadawanym podczas rozmów kwalifikacyjnych.

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

Załóżmy, że mamy następujące wyliczenie :
public enum Role {
   STUDENT,
   TEACHER,
   DIRECTOR,
   SECURITY_GUARD;
}
Wyświetlmy pole STUDENT na konsoli, wywołując jego metodę toString() :
System.out.println(Role.STUDENT.toString());
W rezultacie otrzymujemy następujące dane wyjściowe konsoli:
STUDENT
Widzimy zatem, że w przypadku wyliczenia domyślna implementacja toString() zwraca nazwę samej stałej.

72. Czy możesz zadeklarować konstruktora wewnątrz Enum?

Oczywiście, że tak. Konstruktor ustawia wartości wewnętrznych pól wyliczenia . Przykładowo 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ęściej zadawanych pytań podczas rozmów kwalifikacyjnych potencjalnym programistom Java. Na początek, porównując proste wartości ( int , char , double ...) używamy == , ponieważ zmienne te zawierają konkretne wartości, które można bezpośrednio porównać. Co więcej, zmienne pierwotne nie są pełnoprawnymi obiektami — nie dziedziczą klasy Object i nie mają metody równości() . Jeśli mówimy o porównywaniu zmiennych, które odnoszą się do obiektów, to musimy wiedzieć, że == porównuje tylko wartość referencji, czyli czy odnoszą się one do tego samego obiektu, czy nie. Nawet jeśli wszystkie dane w jednym obiekcie są identyczne ze wszystkimi danymi w innym, użycie == do porównania da wynik negatywny ( false ), ponieważ są to oddzielne obiekty. Jak można się domyślić, do porównywania zmiennych referencyjnych używamy metody równości() . Jest to jedna ze standardowych metod klasy Object , niezbędna do pełnego porównania obiektów. Ale od razu muszę powiedzieć, że aby ta metoda działała poprawnie, trzeba ją przesłonić, aby dokładnie wskazywała, jak należy porównywać obiekty. Jeśli nie zastąpisz metody, otrzymasz domyślną implementację, która porównuje obiekty za pomocą == . W IntelliJ IDEA możesz go zastąpić automatycznie za pomocą skrótu IDEA: Alt+Insert . W wyświetlonym oknie wybierz opcjęquals() i hashCode() . Następnie wybierz pola, które powinny zostać uwzględnione. Voila! Metody są implementowane automatycznie. Oto przykład, jak automatycznie wygenerowana metoda równości szuka najprostszej możliwej 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 chodzi o enum , nie ma praktycznej różnicy między == i równości() . Przeglądanie pytań i odpowiedzi z rozmowy kwalifikacyjnej na stanowisko programisty Java.  Część 8 - 2W końcu wyliczenie przechowuje stałe i nawet jeśli porównamy identyczne wartości za pomocą == , otrzymamy true , ponieważ porównywane odniesienia zawsze będą wskazywać na te same obiekty. Użycie funkcji równości() również daje nam poprawny wynik. Jeśli przejdziesz do treści metody równości dla Enum , zobaczysz, że klasa Enum ma następującą implementację: Przeglądanie pytań i odpowiedzi z rozmowy kwalifikacyjnej na stanowisko programisty Java.  Część 8 - 3Wewnątrz możemy zobaczyć stare, dobre porównanie referencji! Podsumowując, w przypadku enum s możemy poprawnie porównywać, używając zarówno ==, jak i równości() . Przeglądanie pytań i odpowiedzi z rozmowy kwalifikacyjnej na stanowisko programisty Java.  Część 8 - 4

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

Gdy wywołamy metodę int ordinal() w polu wyliczeniowym , otrzymamy indeks pola liczony od zera na liście wartości wyliczeniowych. Wywołajmy tę metodę w polu w wyliczeniu Rola , które rozważaliśmy wcześniej:
System.out.println(Role.DIRECTOR.ordinal());
Odpowiednio konsola wyświetla:
2

75. Czy Enum może być używane z TreeSet lub TreeMap w Javie?

Typów wyliczeniowych możemy używać w TreeSet i TreeMap . I możemy napisać tak:
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
Mamy wynik, ale nie alfabetycznie. Chodzi o to, że jeśli użyjemy pól wyliczeniowych jako wartości TreeSet lub jako kluczy TreeMap , to pola zostaną posortowane w ich naturalnej kolejności (w tej kolejności, w jakiej są określone w enum ) . Zrozumienie, że tak to działa, pomaga nam pisać lepszy kod.

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

Jak wspomniano wcześniej, funkcja ordinal() zwraca indeks pola na liście pól wyliczeniowych. Ponadto, rozważając poprzednie pytanie, zauważyłeś, że gdy pola wyliczeniowe są umieszczane w TreeSet (który jest posortowanym zbiorem), przyjmują one kolejność, w jakiej zostały zadeklarowane w wyliczeniu . Jak wiemy, TreeSet i TreeMap sortują elementy, wywołując metodę CompareTo() swojego interfejsu Comparable . To mówi nam, że klasa Enum implementuje interfejs Comparable , co oznacza, że ​​implementuje metodę CompareTo() , która wewnętrznie wykorzystuje metodę ordinal() do określenia porządku sortowania. Wchodząc do klasy Enum , możemy potwierdzić nasze założenie: Przeglądanie pytań i odpowiedzi z rozmowy kwalifikacyjnej na stanowisko programisty Java.  Część 8 - 5A oto treść samej metody: Przeglądanie pytań i odpowiedzi z rozmowy kwalifikacyjnej na stanowisko programisty Java.  Część 8 - 6Metoda ordinal() nie jest tutaj wywoływana. Zamiast tego używana jest zmienna porządkowa , która jest numerem indeksu elementu w wyliczeniu. Sama metoda ordinal ()Przeglądanie pytań i odpowiedzi z rozmowy kwalifikacyjnej na stanowisko programisty Java.  Część 8 - 7 to nic innego jak moduł pobierający zmienną porządkową .

77. Napisz przykładowe Enum

W pytaniach omówionych powyżej podałem już przykłady enum s. Nie widzę powodu, aby powielać tutaj kod. Na przykład zobacz pytanie 72 dotyczące konstruktora w wyliczeniu.

78. Czy w obudowie przełącznika można zastosować Enum?

Tak może i powinno być! Patrząc na moje doświadczenie, zauważę, że jednym z najczęstszych zastosowań wyliczenia konstrukcje logiczne, takie jak instrukcje switch . W tym przypadku możesz podać wszystkie możliwe przypadki — po napisaniu logiki dla każdego pola wyliczeniowego nie potrzebujesz nawet klauzuli domyślnej ! W końcu, jeśli użyjesz String lub wartości numerycznej, takiej jak int , możesz otrzymać nieoczekiwaną wartość, ale nie jest to możliwe w przypadku enum . Oto jak wyglądałaby instrukcja switch w powyższym przykładzie:
public void doSomething(Role role) {
   switch (role) {
       case STUDENT:
           // some logic for STUDENT
           break;
       case TEACHER:
           // some logic for TEACHER
           break;
       case DIRECTOR:
           // some logic for DIRECTOR
           break;
       case SECURITY_GUARD:
           // some logic for SECURITY_GUARD
           break;
   }
}

79. Jak uzyskać wszystkie możliwe wartości wyliczenia?

Jeśli chcesz uzyskać wszystkie możliwe wartości wyliczeniowe, istnieje metoda wartości() , która zwraca tablicę wszystkich możliwych wartości wyliczeniowych w ich naturalnej kolejności (tj. w kolejności, w jakiej są określone w wyliczeniu ) . Przykład:
Role[] roles = Role.values();
for (Role role : roles) {
   System.out.println(role);
}
Na konsoli będziemy mieć następujące elementy:
STUDENT NAUCZYCIEL DYREKTOR SECURITY_GUARD

Strumieniowe API

80. Co to jest strumień w Javie?

Java Stream API to stosunkowo nowy sposób interakcji ze strumieniem danych, umożliwiający wygodniejsze i bardziej kompaktowe przetwarzanie dużych zbiorów danych, a także przetwarzanie danych równolegle w pewnej liczbie strumieni, co potencjalnie zwiększa wydajność.

81. Wymień główne właściwości transakcji

Tematem tutaj jest Stream API, ale pytanie dotyczy transakcji. Hmm... Najpierw przyjrzyjmy się, czym jest transakcja. Transakcja to grupa kolejnych operacji na bazie danych . Reprezentuje logiczną jednostkę pracy. Transakcja może zostać wykonana niezależnie od innych równoległych transakcji albo całkowicie i pomyślnie, zachowując w ten sposób integralność danych, albo w ogóle nie zostać wykonana, w takim przypadku nie ma to żadnego skutku. Transakcje mają cztery główne właściwości, które łatwo zapamiętamy dzięki akronimowi ACID . Zobaczmy, co oznacza każda litera tego akronimu: A oznacza atomowość . Ta właściwość gwarantuje, że żadna transakcja nie zostanie częściowo zatwierdzona w systemie. Albo zostaną wykonane wszystkie jego podoperacje, albo żadna z nich nie zostanie wykonana ( wszystko albo nic ). С oznacza spójność . Ta właściwość gwarantuje, że każda udana transakcja spowoduje zatwierdzenie tylko prawidłowych wyników. Inaczej mówiąc, jest to gwarancja, że ​​jeśli transakcja zakończy się sukcesem, wówczas zostaną spełnione wszystkie zasady systemu dotyczące konkretnych danych. Jeżeli transakcja się nie powiedzie, to nie zostanie zrealizowana, a dane w systemie powrócą do poprzedniego stanu. Popieram Izolację . _ Ta właściwość oznacza, że ​​gdy transakcja jest wykonywana, współbieżne transakcje nie mogą mieć wpływu na jej wynik. Ta właściwość wymaga dużych zasobów, dlatego z reguły jest częściowo wdrażana, umożliwiając osiągnięcie pewnych poziomów izolacji, które rozwiązują określone problemy izolacji. Omówimy to bardziej szczegółowo w następnym pytaniu. D oznacza trwałość . Właściwość ta gwarantuje, że jeśli użytkownik otrzyma potwierdzenie zakończenia transakcji, to będzie miał pewność, że 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 już otrzymałeś potwierdzenie pomyślnego zakończenia transakcji.

82. Jakie są poziomy izolacji transakcji?

Jak powiedziałem wcześniej, jeśli chodzi o właściwości ACID, zapewnienie izolacji jest procesem wymagającym dużych zasobów. W związku z tym ta właściwość jest częściowo zrealizowana. Istnieją różne poziomy izolacji: im wyższy poziom, tym poważniejszy wpływ na wydajność. Zanim przejdziemy do poziomów izolacji transakcji, musimy wziąć pod uwagę różne problemy, które pojawiają się z powodu niewystarczającej izolacji transakcji :
  • fantom czyta : gdy to samo żądanie, wywołane więcej niż raz w ramach jednej transakcji, daje różne wyniki w wyniku wstawień przez inną transakcję;

  • odczyty niepowtarzalne : gdy to samo żądanie, wywołane więcej niż raz w ramach jednej transakcji, daje różne dane w wyniku zmian (aktualizacji) i usunięcia przez inną transakcję;

  • brudne odczyty : odczytywanie jeszcze niezatwierdzonych danych, które zostały dodane lub zmodyfikowane w wyniku transakcji, a następnie wycofane;

  • utracone aktualizacje : gdy jeden blok danych jest jednocześnie zmieniany przez różne transakcje i wszystkie zmiany oprócz ostatniej zostają utracone (podobnie jak w przypadku wyścigu w wielowątkowości).

Tak się składa, że ​​poziomy izolacji transakcji charakteryzują się tym, przed jakimi problemami izolacji chronią. Rozważ poniższą tabelę poziomów izolacji i problemów, przed którymi chronią:
Poziom izolacji Fantom czyta Niepowtarzalne odczyty Brudne lektury Utracona aktualizacja
SERIALIZOWALNE + + + +
POWTARZALNA CZYTANIE - + + +
CZYTAJ ZOBOWIĄZANIE - - + +
CZYTAJ NIEZOBOWIĄZANE - - - +
NIC - - - -
I nie zapomnij o drugiej stronie: im wyższy poziom izolacji, tym dłużej trwa przetwarzanie transakcji (biorąc pod uwagę równoległą realizację wielu transakcji).

83. Jaka jest różnica pomiędzy wyciągiem a przygotowanym oświadczeniem?

Tutaj nagle zmieniliśmy przejście na funkcje JDBC . W każdym razie najpierw ustalmy, o co chodzi w instrukcji . Jest to obiekt służący do tworzenia zapytań SQL. JDBC używa trzech rodzajów: Statement , PreparedStatement i CallableStatement . Nie będziemy dzisiaj rozważać CallableStatement . Zamiast tego mówimy o różnicy między Statement i PreparedStatement .
  1. Instrukcja służy do wykonywania prostych zapytań SQL bez parametrów wejściowych środowiska wykonawczego. PrzygotowanieStatement może akceptować parametry wejściowe w czasie wykonywania.

  2. Aby ustawić parametry dla PrzygotowaniedStatement , parametry wejściowe są zapisywane w żądaniu jako znaki zapytania, dzięki czemu można je zastąpić pewną wartością za pomocą różnych metod ustawiających, takich jak setDouble() , setFloat() , setInt() , setTime() ... To oznacza, że ​​nie wprowadzisz do żądania niewłaściwego typu danych.

  3. PrzygotowanaStatement jest prekompilowana i korzysta z buforowania, dzięki czemu może zostać wykonana nieco szybciej niż żądanie wykonane z obiektów Statement . W rezultacie często wykonywane instrukcje SQL są tworzone jako obiekty PrzygotowaneStatement w celu poprawy wydajności.

  4. Instrukcja jest podatna na wstrzyknięcie SQL, ale preparat PreparedStatement zapobiega im.

I na tym zakończymy dzień!
Komentarze
  • Popularne
  • Najnowsze
  • Najstarsze
Musisz się zalogować, aby dodać komentarz
Ta strona nie ma jeszcze żadnych komentarzy