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:
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. Przecież 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: To 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.
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:
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:
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: Oraz treść samej metody: Metoda ordinal() nie jest tutaj wywoływana. Zamiast tego używana jest zmienna porządkowa - numer porządkowy elementu w wyliczeniu. Sama metoda ordinal() to nic 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:
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.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. D - 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).
Poziom izolacji | Czytanie fantomowe | Niepowtarzalne czytanie | Brudna lektura | Utracona aktualizacja |
---|---|---|---|---|
SERIALIZOWALNE | + | + | + | + |
POWTARZALNA CZYTANIE | - | + | + | + |
CZYTAJ ZOBOWIĄZANIE | - | - | + | + |
CZYTAJ NIEZOBOWIĄZANE | - | - | - | + |
NIC | - | - | - | - |
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 .-
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.
-
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.
-
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 .
-
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 .
GO TO FULL VERSION