-
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:
- 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.
- Machen Sie alle Felder
final
undprivate
. Auf markierte Felderprivate
kann von außerhalb des Kurses nicht zugegriffen werden. Wenn Sie sie markieren,final
stellen Sie sicher, dass Sie sie nicht ändern, auch nicht aus Versehen. - 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. - 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
Map
Schlüssel undSet
Elemente (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 .
-
In Java als Wert oder als Referenz übergeben?
Java спецификация гласит, что все в Java передается по значению. Нет такого понятия, Wie «передача по ссылке» в Java. Эти условия связаны с вызовом методов и передачей переменных, Wie параметров метода. Хорошо, примитивные типы всегда передаются по значению без Wieой-либо путаницы. Но, концепция должна быть понятна в контексте параметра метода сложных типов.
В Java, когда мы передает ссылку сложного типа Wie любой параметр метода, всегда Adresse памяти копируется в новую ссылочную переменную шаг за шагом. Посмотрите на изображение:
В приведенном примере, биты Adresseа первого экземпляра копируются другой ссылочной переменной, в результате чего обе ссылки указывают на один участок памяти, где хранится ein Objekt. Помните, что присвоив второй ссылке null, вы не присвоите null первой ссылке. Но изменение состояния ein Objektа с одной ссылающейся переменной, будет отображено и в другой ссылке.
Подробности смотрите тут.
-
Какое применение блока
finally
? Гарантирует этот блок выполнение своего Codeа? Когдаfinally
блок не вызывается?Блок
finally
всегда вызывается, если блокtry
существует. Это гарантирует, что блокfinally
вызывается даже, если случается неожиданное исключение. Ноfinally
является более полезным, чем просто для обработки исключений – этот блок позволяет выполнить чистку Codeа, случайно обошедшего черезreturn
,continue
oderbreak
. Размещение очищающего Codeа в блокfinally
всегда является хорошей практикой, даже когда не ожидается ниWieих исключений.Если виртуальная машина завершает работу во время выполнения блока
try
odercatch
, тогда блокfinally
не будет выполнен. Аналогично, если нить, выполняя блокtry
odercatch
, будет прервана oder убита, блокfinally
не будет выполнен, даже не смотря на то, что приложение продолжает работать. -
Почему существует два класса
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ы, секунды и миллисекунды должны быть нулю… но это не является обязательным для класса. -
Разъясните интерфейсы-маркеры.
Шаблон интерфейса-маркера – это шаблон проектирования в компьютерных науках, используемый языками программирования, которые предоставляют информацию об ein Objektах во время выполнения. Это предоставляет способ ассоциации метаданных класса, где язык не имеет явной поддержки таких метаданных. В Java для этого используются интерфейсы без указания методов.
Хорошим примером применения интерфейса-маркера в Java является интерфейс
Serializable
. Класс реализует этот интерфейс для указания, что его неtransient
данные могут быть записаны в поток Byteов oder на файловую систему.Главной проблемой интерфейса-маркера является то, что интерфейс определяет соглашение для реализующих его классов, и это соглашение наследуется всеми субклассами. Это значит, что вы не сможете «де-реализовать» маркер. В приведенном примере, если вы создадите субкласс, который вы бы не хотели сериализовать (возможно потому, что он находится в преходящем (transient) состоянии), вы должны прибегнуть к явному бросанию
NotSerializableException
. -
Почему метод
main()
объявлен Wiepublic 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 подразумевает ненормальное завершение, иначе все в порядке. -
В чем разница между созданием строки Wie
new()
и литералом (при помощи двойных кавычек)?Когда мы создаем строку используя
new()
, она создается в хипе и также добавляется в пул строк, в то же время строка, созданная при помощи литерала, создается только в пуле строк.Вам необходимо ознакомиться с понятием пула строк глубже, чтобы ответить на этот oder подобные вопросы. Мой совет – Wie следует выучите класс String и пул строк.
-
Как работает метод
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[]
, содержащее наше новое количество символов. -
Объясните работу
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 ObjektEntry
необходимо разместить на конкретном индексе,HashMap
проверяет, существует ли на этом месте другой ein ObjektEntry
? Если там нет записи, наш 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
обеспечивает уникальность ключей. - В первую очередь, ein Objekt ключа проверяется на
-
Различия между интерфейсами и абстрактными классами?
Это очень распространенный вопрос, если вы проходите собеседование на программиста уровня 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.
- В интерфейсах Java переменные априори
-
Wann überschreiben Sie Methoden
hashCode()
undequals()
?Methoden
hashCode()
undequals()
werden in der Klasse definiertObject
, 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 mussHashTable
. Standardmäßig gibt die MethodehashCode()
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 wirdequals()
. Dies ist notwendig, um die allgemeine Konvention der Methode zu unterstützenhashCode
, 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 hatequals()
, muss es weiterhin denselben Wert zurückgeben.Die Beziehung zwischen den beiden Methoden ist: Immer, wenn
a.equals(b)
, danna.hashCode()
muss dasselbe sein wieb.hashCode()
.
Andrey
Level 26
Java Core. Interviewfragen, Teil 1
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. Diese 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 .
GO TO FULL VERSION