JavaRush /Java Blogu /Random-AZ /Java tərtibatçısı üçün müsahibələrdən alınan sualların və...

Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili. 6-cı hissə

Qrupda dərc edilmişdir
Salam, Dünya! İnkişaf etməyə davam etmək hər bir tərtibatçı üçün çox vacibdir. Axı, dayansanız, iddiasız olmaq və bazardan tamamilə uçmaq riski var: İT dünyası daim inkişaf edir və irəliləyir və siz onunla birlikdə hərəkət etməlisiniz. Ancaq eyni zamanda, klassikləri (klassik mövzuları) unutmamaq üçün yalnız yeni və təzə texnologiyalara diqqət yetirmək olmaz. Bu gün mən Java tərtibatçısı üçün “klassik” mövzular üzrə sualların təhlilini davam etdirmək istəyirəm. Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  Hissə 6 - 1Qeyd edim ki, mənim cavablarım yekun səlahiyyət deyil - mən bu sualların düzgün cavablarını məhz belə görürəm və siz onlardan bəziləri ilə razılaşmaya bilərsiniz. Bu olduqca normal olacaq, ona görə də şərhlərdə öz fikrinizi bölüşməkdən çəkinməyin. Təhlil hissələrinə keçidlər məqalənin sonundadır.Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  Hissə 6 - 2

Kitabxanalar və standartlar

52. Hibernate nədir? JPA ilə Hibernate arasındakı fərq nədir?

Düşünürəm ki, bu suala cavab vermək üçün əvvəlcə JPA- nın nə olduğunu başa düşməliyik . JPA sadə Java obyektlərinin obyektlə əlaqəli xəritələşdirilməsini təsvir edən və belə obyektlərin saxlanması, axtarışı və manipulyasiyası üçün API təmin edən spesifikasiyadır. Yəni, xatırladığımız kimi, relational verilənlər bazaları (VB) bir-biri ilə əlaqəli çoxlu cədvəllər şəklində təqdim olunur. Və JPA obyektlərin əlaqəli verilənlər bazaları ilə necə qarşılıqlı əlaqədə ola biləcəyini təsvir edən geniş qəbul edilmiş standartdır. Gördüyünüz kimi, JPA mücərrəd və qeyri-maddi bir şeydir. Bu ideyanın özü, yanaşma kimidir. Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  6-3-cü hissəEyni zamanda, Hibernate JPA paradiqmalarını həyata keçirən xüsusi bir kitabxanadır . Yəni bu kitabxananın köməyi ilə verilənlər bazasından (Entity) verilənləri təmsil edən obyektlər vasitəsilə relyasiyalı verilənlər bazası ilə işləmək olar. Necə deyərlər, bu kitabxana JPA ideallarına çox yaxındır və bəlkə də buna görə populyarlaşıb. Və başa düşdüyünüz kimi, istifadənin populyarlığı gələcək inkişaf və təkmilləşdirmələr üçün yaxşı bir arqumentdir. Bundan əlavə, onun tez-tez istifadəsinin arxasında bu alətlə bağlı bütün mümkün və qeyri-mümkün sualları artıq çeşidləmiş böyük bir cəmiyyət var. Bu texnologiyanın bütün qaranlıq guşələrini ətraflı şəkildə araşdıran bir kitab nümunəsidir . Yəni, Hibernate mümkün qədər öyrənilib və belə çıxır ki, etibarlıdır. Əslində, heç də boş yerə deyil ki, hətta Bahar tərəfində JPA-nın ideal tətbiqi ümumiyyətlə başlıq altında Hibernate istifadə edir.

53. Kaskad nədir? Hibernate rejimində necə istifadə olunur?

Daha əvvəl dediyim kimi, Hibernate rejimində əlaqə obyektlər adlanan məlumat obyektləri vasitəsilə həyata keçirilir . Bu obyektlər verilənlər bazasında bəzi xüsusi cədvəlləri təmsil edir və xatırladığınız kimi Java siniflərində digər siniflərə istinadlar ola bilər. Bu əlaqələr verilənlər bazasında öz əksini tapır. Verilənlər bazasında, bir qayda olaraq, bunlar ya xarici açarlar (OneToOne, OneToMany, ManyToOne üçün) və ya aralıq cədvəllərdir (ManyToMany üçün).Müəssisələr arasındakı əlaqə haqqında bu məqalədə daha ətraflı oxuya bilərsiniz . Müəssisənizin digər əlaqəli qurumlarla əlaqəsi olduqda, əlaqə növünü göstərmək üçün bu keçidlərin üstündə qeydlər yerləşdirilir: @OneToOne, @OneToMany, @ManyToOne, @ManyToMane, onların parametrlərində mülkiyyətin dəyərini təyin edə bilərsiniz - kaskad - bu əlaqə üçün kaskad növü. JPA-nın qurumlarla qarşılıqlı əlaqə üçün xüsusi üsulları var (davam etmək, saxlamaq, birləşdirmək...) . Kaskad tipləri, hədəf obyektdə bu üsullardan istifadə edildikdə əlaqəli məlumatların necə davranacağını göstərmək üçün dəqiq istifadə olunur. Beləliklə, kaskad strategiyaları (cascading növləri) hansılardır? JPA standartı altı növ kaskadın istifadəsini nəzərdə tutur:
  • PERSIST - saxlama əməliyyatları kaskadda baş verəcək ( saxla()persist() metodları üçün ). Yəni, digər qurumlarla əlaqəli bir obyekti saxlasaq, onlar da verilənlər bazasında saxlanılır (əgər onlar artıq yoxdursa)

  • MERGE - yeniləmə əməliyyatları kaskadda baş verəcək ( birləşmə() metodu üçün )

  • REMOVE - silmə əməliyyatları kaskadda baş verir ( remove() metodu )

  • ALL - eyni anda üç kaskad əməliyyatı ehtiva edir - DAVAM ET - BİRLƏŞMƏ - SİL

JPA davamlı bir qurum anlayışına malikdir - cari sessiya (əlaqə) tərəfindən idarə olunan verilənlər bazasındakı məlumatları ilə əlaqəli bir qurum . Əgər siz onu dəyişdirsəniz, lakin dəyişiklikləri verilənlər bazasında saxlamasanız, onun verilənlər bazasındakı məlumatları yenə də dəyişdiriləcək.
  • DETACH ilə əlaqəli qurumlar sessiya ilə idarə olunmayacaq ( detach() metodu ). Yəni, onlar dəyişdikdə verilənlər bazasında məlumatlarında avtomatik dəyişiklik olmayacaq - onlar davamlılıq vəziyyətindən ayrılmış vəziyyətə (JPA tərəfindən idarə olunmayan qurum) köçürülür.

  • REFRESH - hər dəfə obyekt verilənlər bazasından verilənlərlə yeniləndikdə ( refresh() - ayrılmış obyektləri yeniləyir), əlaqəli obyektlər eyni şəkildə yenilənir. Məsələn, verilənlər bazasından götürülmüş məlumatları birtəhər dəyişdirdiniz və onun orijinal dəyərlərini qaytarmaq istəyirsiniz. Bu vəziyyətdə bu əməliyyat sizin üçün faydalı olacaq.

Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  6-4-cü hissəHibernate bu standart kaskad əməliyyatlarının hamısını dəstəkləyir, eyni zamanda üç əməliyyatı təqdim edir:
  • REPLİKAT - Birdən çox məlumat mənbəyimiz olduqda istifadə olunur və biz məlumatların sinxronlaşdırılmasını istəyirik (Hibernate metodu - təkrarlama). Bütün qurumların identifikatorları (id) olmalıdır ki, onların yaradılması ilə bağlı heç bir problem olmasın (eyni qurumun müxtəlif verilənlər bazaları üçün fərqli identifikatorları olmasın)

  • SAVE_UPDATE - kaskad yadda saxla/sil (Gizləmə metodu üçün - saveOrUpdate )

  • LOCK DETACHED -ə tərs əməliyyatdır : o, ayrılmış obyekti davamlılıq vəziyyətinə qaytarır , yəni. obyekt cari sessiya tərəfindən yenidən izləniləcək

Kaskad növü seçilmədikdə, müəssisə üzərində heç bir əməliyyat onunla əlaqəli digər obyektlərə heç bir təsir göstərməyəcək.

54. Entity sinfi mücərrəd ola bilərmi?

2.1 Müəssisə Sinfi bəndindəki JPA spesifikasiyasında belə bir sətir var: “ Həm abstrakt, həm də konkret siniflər obyekt ola bilər .” Beləliklə, cavab bəli, mücərrəd sinif bir varlıq ola bilər və @Entity ilə şərh edilə bilər.

55. Müəssisə meneceri nədir? O, nəyə görə məsuliyyət daşıyır?

İlk növbədə qeyd etmək istərdim ki, EntityManager JPA-nın əsas komponentlərindən biridir və subyektlərin verilənlər bazası ilə qarşılıqlı əlaqəsi üçün istifadə olunur. Ümumiyyətlə, o, obyektlə verilənlər bazası arasında qarşılıqlı əlaqə üsullarını çağırır (davam etmək, birləşdirmək, silmək, ayırmaq)... Amma onu da qeyd edim ki, bu komponent, bir qayda olaraq, bütün tətbiq üçün bir deyil: əksər hallarda o, yüngüldür və tez-tez çıxarılır və EntityManagerFactory istifadə edərək yenisi yaradılır . JDBC ilə paralel çəksək , burada EntityManagerFactory DataSource analoqu olacaq , onda EntityManager də öz növbəsində Connection analoqu olacaq . Əvvəllər mən cari əlaqə ilə idarə olunan bir varlıq kimi davamlı bir varlıqdan bəhs etdim. Beləliklə: bu qurum dəqiq şəkildə cari əlaqə ilə sıx əlaqəli olan EntityManager və əməliyyatların açılması/bağlanması üçün cavabdeh olan TransactionManager tərəfindən idarə olunur . Aşağıdakı şəkildə daha çox müəssisənin həyat dövrünü görə bilərsiniz: Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  6-5-ci hissəEntityManager müəssisə İdarə olunan mərhələdə olduqda onu idarə edir (hazırda o, davamlıdır, çünki onun EntityManager ilə əlaqəsi var). Yəni o, artıq yeni deyil və hələ də silinməyib. Deyə bilərik ki, bir varlıq yeni olduqda və ya çıxarıldıqda, o da ayrılır, çünki EntityManager tərəfindən idarə olunmur. EntityManager üçün müxtəlif strategiyalar var. Yəni, bütün proqram üçün bir təkton EntityManager ola bilər və ya hər bir əlaqə üçün hər dəfə yenisi yaradıla bilər. Əgər siz Bahardan istifadə edirsinizsə, onda EntityManager-in yaradılması/silinməsi avtomatik olaraq başlıq altında idarə olunur (lakin bu o demək deyil ki, siz onu fərdiləşdirə bilməyəcəksiniz ^^). Bir və ya daha çox EntityManager-in davamlılıq kontekstini təşkil etdiyini söyləməyə dəyər . Davamlılıq konteksti obyektlərin nümunələrinin verilənlər bazasındakı oxşar obyektlərlə sinxronlaşdırıldığı bir mühitdir (dediyim kimi, bu, yalnız davamlı obyektlər üçün işləyir). Əgər siz JPA- ya daha dərindən baxsanız (bunu çox tövsiyə edirəm), bu anlayışlarla çox, çox tez-tez rastlaşacaqsınız.

56. Assert sinfi nədir? Niyə istifadə edin?

Mən JPA -da belə bir sinif eşitməmişəm , ona görə də güman edirəm ki, bu, kodun vahid sınağı üçün istifadə olunan kitabxananın JUnit sinfinə aiddir. Bu kitabxananın Assert sinfi kodun icrasının nəticələrini yoxlamaq üçün istifadə olunur ( assert müəyyən bir yerdə müəyyən vəziyyətə/məlumatlara malik olduğunuz barədə bəyanatdır). Məsələn, bir pişik yaratmalı olan bir üsulu sınaqdan keçirirsiniz. Bir metodu işlədirsiniz və bir nəticə əldə edirsiniz:
Cat resultOfTest = createCat();
Ancaq onun düzgün yaradıldığına əmin olmalısınız, elə deyilmi? Buna görə də, siz əvvəlcədən createCat() metodundan əldə edilmiş pişikdən gözlədiyiniz parametrlərlə əl ilə müəyyən bir pişiyi - gözlənilənCat yaratdınız . Sonra, nəticələri yoxlamaq üçün Assert sinifindən istifadə edirsiniz :
Assert.assertEquals(resultOfTest, expectedCat);
Əgər pişiklər fərqlidirsə, AssertionError istisnası atılacaq ki, bu da bizə gözlənilən nəticələrin yaxınlaşmadığını bildirir. Assert sinfi gözlənilən nəticələri yoxlamaq üçün bir çox tapşırıqları əhatə edən bir çox fərqli metodlara malikdir. Onlardan bəzilərini təqdim edirik:
  • assertTrue(<boolean>) - arqument kimi alınan gözlənilən dəyər doğru olmalıdır

  • assertFalse(<boolean>) - arqument kimi alınan gözlənilən dəyər yalan olmalıdır

  • assertNotEquals(<object1>, <object2>) - arqumentlər kimi qəbul edilən obyektlər bərabər ( false ) ilə müqayisə edildikdə fərqli olmalıdır.

  • assertThrows(<ClassNameOfException>.class, <exceptionObject>) - ikinci arqumentin birinci arqument tərəfindən müəyyən edilmiş sinfin istisnası olması gözlənilir (yəni, bir qayda olaraq, ikinci arqumentin yerinə, metod çağırılır ki, o, tələb olunan növdən bir istisna atın)

Simli

57. Java-da Stringi xarakterizə edin

String Java-da standart bir sinifdir, sətir dəyərlərini (simvol ardıcıllığı) saxlamaq və manipulyasiya etmək üçün cavabdehdir, dəyişməz bir sinifdir ( əvvəllər dəyişməz haqqında yazmışdım ), yəni. Bu sinif obyektlərinin məlumatları yaradıldıqdan sonra dəyişdirilə bilməz. Dərhal qeyd etmək istərdim ki, StringBuilderStringBuffer sinifləri iki praktiki olaraq eyni sinifdir və yeganə fərq onlardan birinin çox yivli mühitdə (StringBuffer) istifadə üçün nəzərdə tutulmasıdır. Bu siniflər String ilə analoqdur , lakin ondan fərqli olaraq onlar dəyişkəndirlər . Yəni, yaradılan obyektlər yeni obyekt yaratmadan təmsil etdikləri sətirin dəyişdirilməsinə icazə verirlər. Əslində, metodlar standart String metodlarından fərqlənir və sətri dəyişdirmək ehtiyaclarını ödəməyə yönəldilmişdir (onları qurucu adlandırmaq heç də boş yerə deyil). Bu məqalədə String , StringBufferStringBuilder haqqında ətraflı oxuyun .

58. String obyektinin yaradılmasının müxtəlif üsulları hansılardır? Harada yaradılmışdır?

Sətir yaratmağın ən çox yayılmış yolu, sadəcə olaraq bizə lazım olan dəyəri qoşa mötərizədə göstərməkdir:
String str = "Hello World!";
Bunu birbaşa new vasitəsilə də edə bilərsiniz :
String str = new String("Hello World!");
Simvollar massivindən başlayaraq sətir yarada bilərsiniz:
char[] charArr = {'H','e','l','l','o',' ', 'W','o','r','l','d','!'};
String str = new String(charArr);
Bəzi obyektdə işləyən toString metodu nəticəsində :
String str = someObject.toString();
Hər hansı digər metodun nəticəsi kimi, simli təsviri qaytarır. Misal üçün:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str =  reader.readLine();
Anladığınız kimi, sətir yaratmağın çox və çox yolu ola bilər. String obyekti yaradıldıqda , o, sətir hovuzunda saxlanılır , bu barədə aşağıdakı suallardan birində daha ətraflı danışacağıq.

59. Java-da iki sətri necə müqayisə etmək və onları necə çeşidləmək olar?

Java dəyərləri müqayisə etmək üçün == cüt bərabərlik işarəsindən istifadə edir . int kimi bəzi sadə dəyərləri müqayisə etmək lazım gəlsə , ondan istifadə edərdik. Lakin bu üsul tam hüquqlu obyektləri müqayisə etmək üçün tətbiq edilmir. Bu halda, bu, yalnız istinadların müqayisəsi olacaq - eyni obyektə işarə edib-etməmələri. Yəni, daxili sahələrin tam eyni dəyərləri olan iki obyekti müqayisə edərkən, == vasitəsilə müqayisə yanlış nəticə verəcəkdir : obyektlərin eyni sahələrinə baxmayaraq, obyektlərin özləri fərqli yaddaş hüceyrələrini tutur. String sinifinin obyektləri , aldadıcı sadəliyinə baxmayaraq, hələ də obyektdir. Və == vasitəsilə müqayisə onlar üçün də tətbiq edilmir (hətta simli hovuzun olmasına baxmayaraq). Burada Object sinfinin standart metodu işə düşür - bərabərdir , düzgün işləməsi üçün sinifdə ləğv edilməlidir (əks halda, o, == istifadə edərək müqayisə edir ). O, String sinfində ləğv edilib , ona görə də biz onu götürüb istifadə edirik:
String firstStr = "Hello World!";
String secondStr = "Hello World!";
boolean isEquals = firstStr.equals(secondStr);
Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  6-6-cı hissəUyğun müqayisələr haqqında danışdıq, indi çeşidləmə müqayisələrinə baxaq. Axı, bir şeyi çeşidləmək üçün hansı prinsiplə çeşidlənəcəyini bilməliyik. Bunu etmək üçün standart sıralanmış dəstdən istifadə edə bilərsiniz - TreeSet . Bu məqalədə Java-da müxtəlif kolleksiyalar haqqında ətraflı oxuya bilərsiniz . Bu siyahı qırmızı-qara ağac alqoritmi əsasında işləyir və dəsti müəyyən edilmiş çeşidləmə prinsipinə uyğun olaraq çeşidləyir. Daha əvvəl dediyim kimi, müəyyən bir növ obyektlərin necə çeşidlənməsini başa düşməlisiniz. Müqayisələr çeşidləmə üçün müqayisə metodunu təyin etmək üçün istifadə olunur . Tipik olaraq, bunlar çeşidləmək istədiyiniz siniflər üçün həyata keçirilməlidir, lakin String vəziyyətində onlar artıq həyata keçirilir. Buna görə də, sadəcə olaraq TreeSet- ə lazım olan sətirləri əlavə edirik və o, onları çeşidləyəcək:
TreeSet<String> sortedSet = new TreeSet<>();
sortedSet.add("B");
sortedSet.add("C");
sortedSet.add("A");
sortedSet.forEach(System.out::println);
Konsol çıxışı:
A B C

60. Sətirin simvola çevrilməsi alqoritmini verin. Uyğun kodu yazın

Daha əvvəl dediyim kimi, String sinifinin obyektləri çoxlu müxtəlif faydalı metodlara malikdir. Bunlardan biri toCharArray- dir . Bu üsul sətri simvol massivinə çevirir:
String str = "Hello world";
char[] charArr = str.toCharArray();
Sonra indekslə çağıra biləcəyimiz bir sıra simvollarımız var:
char firstChar = charArr[0]; // H

61. Sətri bayt massivinə və geriyə necə çevirmək olar? Uyğun kodu yazın

toCharArray metoduna bənzər , String sinfi sətirin bayt massivini qaytaran getBytes metoduna malikdir :
String str = "Hello world";
byte[] byteArr = str.getBytes();
byte firstChar = byteArr[6]; // 119
Təhlilin bugünkü hissəsi məntiqi sona çatdı. Diqqətinizə görə təşəkkürlər!Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  6-7-ci hissə
Seriyadakı digər materiallar:
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION