JavaRush /Java Blog /Random-TL /Pagsusuri ng mga tanong at sagot mula sa mga panayam para...

Pagsusuri ng mga tanong at sagot mula sa mga panayam para sa developer ng Java. Bahagi 6

Nai-publish sa grupo
Kumusta, Mundo! Ang patuloy na pagbuo ay napakahalaga para sa sinumang developer. Pagkatapos ng lahat, kung hihinto ka, may panganib na maging hindi na-claim at ganap na lumipad palabas ng merkado: ang mundo ng IT ay patuloy na umuunlad at sumusulong, at kailangan mong kumilos kasama nito. Ngunit kahit na sa parehong oras, ang isa ay hindi maaaring tumutok lamang sa mga bago at sariwang teknolohiya, upang hindi makalimutan, wika nga, tungkol sa mga klasiko (klasikal na paksa). Ngayon gusto kong ipagpatuloy ang aking pagsusuri ng mga tanong sa "klasikong" paksa para sa isang developer ng Java. Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 6 - 1Tandaan ko na ang aking mga sagot ay hindi ang pangwakas na awtoridad - ito lang ang nakikita ko sa mga tamang sagot sa mga tanong na ito, at maaaring hindi ka sumasang-ayon sa ilan sa mga ito. Ito ay magiging normal, kaya huwag mag-atubiling ibahagi ang iyong opinyon sa mga komento. Ang mga link sa mga bahagi ng pagsusuri ay nasa dulo ng artikulo.Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 6 - 2

Mga aklatan at pamantayan

52. Ano ang Hibernate? Ano ang pagkakaiba sa pagitan ng JPA at Hibernate?

Sa tingin ko upang masagot ang tanong na ito, kailangan muna nating maunawaan kung ano ang JPA . Ang JPA ay isang detalye na naglalarawan sa object-relational na pagmamapa ng mga simpleng Java object at nagbibigay ng API para sa pag-iimbak, pagbawi, at pagmamanipula ng mga naturang bagay. Iyon ay, tulad ng naaalala natin, ang mga relational database (DB) ay ipinakita sa anyo ng maraming magkakaugnay na mga talahanayan. At ang JPA ay isang malawak na tinatanggap na pamantayan na naglalarawan kung paano maaaring makipag-ugnayan ang mga bagay sa mga relational na database. Tulad ng nakikita mo, ang JPA ay isang bagay na abstract at hindi madaling unawain. Ito ay tulad ng ideya mismo, ang diskarte. Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 6 - 3Kasabay nito, ang Hibernate ay isang partikular na library na nagpapatupad ng JPA paradigms . Iyon ay, sa tulong ng library na ito maaari kang magtrabaho sa isang relational database sa pamamagitan ng mga bagay na kumakatawan sa data mula sa database (Entity). Sabi nga nila, napakalapit ng library na ito sa ideals ng JPA at marahil kaya ito naging tanyag. At tulad ng naiintindihan mo, ang katanyagan ng paggamit ay isang magandang argumento para sa karagdagang pag-unlad at pagpapabuti. Bilang karagdagan, sa likod ng madalas na paggamit nito ay mayroong isang malaking komunidad na naayos na ang lahat ng posible at imposibleng mga katanungan na may kaugnayan sa tool na ito. Narito ang isang halimbawa ng isang libro na nagsusuri nang detalyado sa lahat ng madilim na sulok ng teknolohiyang ito. Iyon ay, ang Hibernate ay pinag-aralan hangga't maaari at, ito ay lumalabas, ay maaasahan. Sa totoo lang, hindi para sa wala na kahit na ang perpektong pagpapatupad ng JPA sa tagsibol ay karaniwang gumagamit ng Hibernate sa ilalim ng hood.

53. Ano ang cascading? Paano ito ginagamit sa Hibernate?

Как я и сказал ранее, в Hibernate взаимодействие ведется через an objectы данных, называемые entity. Эти entity представляют Howие-то конкретные таблицы в базе данных, и How вы помните, в Java классы могут содержать ссылки на другие классы. Эти отношения отражаются и на базе данных. В БД, How правило, это либо внешние ключи (для OneToOne, OneToMany, ManyToOne), либо промежуточные таблицы (для ManyToMany) Подробнее о взаимосвязи между сущностями можно почитать в этой статье. Когда в вашем entity есть ссылки на другие связанные сущности, над этими linkми ставятся аннотации для указания типа связи: @OneToOne, @OneToMany, @ManyToOne, @ManyToMane, в чьих параметрах вы можете указать meaning свойства — cascade — тип каскаданости для данной связи. У JPA есть специфические методы для взаимодействия с сущностями (persist, save, merge…). Каскадные типы How раз используются для того, чтобы показать, How должны себя вести связанные данные при использовании этих методов на целевую сущность. Итак, Howие же существуют стратегии каскаскадности (типы каскадности)? Стандарт JPA подразумевает использование шести видов каскадности:
  • PERSIST — операции сохранения будут происходить каскадно (для методов save() и persist()). То есть, если мы сохраняем сущность, связанную с другими сущностями, они также сохраняются в БД (если их ещё там нет)

  • MERGE — операции обновления будут происходить каскадно (для метода merge())

  • REMOVE — операции удаления происходят каскадно (метод remove())

  • ALL — содержит сразу три каскадные операции — PERSIST - MERGE - REMOVE

В JPA есть понятие персистентная (persistence) сущность — сущность, связанная с её данными в БД, которая управляется текущей сессией (соединением). Если её изменить, но при этом не сохранить изменения в БД, всё равно её данные в БД будут изменены.
  • DETACH — связанные сущности не будут управляться сессией (метод detach()). То есть, при их изменении не будет автоматического изменения их данных в БД — они переводятся из состояния persistence в detached (сущность, не управляемая JPA)

  • REFRESH — при каждом обновлении сущности данными из БД (refresh() — обновляет detached an objectы) связанные сущности обновляются так же. Например, вы изменor How-то данные, взятые из БД, и хотите вернуть их изначальные значения. В таком случае вам и пригодится данная операция.

Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 6 - 4Hibernate поддерживает все эти стандартные каскадные операции, но также привносит три свои:
  • REPLICATE — используется, когда у нас есть более одного источника данных и мы хотим, чтобы данные синхронизировались (метод Hibernate — replicate). У всех сущностей должны быть идентификаторы (id), чтобы не было проблем с их генерацией (чтобы для разных БД одна и та же сущность не имела разных id)

  • SAVE_UPDATE — каскадное сохранение/удаление (для метода Hibernate — saveOrUpdate)

  • LOCK — операция, обратная к DETACHED: переводит detached сущность обратно в состояние persistence, т.е. entity станет снова отслеживаемой текущей сессией

Если не выбран тип каскадирования, ниHowая операция с сущностью не будет иметь эффекта для связанных с ней других entity.

54. Может ли Entity класс быть абстрактным?

В спецификации JPA в пункте 2.1 The Entity Class есть строка: “И абстрактные, и конкретные классы могут быть сущностями”. То есть, ответ — да, абстрактный класс может быть сущностью и может быть аннотирован с помощью @Entity.

55. What такое entity manager? За что отвечает?

В первую очередь хотелось бы отметить, что EntityManager — один из ключевых компонентов JPA, который используется для взаимодействия сущностей с базой данных. В общем-то методы взаимодействия сущности с БД у него-то и вызываются (persist, merge, remove, detach)... Но также отмечу, что данный компонент How правило не является одним на всё приложение: чаще всего он легковесен, часто удаляется и создается новый с помощью EntityManagerFactory. Если проводить параллель с JDBC, где EntityManagerFactory будет являться аналогом DataSource, то EntityManager в свою очередь будет являться аналогом Connection. Ранее я упоминал про персистентную (persistence) сущность, How сущность, которая управляется текущим соединением. Так вот: эта сущность управляется именно EntityManager-ом, который тесно связан с текущим соединением и TransactionManager-ом, который отвечает за открытие/закрытие транзакций. Далее на рисунке ниже вы можете видеть vital цикл сущности:Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 6 - 5EntityManager управляет сущностью, когда она на этапе Managed (в это время она персистентная, т.к. имеет связь с EntityManager-ом). То есть, она уже не new и ещё не removed. Можно сказать, что когда сущность new or removed, она также и detached, т.к. она не управляется EntityManager-ом. Существуют разные стратегии для EntityManager-а. То есть, может быть один синглтоновый EntityManager на всё приложение, а может создаваться каждый раз новый, под каждое соединение. Если же вы используете Spring, то управление созданием/удалением EntityManager-а происходит автоматически под капотом (но это не значит, что нельзя настроить это под себя ^^). Стоит сказать, что один or несколько EntityManager-ов и образуют и persistence context. Persistence context — это среда в которой экземпляры сущностей синхронизируются с аналогичными сущностями в базе данных (How я и говорил, это работает только для персистентных сущностей). Если вы углубитесь в изучение JPA (что я очень вам рекомендую), то с данными понятием вы будете сталкиваться очень и очень часто.

56. What такое класс Assert? Зачем его использовать?

В JPA я о таком классе не слышал, поэтому предположу, что тут имеется ввиду класс JUnit библиотеки, которая используется для модульного тестирования codeа. Класс данной библиотеки, Assert, используется для проверки результатов выполнения codeа (assert — утверждение, что в определенном месте у вас определенное состояние/данные). Например, вы тестируете метод, который должен создавать кота. Вы запускаете метод и получаете некоторый результат:
Cat resultOfTest = createCat();
Но ведь вам нужно убедиться, что он был правильно создан, не так ли? Поэтому вы до этого создали некого кота — expectedCat — вручную с точно такими параметрами, которые вы ожидаете от кота, полученного с метода createCat(). Далее вы и используете класс Assert для сверки полученных результатов:
Assert.assertEquals(resultOfTest, expectedCat);
Если коты будут отличаться, будет выброшено исключение AssertionError, которое говорит нам о том, что ожидаемые результаты не сходятся. У класса Assert есть множество различных методов, которые покрывают множество задач по проверке ожидаемых результатов. Вот некоторые из них:
  • assertTrue(<boolean>) — ожидаемое meaning, полученное в качестве аргумента, должно быть true

  • assertFalse(<boolean>) — ожидаемое meaning, полученное в качестве аргумента, должно быть false

  • assertNotEquals(<object1>, <object2>) — an objectы, полученные в качестве аргументов, при сравнении посредством equals должны быть разными (false)

  • assertThrows(<ClassNameOfException>.class, <exceptionObject>) — ожидается, что вторым аргументом будет исключение класса, прописанного первым аргументом (т.е. How правило на месте второго аргумента вызывается метод, который должен бросать исключение нужного типа)

String

57. Дайте характеристику String в Java

String — стандартный класс в Java, отвечающий за хранение и манипуляции со строковыми значениями (последовательности символов), является immutable классом (об immutable я писал ранее), т.е. данные an objectов данного класса невозможно изменить после создания. Хотелось бы сразу отметить, что классы StringBuilder и StringBuffer — это два фактически одинаковых класса с той лишь разницей, что один из них предназначен для использования в многопоточной среде (StringBuffer). Эти классы являются аналогами String, но в отличие от него они изменяемы. То есть an objectы после создания допускают модификацию строки, которую представляют, без создания нового an object. Собственно, методы отличаются от стандартных методов String и направлены на удовлетворение потребностей по изменению строки (не зря же builder-ом назвали). Подробнее о String, StringBuffer и StringBuilder читайте вот в этой статье.

58. Какие есть способы создания an object String? Где он создаётся?

Самый привычный способ создания строки — простое задание нужного нам значения в двойных скобках:
String str = "Hello World!";
Также можно сделать это непосредственно через new:
String str = new String("Hello World!");
Можно создать строку и отталкиваясь от массива символов:
char[] charArr = {'H','e','l','l','o',' ', 'W','o','r','l','d','!'};
String str = new String(charArr);
Как результат работы метода toString на некотором an objectе:
String str = someObject.toString();
Как результат работы любого другого метода возвращает строковое представление. Например:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str =  reader.readLine();
Как вы поняли, способов создания строки может быть очень и очень много. При создании an object String он сохраняется в строковом пуле, о котором подробнее мы поговорим в одном из вопросов далее.

59. Как сравнить две строки в Java и How их отсортировать?

Для сравнения значений в Java используется знак двойного равно ==. Если бы нам нужно было сравнивать некоторые простые значения вроде int, мы бы воспользовались им. Но для сравнения полноценных an objectов данный способ неприменим. В таком случае это будет лишь сравнение ссылок — указывают ли они на один и тот же они an object or нет. То есть при сравнении двух an objectов с совершенно одинаковыми значениями внутренних полей сравнение через == даст результат false: несмотря на одинаковость полей an objectов, сами an objectы занимают разные ячейки памяти. А an objectы класса String, несмотря на обманчивую простоту, всё же являются an objectми. И сравнение через == для них также неприменимо (даже несмотря на наличие строкового пула). Тут за дело берется стандартный метод класса Objectequals, который необходимо переопределить в классе для его корректной работы (иначе по умолчанию он сравнивает через ==). В классе String он переопределен, значит просто берем и используем его:
String firstStr = "Hello World!";
String secondStr = "Hello World!";
boolean isEquals = firstStr.equals(secondStr);
Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 6 - 6Мы говорor о сравнении на соответствие, а теперь разберем сравнение для сортировки. Ведь для сортировки чего-либо нам нужно знать, по Howому принципу сортировать. Для этого можно воспользоваться стандартным отсортированным множеством — TreeSet. Подробнее о различных коллекциях в Java вы можете почитать в этой статье. Данный список работает на основе алгоритма красно-черного дерева и сортирует множество в соответствии с заданным принципом сортировки. Как я и сказал ранее, нужно понимать, How отсортировать an objectы определенного типа. Whatбы задать способ сравнения для сортировки, используют компараторы. Как правило их необходимо реализовывать для классов, которые вы хотите сортировать, но в случае со String они уже реализованы. Поэтому просто добавляем нужные нам строки в TreeSet, а он их отсортирует:
TreeSet<String> sortedSet = new TreeSet<>();
sortedSet.add("B");
sortedSet.add("C");
sortedSet.add("A");
sortedSet.forEach(System.out::println);
Вывод в консоли:
A B C

60. Приведите алгоритм перевода строки в символ. Напишите соответствующий code

Как я и говорил ранее, у an objectов класса String очень много разных полезных методов. Один из таких — toCharArray. Данный метод переводит строку в массив символов:
String str = "Hello world";
char[] charArr = str.toCharArray();
Далее у нас есть массив символов, которые можем вызывать по индексу:
char firstChar = charArr[0]; // H

61. Как перевести строку в массив byteов и назад ? Напишите соответствующий code

Аналогичный методу toCharArray, класс String имеет метод getBytes, который возвращает массив byteов строки:
String str = "Hello world";
byte[] byteArr = str.getBytes();
byte firstChar = byteArr[6]; // 119
Сегодняшняя часть разбора подошла к логическому концу. Спасибо за внимание!Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 6 - 7
Другие материалы серии:
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION