
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:
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() . 


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:
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:
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:


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 są 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:
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).
Poziom izolacji | Fantom czyta | Niepowtarzalne odczyty | Brudne lektury | Utracona aktualizacja |
---|---|---|---|---|
SERIALIZOWALNE | + | + | + | + |
POWTARZALNA CZYTANIE | - | + | + | + |
CZYTAJ ZOBOWIĄZANIE | - | - | + | + |
CZYTAJ NIEZOBOWIĄZANE | - | - | - | + |
NIC | - | - | - | - |
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 .-
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.
-
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.
-
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.
-
Instrukcja jest podatna na wstrzyknięcie SQL, ale preparat PreparedStatement zapobiega im.
GO TO FULL VERSION