JavaRush /Java-Blog /Random-DE /Java Core. Interviewfragen, Teil 1
Andrey
Level 26

Java Core. Interviewfragen, Teil 1

Veröffentlicht in der Gruppe Random-DE
Für diejenigen, die das Wort Java Core zum ersten Mal hören, sind dies die grundlegenden Grundlagen der Sprache. Mit diesem Wissen können Sie bedenkenlos ein Praktikum/Praktikum absolvieren. Java Core.  Interviewfragen, Teil 1 - 1Diese Fragen helfen Ihnen, Ihr Wissen vor dem Vorstellungsgespräch aufzufrischen oder etwas Neues für sich zu lernen. Um praktische Fähigkeiten zu erwerben, studieren Sie bei JavaRush .
  1. Wie erstelle ich ein unveränderliches Objekt in Java? Listen Sie alle Vorteile auf

    Eine unveränderliche Klasse ist eine Klasse, deren Zustand nach der Erstellung nicht geändert werden kann. Hier wird der Zustand eines Objekts im Wesentlichen als der in einer Instanz einer Klasse gespeicherte Wert betrachtet, sei es ein primitiver Typ oder ein Referenztyp.

    Um eine Klasse unveränderlich zu machen, müssen die folgenden Bedingungen erfüllt sein:

    1. Stellen Sie keine Setter oder Methoden bereit, die Felder oder Objekte ändern, die auf Felder verweisen. Setter implizieren die Änderung des Zustands eines Objekts, was wir hier vermeiden wollen.
    2. Machen Sie alle Felder finalund private. Auf markierte Felder privatekann von außerhalb des Kurses nicht zugegriffen werden. Wenn Sie sie markieren, finalstellen Sie sicher, dass Sie sie nicht ändern, auch nicht aus Versehen.
    3. Erlauben Sie nicht, dass Unterklassen Methoden überschreiben. Der einfachste Weg, dies zu tun, besteht darin, die Klasse als zu deklarieren final. Finalisierte Klassen in Java können nicht überschrieben werden.
    4. Denken Sie immer daran, dass Ihre Variableninstanzen entweder veränderlich oder unveränderlich sein können. Definieren Sie sie und geben Sie neue Objekte mit kopiertem Inhalt für alle veränderlichen Objekte (Referenztypen) zurück. Unveränderliche Variablen (primitive Typen) können ohne zusätzlichen Aufwand sicher zurückgegeben werden.

    Außerdem müssen Sie sich an die nachfolgenden Vorteile unveränderlicher Klassen erinnern. Möglicherweise benötigen Sie sie bei einem Vorstellungsgespräch. Unveränderliche Klassen:

    • einfach zu entwerfen, zu testen und zu verwenden
    • automatisch Thread-sicher und weist keine Synchronisierungsprobleme auf
    • erfordern keinen Kopierkonstruktor
    • ermöglichen es Ihnen, einen Hashcode langsam zu initialisieren und den Rückgabewert zwischenzuspeichern
    • Bei Verwendung als Feld ist kein sicheres Kopieren erforderlich
    • Erstellen Sie gute MapSchlüssel und SetElemente (diese Objekte sollten ihren Status in der Sammlung nicht ändern).
    • Machen Sie Ihre Klasse dauerhaft, indem Sie sie einmal erstellen, und sie muss nicht erneut überprüft werden
    • haben immer „Fehleratomizität“ (ein von Joshua Bloch geprägter Begriff): Wenn ein unveränderliches Objekt eine Ausnahme auslöst, bleibt es niemals in einem unerwünschten oder undefinierten Zustand.

    Schauen Sie sich das Beispiel in diesem Beitrag an .

  2. In Java als Wert oder als Referenz übergeben?

    Java спецификация гласит, что все в Java передается по значению. Нет такого понятия, Wie «передача по ссылке» в Java. Эти условия связаны с вызовом методов и передачей переменных, Wie параметров метода. Хорошо, примитивные типы всегда передаются по значению без Wieой-либо путаницы. Но, концепция должна быть понятна в контексте параметра метода сложных типов.

    В Java, когда мы передает ссылку сложного типа Wie любой параметр метода, всегда Adresse памяти копируется в новую ссылочную переменную шаг за шагом. Посмотрите на изображение:

    Java Core.  Interviewfragen, Teil 1 - 2

    В приведенном примере, биты Adresseа первого экземпляра копируются другой ссылочной переменной, в результате чего обе ссылки указывают на один участок памяти, где хранится ein Objekt. Помните, что присвоив второй ссылке null, вы не присвоите null первой ссылке. Но изменение состояния ein Objektа с одной ссылающейся переменной, будет отображено и в другой ссылке.

    Подробности смотрите тут.

  3. Какое применение блока finally? Гарантирует этот блок выполнение своего Codeа? Когда finally блок не вызывается?

    Блок finally всегда вызывается, если блок try существует. Это гарантирует, что блок finally вызывается даже, если случается неожиданное исключение. Но finally является более полезным, чем просто для обработки исключений – этот блок позволяет выполнить чистку Codeа, случайно обошедшего через return, continue oder break. Размещение очищающего Codeа в блок finally всегда является хорошей практикой, даже когда не ожидается ниWieих исключений.

    Если виртуальная машина завершает работу во время выполнения блока try oder catch, тогда блок finally не будет выполнен. Аналогично, если нить, выполняя блок try oder catch, будет прервана oder убита, блок finally не будет выполнен, даже не смотря на то, что приложение продолжает работать.

  4. Почему существует два класса Date, один в java.util package а другой в java.sql?

    java.util.Date представляет Datum и время, а java.sql.Date представляет только Datum. Дополнением к java.sql.Date является класс java.sql.Time, который представляет только время.

    Класс java.sql.Date является субклассом (расширением) класса java.util.Date. Итак, что изменилось в java.sql.Date:

    • toString() формирует другое представление строки: yyyy-mm-dd
    • статический метод valueOf(String) создает Datum из строки с вышеуказанным представлением
    • исключены геттеры и сеттеры для часов, Protokoll и секунд

    Класс java.sql.Date используется в JDBC и предназначен, чтобы не иметь составляющую времени, то есть часы, Protokollы, секунды и миллисекунды должны быть нулю… но это не является обязательным для класса.

  5. Разъясните интерфейсы-маркеры.

    Шаблон интерфейса-маркера – это шаблон проектирования в компьютерных науках, используемый языками программирования, которые предоставляют информацию об ein Objektах во время выполнения. Это предоставляет способ ассоциации метаданных класса, где язык не имеет явной поддержки таких метаданных. В Java для этого используются интерфейсы без указания методов.

    Хорошим примером применения интерфейса-маркера в Java является интерфейс Serializable. Класс реализует этот интерфейс для указания, что его не transient данные могут быть записаны в поток Byteов oder на файловую систему.

    Главной проблемой интерфейса-маркера является то, что интерфейс определяет соглашение для реализующих его классов, и это соглашение наследуется всеми субклассами. Это значит, что вы не сможете «де-реализовать» маркер. В приведенном примере, если вы создадите субкласс, который вы бы не хотели сериализовать (возможно потому, что он находится в преходящем (transient) состоянии), вы должны прибегнуть к явному бросанию NotSerializableException.

  6. Почему метод main() объявлен Wie public static void?

    Почему public? Метод main имеет модификатор доступа public, поэтому он может быть доступен везде и для любого ein Objektа, который захочет использовать этот метод для запуска Anwendungen. Тут я не говорю, что JDK/JRE имеют подобный повод, поскольку java.exe oder javaw.exe (для windows) используют Java Native Interface (JNI) вызов для запуска метода, поэтому они могут вызвать его в любом случае, независимо от модификатора доступа.

    Почему static? Давайте предположим, что у нас метод main не статический. Теперь, для вызова любого метода вам необходим экземпляр класса. Верно? Java разрешает иметь перегруженные конструкторы, это мы все знаем. Тогда который из них должен быть использован, и откуда возьмутся параметры для перегруженного конструктора?

    Почему void? Нет применения для возвращаемого значения в виртуальной машине, которая фактически вызывает этот метод. Единственное, что приложение захочет сообщить вызвавшему процессу – это нормальное oder ненормальное завершение. Это уже возможно используя System.exit(int). Не нулевое Bedeutung подразумевает ненормальное завершение, иначе все в порядке.

  7. В чем разница между созданием строки Wie new() и литералом (при помощи двойных кавычек)?

    Когда мы создаем строку используя new(), она создается в хипе и также добавляется в пул строк, в то же время строка, созданная при помощи литерала, создается только в пуле строк.

    Вам необходимо ознакомиться с понятием пула строк глубже, чтобы ответить на этот oder подобные вопросы. Мой совет – Wie следует выучите класс String и пул строк.

    У нас в переводах уже есть хорошая статья о строках и строковом пуле: Часть 1, Часть 2.
  8. Как работает метод substring() класса String?

    Как и в других языках программирования, строки в Java являются последовательностью символов. Этот класс больше похож на служебный класс для работы с этой последовательностью. Последовательность символов обеспечивается следующей переменной:

    /** The value is used for character storage. */
    /** Значение используется для хранения символов */
    private final char value[];
    Для доступа к этому массиву в различных сценариях используются следующие переменные/** The offset is the first index of the storage that is used. */
    /** Смещение – это первый индекс используемого хранoderща. */
    private final int offset;
    
    /** The count is the number of characters in the String. */
    /** Счет – это количество символов в строке. */
    private final int count;

    Каждый раз, когда мы создаем подстроку от существующего экземпляра строки, метод substring() только устанавливает новые значения переменных offset и count. Внутренний массив символов не изменяется. Это возможный источник утечки памяти, если метод substring() использовать неосторожно:

    Первоначальное Bedeutung value[] не изменяется. Поэтому если вы создадите строку длиной 10000 символов и создадите 100 подстрок с 5-10 символами в каждой, все 101 ein Objektы будут содержать один и тот же символьный массив длиной 10000 символов. Это без сомнения расточительство памяти.

    Этого можно избежать, изменив Code следующим образом:

    заменить original.substring(beginIndex) на new String(original.substring(beginIndex)), где original – исходная строка.

    Примечание переводчика: я затрудняюсь сказать к Wieой версии Java это применимо, но на данный момент в Java 7 этот пункт статьи не актуален. Метод substring() вызывает конструктор класса new String(value, beginIndex, subLen), который в свою очередь обращается к методу Arrays.copyOfRange(value, offset, offset+count). Это значит, что у нас будет каждый раз новое Bedeutung переменной value[], содержащее наше новое количество символов.
  9. Объясните работу HashMap. Как решена проблема дубликатов?

    Большинство из вас наверняка согласится, что HashMap наиболее любимая тема для дискуссий на интервью в настоящее время. Если кто-нибудь попросит меня рассказать «Как работает HashMap?», я просто отвечу: «По принципу хэширования». Так просто, Wie это есть.

    Итак, хеширование по сути является способом назначить уникальный Code для любой переменной/ein Objektа после применения любой формулы/алгоритма к своим свойствам.

    Определение карты (Map) таково: «Объект, который привязывает ключи к значениям». Очень просто, верно? Итак, HashMap содержит собственный внутренний класс Entry, который имеет вид:

    static class Entry implements Map.Entry
    {
    final K key;
    V value;
    Entry next;
    final int hash;//More code goes here
    }

    Когда кто-либо пытается поместить пару ключ-Bedeutung в HashMap, происходит следующее:

    • В первую очередь, ein Objekt ключа проверяется на null. Если ключ null, Bedeutung сохраняется в позицию table[0]. Потому что хэшCode для null всегда 0.
    • Затем, следующим шагом вычисляется хэш Bedeutung вызывая у переменной-ключа свой метод hashCode(). Этот хэш используется для вычисления индекса в массиве для хранение ein Objektа Entry. Разработчики JDK прекрасно понимали, что метод hashCode() может быть плохо написан и может возвращать очень большое oder очень маленькое Bedeutung. Для решения этой проблемы они ввели другой hash() метод, и передают хэшCode ein Objektа этому методу для приведения этого значения к диапазону размера индекса массива.
    • Теперь вызывается метод indexFor(hash, table.length) для вычисления точной позиции для хранения ein Objektа Entry.
    • Теперь главная часть. Как мы знаем, два неодинаковых ein Objektа могут иметь одинаковое Bedeutung хэшCodeа, Wie два разных ein Objektа будет храниться в одинаковом расположении в архиве [называется корзиной]?

    Ответ – LinkedList. Если вы помните, класс Entry имеет свойство “next”. Это свойство всегда указывает на следующий ein Objekt в цепи. Такое поведение очень похоже на LinkedList.

    Итак, в случае совпадений хэшCodeов, ein Objektы Entry хранятся в форме LinkedList. Когда ein Objekt Entry необходимо разместить на конкретном индексе, HashMap проверяет, существует ли на этом месте другой ein Objekt Entry? Если там нет записи, наш ein Objekt сохранится в этом месте.

    Если на нашем индексе уже находится другой ein Objekt, проверяется его поле next. Если оно равно null, наш ein Objekt становится следующим узлом в LinkedList. Если next не равно null, эта Verfahrenа повторяется, пока не будет найдено поле next равное null.

    Was будет, если мы добавим другое Bedeutung ключа, равное добавленному ранее? Логично, что оно должно заменить старое Bedeutung. Как это происходит? После определения индекса позиции для ein Objektа Entry, пробегая по LinkedList, расположенному на нашем индексе, HashMap вызывает метод equals() для значения ключа для каждого ein Objektа Entry. Все эти ein Objektы Entry в LinkedList имеют одинаковое Bedeutung хэшCodeа, но метод equals() будет проверять на настоящее gleichtство. Если ключ.equals(k) будет true, тогда оба будут восприниматься Wie одинаковый ein Objekt. Это вызовет замену только ein Objektа-Bedeutung внутри ein Objektа Entry.

    Таким образом HashMap обеспечивает уникальность ключей.

  10. Различия между интерфейсами и абстрактными классами?

    Это очень распространенный вопрос, если вы проходите собеседование на программиста уровня junior. Наиболее значимые различия приведены ниже:

    • В интерфейсах Java переменные априори final. Абстрактные классы могут содержать не final переменные.
    • Интерфейс в Java безоговорочно не может иметь реализации. Абстрактный класс может иметь экземпляры методов, которые реализуют базовое поведение.
    • Составляющие интерфейса должны быть public. Абстрактный класс может иметь модификаторы доступа на любой вкус.
    • Интерфейс должен быть реализован ключевым словом implements. Абстрактный класс должен быть расширен при помощи ключевого слова extends.
    • В Java класс может реализовывать множество интерфейсов, но может унаследоваться только от одного абстрактного класса.
    • Интерфейс völlig абстрактный и не может иметь экземпляров. Абстрактный класс также не может иметь экземпляров класса, но может быть вызван, если существует метод main().
    • Eine abstrakte Klasse ist etwas schneller als eine Schnittstelle, da die Schnittstelle eine Suche erwartet, bevor sie eine überschriebene Methode in Java aufruft. In den meisten Fällen handelt es sich hierbei um einen geringfügigen Unterschied. Wenn Sie jedoch eine zeitkritische Bewerbung schreiben, müssen Sie diesen Umstand berücksichtigen.
  11. Wann überschreiben Sie Methoden hashCode()und equals()?

    Methoden hashCode()und equals()werden in der Klasse definiert Object, die die übergeordnete Klasse für alle Java-Objekte ist. Aus diesem Grund erben alle Java-Objekte die zugrunde liegende Implementierung dieser Methoden.

    Die Methode hashCode()wird verwendet, um einen eindeutigen ganzzahligen Wert für ein bestimmtes Objekt zu erhalten. Dieser Wert wird verwendet, um den Speicherort des Papierkorbs zu bestimmen, wenn das Objekt in einer Datenstruktur wie gespeichert werden muss HashTable. Standardmäßig gibt die Methode hashCode()eine ganzzahlige Darstellung der Speicheradresse zurück, an der das Objekt gespeichert ist.

    Die Methode equals()wird, wie der Name schon sagt, zur einfachen Objektäquivalenz verwendet. Die grundlegende Implementierung der Methode besteht darin, die Referenzen zweier Objekte zu überprüfen, um zu prüfen, ob sie gleichwertig sind.

    Beachten Sie, dass es normalerweise immer dann erforderlich ist, eine Methode zu überschreiben, hashCode()wenn eine Methode überschrieben wird equals(). Dies ist notwendig, um die allgemeine Konvention der Methode zu unterstützen hashCode, die besagt, dass gleiche Objekte gleiche Hashcodes haben müssen.

    Die Methode equal() muss die Gleichheit zwischen Beziehungen bestimmen (sie muss rekurrent, symmetrisch und transitiv sein). Darüber hinaus muss es persistent sein (wenn sich das Objekt nicht geändert hat, muss die Methode denselben Wert zurückgeben). Außerdem o.equals(null)sollte es immer false zurückgeben .

    hashCode()muss außerdem persistent sein (wenn sich das Objekt unter den Bedingungen der Methode nicht geändert hat equals(), muss es weiterhin denselben Wert zurückgeben.

    Die Beziehung zwischen den beiden Methoden ist: Immer, wenn a.equals(b), dann a.hashCode()muss dasselbe sein wie b.hashCode().

Viel Erfolg beim Studium!! Autor des Artikels Lokesh Gupta Originalartikel Links zu anderen Teilen: Java Core. Interviewfragen, Teil 2 Java Core. Fragen für ein Interview, Teil 3
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION