
- •Типы join'ов в sql
- •1.Что такое класс Object? Какие в нем есть методы?
- •13. Если у класса-родителя есть метод, объявленный как private, может ли наследник расширить его видимость? а если protected? а сузить видимость?
- •Volatile-
- •2 Потока работают с одним объектом Obj. Один готовит данные, а другой отправляет их. Первый подготовил данные и вызвал:
- •42. Назовите несколько классов из вершины иерархии исключений в Java.
Java собеседование вопросы и ответы
Что такое рефлексия? – Это механизм исследования данных о программе во время выполнения. Рефлексия позволяет получать и исследовать информацию о полях, методах и конструкторах классов. Также можно выполнять операции над полями и методами которые исследуются. Интерфейс Java Reflection API позволяет сделать следущее:
Определить класс объекта.
Получить информацию о модификаторах класса, полях, методах, конструкторах и суперклассах.
Выяснить, какие константы и методы принадлежат интерфейсу.
Создать экземпляр класса, имя которого неизвестно до момента выполнения программы.
Получить и установить значение свойства объекта.
Вызвать метод объекта.
Создать новый массив, размер и тип компонентов которого неизвестны до момента выполнения программ.
Что такое сборка мусора? Какой процес отвечает за сборку мусора в Java? - Освобождение памяти, путем удаления объектов, которые уже не будут востребованы приложениями. Процесс называется Сборщиком мусора (Garbage collector).
Какого типа процесс сборщика мусора? – Сборщик мусора – процесс-демон.
Что значит процесс-демон? – Это процессы, которые могут работать без вмешательства пользователя.JVM может быть выключена, когда в ней есть процесс-демон, при этом внезапно убивая этот процесс.
Как вы будете вызывать какой-нибудь внешний процесс из Java? – Runtime.getRuntime().exec(….)
Что делает метод finalize? – Если сборщик мусора соберется удалить объект, то сперва он вызовет метод finalize, если он определен.
Что такое изменяемые и неизменяемые объекты? – Если значение объекта может быть изменено, то объект называется изменяемым. (Например, StringBuffer, …) Если значение объекта изменять не позволяется, то объект называется неизменяемым. (Например, String, Integer, Float, …)
Какое основное отличие между объектами string и stringbuffer? – String iэто неизменяемый объект. StringBuffer является изменяемым объектом.
Что такое рефлексия? – Это механизм исследования данных о программе во время выполнения. Рефлексия позволяет получать и исследовать информацию о полях, методах и конструкторах классов. Также можно выполнять операции над полями и методами которые исследуются. Интерфейс Java Reflection API позволяет сделать следущее:
Определить класс объекта.
Получить информацию о модификаторах класса, полях, методах, конструкторах и суперклассах.
Выяснить, какие константы и методы принадлежат интерфейсу.
Создать экземпляр класса, имя которого неизвестно до момента выполнения программы.
Получить и установить значение свойства объекта.
Вызвать метод объекта.
Создать новый массив, размер и тип компонентов которого неизвестны до момента выполнения программ.
Какой базовый класс у Error и Exception? – Throwable
Диапазон значений типа byte? -128 to 127
Какие подходы вы будете использовать, чтобы сделать вашу программу эффективной? – Избегать слишком много статических методов. Избегать чрезмерного и необоснованного использования синхронизированных методов, выбирать соответствующие классы на основании типа приложения(имеется в виду синхронизированные классы для многопользовательских приложений и не синхронизированных классов для одного пользователя). Использовать соответствующие шаблоны проектирования. Избегать создания переменных в цикле и многое другое.
Что такое DatabaseMetaData? – Исчерпывающая информация о базе данных в целом.
JVM это компилятор или интерпретатор? – интерпретатор
Когда нужно оптимизировать код, какой лучший способ найти время/память, которые процесс потребляет? – Использовать профайлер
Что обозначает ключевое слово final? – final обозначает что описанная реализация этого метода или переменной или класса является окончательной. Вы больше не сможете изменить этот метод / переменную / класс.
Какого главное отличие между LinkedList и ArrayList? – LinkedList предназначен для последовательного доступа. ArrayList предназначен для рандомного доступа.
Какие методы есть в классе Object? – clone, equals, wait, finalize, getClass, hashCode, notify, notifyAll, toString
Можно ли создать объект класса Math? – Объект класса Math создать нельзя. Все методы этого класса static. Его конструктор не публичен.
Что такое синглтон? – Это один из паттернов проектирования.
public class Singleton {
private static final Singleton s = new Singleton();
private Singleton() { }
public static Singleton getInstance() {
return s;
} // all non static methods …
}
Что такое DriverManager? – Основной сервиз для управления множеством JDBC драйверов.
Наследование — механизм языка, позволяющий написать новый класс на основе уже существующего (родительского, базового) класса. Класс–потомок может добавить собственные методы и свойства и пользоваться родительскими методами и свойствами. Позволяет строить иерархии классов.
Инкапсуляция — механизм языка программирования, который ограничивает доступ к составляющим объект компонентам (методам и переменным), делает их приватными, т.е. доступными только внутри объекта. Важно понимать, что к инкапсулированной переменной можно обратиться, когда пишешь реализацию класса, но при самом его использовании доступа не будет.
Это важный инструмент ООП наряду с полиморфизмом, Наследованием и Абстракцией данных.
В то же время, в языках поддерживающих замыкания, инкапсуляция рассматривается как понятие не присущее исключительно объектно-ориентированному программированию. Также, реализации абстрактных типов данных (например, модули) предлагают схожую модель инкапсуляции.
Полиморфи́зм (от греч. πολὺ- — много, и μορφή — форма) в языках программирования — возможность объектов с одинаковой спецификацией иметь различную реализацию.
Язык программирования поддерживает полиморфизм, если классы с одинаковой спецификацией могут иметь различную реализацию — например, реализация класса может быть изменена в процессе наследования[1].
Кратко смысл полиморфизма можно выразить фразой: «Один интерфейс, множество реализаций».
В Java есть два типа исключений, checked и unchecked. Checked исключения, это те, которые должны обрабатываться блоком catch или описываться в сигнатуре метода. Unchecked могут не обрабатываться и не быть описанными. Unchecked исключения в Java - наследованные от RuntimeException, checked - от Exception (не включая unchecked). Пример unchecked исключения - NullPointerException, checked исключения - IOException.
XML и Парсеры.
XML — текстовый формат, предназначенный для хранения структурированных данных (взамен существующих файлов баз данных), для обмена информацией между программами, а также для создания на его основе более специализированных языков разметки (например, XHTML). Существуют SAX,DOM,JDOM парсеры. А STAX,TRAX,XPATH это API для работы с ними. SAX парсер читает xml документ и реагирует на появившиеся события, при этом в отличии от DOM он не сохраняет документ в памяти. DOM парсер сохраняет дерево документа в памяти и позволяет работать с ним. При одноазовом лучше пользоваться SAX. Но смотря для каких целей,лучше всего для поиска использовать XPATH Изменение можно сделать XPATH парсером.
Устройство TreeSet. Работа с TreeSet
В основе TreeSet лежит красно-черное дерево, которое умеет само себя балансировать. TreeSet все равно в каком порядке вы добавляете в него элементы, преимущества этой структуры данных будут сохраняться. То есть если добавлять элементы по возрастанию, то распределены по дереву они все равно будут равномерно, в отличии от обычного бинарного дерева.
Interface Comparable задает свойство сравнения объекту реализующему его. То есть делает объект сравнимым (по правилам разработчика). Пример. Interface Comparator позволяет создавать объекты, которые будут управлять процессом сравнения (например при сортировках). Пример.
Коллекции (Collections) в Java
List
List - упорядоченная коллекция иногда называемая списком или последовательностью. Список может содержать повторяющиеся элементы. Разработчик имеет абсолютный контроль над тем, в каком месте списка будет вставлен каждый элемент. Также пользователь может получить доступ к элементам списка по индексу. В дополнение к стандартным операциям интерфейса Collection, List содержит следующие:
Доступ по позиции;
Поиск;
Специальный итератор ListIterator;
Диапазон элементов (sublist).
Доступ по позиции - манипулирует элементами на основе их индексной позиции в списке.
Не взирая на то, что в интерфейсе List присутствуют методы для доступа к элементу по позиции (индексу), делать это не рекоммендуется. В некоторых реализациях списка (например, LinkedList), эти операции могут выполнятся за время, пропорциональное значению индекса.
Поиск - находит указанный элемент и возвращает его позицию в списке. Для этого служит два метода: indexOf() и lastIndexOf().
Специальный итератор ListIterator - содержит усовершенствованный итератор ListIterator для обработки последовательных свойств списка.
ListIterator позволяет вставлять и заменять элементы и производить перебор элементов в двух направлениях. Ниже приведено объявление интерфейса ListIterator:
В отличие от Set, List может содержать повторяющиеся элементы. Также может содержать null-элементы.
ArrayList - наиболее широко используемая реализация List. ArrayList обладает наибольшей производительностью в плане доступа к случайному элементу в массиве.
LinkedList - еще одна реализация интерфейса List. В отличие от ArrayList, LinkedList обладает большей скоростью вставки элемента в произвольное место в списке, однако доступ к элементу прямо пропорциональный его позиции относительно начала последовательности.
Set
Set - коллекция, которая не может содержать повторяющихся одинаковых элементов, иногда называемая множеством. Более формально, коллекция не может содержать пары элементов e1 и e2 таких, что выполняется условие e1.equals(e2) и не более одного null элемента.
Платформа Java содержит три универсальных реализации коллекции Set: HashSet, TreeSet и LinkedHashSet.
HashSet хранит элементы в хеш-таблице, из-за чего имеет наиболее высокую производительность, но не гарантирует порядок элементов;
TreeSet хранит элементы в отсортированном порядке, из-за чего работает существенно медленнее, чем HashSet;
LinkedHashSet отличается от HashSet тем, что хранит элементы в порядке их вставки в коллекцию. Эта коллекция лишь немного медленнее HashSet.
Многие могут задуматься, что при попытке добавлении существующего элемента в LinkedHashSet существует 2 варианта развития событий. Первый вариант - существующий элемент удаляется из коллекции, а в конец коллекции добавляется (этот же) элемент. Второй вариант - коллекция не изменяется и все элементы остаются на своих местах
Ниже приведено несколько положений, о которых необходимо помнить:
Особое внимание необходимо уделить элементам, которые могут изменяться. В поведении Set не указано, что делать если значение элемента Set изменилось таким образом, что объект стал равен другому объекту из множества.
Некоторые реализации Set имеют ограничения на элементы, которые они могут содержать. Например, в некоторых множествах не разрешено добавление null элементов. При попытке добавления null в коллекцию обычно происходит unchecked исключение NullPointerException или ClassCastException.
Две коллекции Set равны в случае, если содержать одинаковые элементы. Как ни странно, но это касается и LinkedHashSet. Даже если у вас две коллекции LinkedHashSet содержать одинаковые элементы, но расположение элементов отличается, метод equals() всё равно вернет true.
Если добавление элемента (с использованием метода add()) завершилось неудачей (например, такой элемент уже существует в коллекции), то возвращается false. Иначе - true.
Map
Map - объект, который хранит пары ключ-значение и не может содержать повторяющихся ключей. При добавлении элемента по существующему ключу происходит запись нового элемента по ключу вместо старого. Это демонстрирует следующий пример:
Интерфейс Map предоставляет три способа для доступа к данным: используя Set из ключей (метод keySet), коллекцию из значений (метод values) и Set из пары ключ-значение (метод entrySet). Порядок элементов в Map зависит от реализации интерфейса. Интерфейс Map.Entry, объект которого возвращает метод entrySet(), выглядит следующим образом:
С помощью метода setValue() интерфейса Entry предоставляется возможность изменять значения во время перебора элементов карты. Например, следующим образом:
Некоторые карты имеют ограничения на элементы и значения, которые они могут содержать. Например, некоторые реализации запрещают использовать null в качестве ключа или значения. Например, при попытке добавить null-элемент в TreeMap происходит исключение NullPointerException. HashMap и LinkedHashMap позволяют добавлять null-элементы. При попытке добавления null-значений в Map, который это не поддерживает, необходимо генерировать NullPointerException или ClassCastException. Второй возможный вариант обработки запрещенных значений - возвращение методом false без генерирования исключения.
Платформа Java версии 1.5 предоставляет три класса общего использования, реализующих интерфейс Map: HashMap, TreeMap и LinkedHashMap. На Рис.1 приведена иерархия этих классов.
Поведение и быстродействие HashMap, TreeMap и LinkedHashMap являются аналогами HashSet, TreeSet и LinkedHashSet соответственно:
HashMap хранит ключи в хеш-таблице, из-за чего имеет наиболее высокую производительность, но не гарантирует порядок элементов. Может содержать как null-ключи, так и null-значения;
TreeMap хранит ключи в отсортированном порядке, из-за чего работает существенно медленнее, чем HashMap. Не может содержать null-ключи, но может содержать null-значения. Сортироваться элементы будут либо в зависимости от реализации интерфейса Comparable, либо используя объект Comparator, который необходимо передать в конструктор TreeMap;
LinkedHashMap отличается от HashMap тем, что хранит ключи в порядке их вставки в Map. Эта реализаци Map лишь немного медленнее HashMap. Может содержать как null-ключи, так и null-значения.
Интерфейс Map содержит устаревшую реализацию Hashtable, которую не рекомендуется использовать. Некоторые существенные различия Map и Hashtable приведены ниже:
Карта обеспечивает перебор элементов с использованием интерфейса Collection вместо прямой поддержки итераций через объект Enumeration. Коллекция помогает значительно повысить выразительность интерфейса.
Интерфейс Map позволяет производить итерации по ключам, значениям и связке ключ-значение. Hashtable не позволяет производить итерации по связке ключ-значение.
Map предоставляет безопасный путь удаления элементов в средине итерации, Hashtable - не предоставляет. Например:
Ниже приведено несколько положений о Map, о которых необходимо помнить:
Два экземпляра Map равны, если они представляют один и тот же набор пар ключ-значение.
Особое внимание необходимо уделить ключам, которые могут изменяться. В поведении Map не указано, что делать если значение ключа изменилось таким образом, что ключ стал равен другому ключу в Map.
Все реализации Map общего назначения должны предоставлять два стандартных конструктора: конструктор по умолчанию, который создает пустую карту и конструктор, который принимает в качестве аргумента Map для создания новой карты с такими же набором ключ-значение. За этим должен следить программист, так как интерфейсы не могут содержать конструкторов.
Всегда переопределяйте методы equals() и hashCode() так как они могут использоваться в методе contains(), а также для более эффективного расположения элементов в карте, в результате чего поиск происходит быстрее.
"Деструктивные" методы (то есть, методы, которые могут разрушить целостность карты) должны генерировать исключение UnsupportedOperationException если коллекция не поддерживает операцию. Это рекомендуемое, но не обязательное правило
Типы join'ов в sql
Основное различие в том, как соединяются таблицы, если нет общих записей. Простой JOIN - тоже самое что INNER JOIN и означает показывать только общие записи обоих таблиц. Каким образом записи считаются общими определяется полями в join-выражении. Например следующая запись
FROM t1 JOIN t2 on t1.id = t2.id
означает что будут показаны записи с одинаковыми id, существующие в обоих таблицах. LEFT JOIN (или LEFT OUTER JOIN) означает показывать все записи из левой таблицы (той, которая идет первой в join-выражении) независимо от наличия соответствующих записей в правой таблице. RIGHT JOIN (или RIGHT OUTER JOIN) действует в противоположность LEFT JOIN - показывает все записи из правой (второй) таблицы и только совпавшие из левой (первой) таблицы.
JAVA собеседование (вопрос-ответ)
1.Что такое класс Object? Какие в нем есть методы?
Object это базовый класс для всех остальных объектов в Java. Каждый класс наследуется от Object. Соответственно все классы наследуют методы класса Object. Методы класса Object:
public final native Class getClass() -Этот метод возвращает объект класса Class, который описывает класс(имяб методы, поля), от которого был порожден этот объект.
public native int hashCode()-данный метод возвращает значение int. Цель hashCode()– представить любой объект целым числом.Конечно, нельзя потребовать, чтобы различные объекты возвращали различные хэш-коды, но, по крайней мере, необходимо, чтобы объекты, равные по значению (метод equals()возвращает true ), возвращали одинаковые хэш-коды.
public boolean equals(Object obj)- equals()служит для сравнения объектов по значению, а не по ссылке. Сравнивается состояние объекта, у которого вызывается этот метод, с передаваемым аргументом.
Point p1=new Point(2,3);
Point p2=new Point(2,3);
print(p1.equals(p2));
Результатом будет false.
protected native Object clone() throws CloneNotSupportedException
При выполнении метода clone()сначала проверяется, можно ли клонировать исходный объект. Если разработчик хочет сделать объекты своего класса доступными для клонирования через Object.clone(), то он должен реализовать в своем классе интерфейс Cloneable. В этом интерфейсе нет ни одного элемента, он служит лишь признаком для виртуальной машины, что объекты могут быть клонированы. Если проверка не выполняется успешно, метод порождает ошибку CloneNotSupportedException.
Если интерфейс Cloneable реализован, то порождается новый объект от того же класса, от которого был создан исходный объект. При этом копирование выполняется на уровне виртуальной машины, никакие конструкторы не вызываются. Затем значения всех полей, объявленных, унаследованных либо объявленных в родительских классах, копируются. Полученный объект возвращается в качестве клона.
Обратите внимание, что сам класс Objectне реализует интерфейс Cloneable, а потому попытка вызова new Object().clone()будет приводить к ошибке. Метод clone()предназначен скорее для использования в наследниках, которые могут обращаться к нему с помощью выражения super.clone().Примитивные поля копируються и далее существуют независимо в исходном и клонированном объектах. Изменение одного не сказывается на другом.
А вот ссылочные поля копируются по ссылке, оба объекта ссылаются на одну и ту же область памяти(исходный объект) . Поэтому изменения, происходящие с исходным объектом, сказываются на клонированном.
public String toString()-Этот метод позволяет получить текстовое описание любого объекта. Создавая новый класс, данный метод можно переопределить и возвращать более подробное описание. Для класса Object и его наследников, не переопределивших toString(), метод возвращает следующее выражение:
getClass().getName()+"@"+hashCode()
Метод getName()класса Class уже приводился в пример, а хэш-код еще дополнительно обрабатывается специальной функцией для представления в шестнадцатеричном формате.
Например:
print(new Object());
Результатом будет:
java.lang.Object@92d342
В результате этот метод позволяет по текстовому описанию понять, от какого класса был порожден объект и, благодаря хеш-коду, различать разные объекты, созданные от одного класса.
Именно этот метод вызывается при конвертации объекта в текст, когда он передается в качестве аргумента оператору конкатенации строк.
Методы wait(), notify(), notifyAll()используются для поддержки многопоточности
· public final native void notify()
· public final native void notifyAll()
· public final native void wait(long timeout) throws InterruptedException
· public final void wait(long timeout, int nanos) throws InterruptedException
public final void wait() throws InterruptedException
protected void finalize() throws Throwable-данный метод вызывается при уничтожении объекта автоматическим сборщиком мусора (garbage collector). В классе Object он ничего не делает, однако в классе-наследнике позволяет описать все действия, необходимые для корректного удаления объекта, такие как закрытие соединений с БД, сетевых соединений, снятие блокировок на файлы и т.д. В обычном режиме напрямую этот метод вызывать не нужно, он отработает автоматически. Если необходимо, можно обратиться к нему явным образом.
В методе finalize() нужно описывать только дополнительные действия, связанные с логикой работы программы. Все необходимое для удаления объекта JVM сделает сама.
2. Что такое метод equals(). Чем он отличается от операции ==.
Метод equals() обозначает отношение эквивалентности объектов. Эквивалентным называется отношение, которое является симметричным, транзитивным и рефлексивным.
· Рефлексивность: для любого ненулевого x, x.equals(x) вернет true;
· Транзитивность: для любого ненулевого x, y и z, если x.equals(y) и y.equals(z) вернет true, тогда и x.equals(z) вернет true;
· Симметричность: для любого ненулевого x и y, x.equals(y) должно вернуть true, тогда и только тогда, когда y.equals(x) вернетtrue.
Также для любого ненулевого x, x.equals(null) должно вернуть false. Отличия equals() от операции == в классе Object нет. Это видно, если взглянуть исходный код метода equals класса Object:
public boolean equals(Object obj) { return (this == obj); }
Однако, нужно не забывать, что, если объект ни на что не ссылается(null), то вызов метода equals этого объекта приведет кNullPointerException. Также нужно помнить, что при сравнении объектов оба они могут быть null и операция obj1 == obj2 в данном случае будет true, а вызов equals приведет к исключению NullPointerException. Как мы видим, при помощи операции == сравниваются ссылки на объекты. Но мы можем переопределять метод equals, тем самым задавая логику сравнения двух объектов. Например, рассмотрим сравнение двух одинаковых чисел, созданных при помощи классаInteger:
Integer a = new Integer(6); Integer b = new Integer(6); System.out.println(a == b); // false т.к. это разные объекты с разными ссылками System.out.println(a.equals(b)); // true, здесь уже задействована логика сравнения
Если взглянуть внутрь метода equals класса Integer, то мы увидим:
public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; }
Понятно, что тут уже нет сравнения ссылок, а сравниваются int значения.
Итого: применяйте “==”для примитивов, equals- для объектов
Изначально смысл этих методов сравнения одинаков(сравнение по значению, в случае объектов сравниваются ссылки на объекты)Ноequals всегда можно переопределить согласно логике.
3. Если вы хотите переопределить equals(), какие условия должны удовлетворяться для переопределенного метода?
Метод equals() обозначает отношение эквивалентности объектов. Эквивалентным называется отношение, которое является симметричным, транзитивным и рефлексивным.
· Рефлексивность: для любого ненулевого x, x.equals(x) вернет true;
· Транзитивность: для любого ненулевого x, y и z, если x.equals(y) и y.eqals(z) вернет true, тогда и x.equals(z) вернет true;
· Симметричность: для любого ненулевого x и y, x.equals(y) должно вернуть true, тогда и только тогда, когда y.equals(x) вернетtrue.
Также для любого ненулевого x, x.equals(null) должно вернуть false.
4. Если equals() переопределен, есть ли какие-либо другие методы, которые следует переопределить?
Да, есть.Нужно переопределить метод hashCode(). Равные объекты должны возвращать одинаковые хэш коды. Например у класса Integer метод hashCode() переопределен следующим образом:
public int hashCode() { return value; }
value это private значение, которое хранит объект класса Integer. Собственно это и есть число.
5. Для чего нужен метод hashCode()?
Существуют коллекции(HashMap, HashSet), которые используют хэш код, как основу при работе с объектами. А если хэш для равных объектов будет разным, то в HashMap будут два равных значения, что является ошибкой. Поэтому необходимо соответствующим образом переопределить метод hashCode().
Х Хеширование— преобразование входного массива данных произвольной длины в выходную битовую строку фиксированной длины. Такие преобразования также называются хеш-функциями или функциями свёртки, а их результаты называют хешем или хеш-кодом.
Хе Хеш-таблице— это структура данных, реализующая интерфейс ассоциативного массива, а именно, она позволяет хранить пары (ключ, значение) и выполнять три операции: операцию добавления новой пары, операцию поиска и операцию удаления пары по ключу.
Выполнение операции в хеш-таблице начинается с вычисления хеш-функции от ключа. Получающееся хеш-значение i = hash(key)играет роль индекса в массиве H. Затем выполняемая операция (добавление, удаление или поиск) перенаправляется объекту, который хранится в соответствующей ячейке массива H[i].
Одним из методов построения хеш-функции есть метод деления с остатком (division method) состоит в том, что ключу k ставится в соответствие остаток от деления k на m, где m— число возможных хеш-значений:
Код:
h(k) = k mod m
6. Какая связь между hashCode и equals?
Объекты равны, когда a.equals(b)=true и a.hashCode==b.hashcode ->true Но необязательно, чтобы два различных объекта возвращали различные хэш коды(такая ситуация называется коллизией). 7. Каким образом реализованы методы hashCode и equals в классе Object?
Реализация метода equals в классе Object сводится к проверке на равенство двух ссылок:
public boolean equals(Object obj) { return (this == obj); } Реализация же метода hashCode класса Object сделана нативной, т.е. определенной не с помощью Java-кода: public native int hashCode(); Он обычно возвращает адрес объекта в памяти.
7.1 Какие есть оссобенности класса String? что делает метод intern()
1) Внутреннее состояние класса String нельзя изменить после его создания, т.е. этот класс неизменяемый (immutable) поэтому когда вы пишете String str = "One" + "Two"; создается три! объекта класса String. 2) От него нельзя унаследоваться, потому что класс String объявлен как final: public final class String 3) Метод hashCode класса String переписан и возвращает: s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] 4) У класса String есть метод public String intern(), который возвращает строку в каноническом ее представлении из внутреннего пула строк, поддерживаемого JVM.
он нужен чтобы вместо String.equals() использовать ==. Понятно, что оператор сравнения ссылок выполняется гораздо быстрее, чем посимвольное сравнение строк. Используют в основном, где приходится сравнивать много строк, например в каких нибудь XML парсерах. А вообще по увеличению производительности ещё вопрос. Ибо метод intern() тогда должен выполняться быстрее чем equals().
каждый раз когда вы вызываете метод intern() просматривается пул строк на наличие такой строки и если такая уже есть в пуле, то возвращается ссылка на нее.Сравниваются они через equal(). 8. Что будет, если переопределить equals не переопределяя hashCode? Какие могут возникнуть проблемы?
Они будут неправильно хранится в контейнерах, использующих хэш коды, таких как HashMap, HashSet.
Например HashSet хранит элементы в случайном (на первый взгляд) порядке. Дело в том, что для быстрого поиска HashSetрасчитывает для каждлого элемента hashCode и именно по этому ключу ищет и упорядочивает элементы внутри себя 9. Есть ли какие-либо рекомендации о том, какие поля следует использовать при подсчете hashCode?
Есть. Необходимо использовать уникальные, лучше примитивные поля, такие как id, uuid, например. Причем, если эти поля задействованы при вычислении hashCode, то нужно их задействовать при выполнении equals. Общий совет: выбирать поля, которые с большой долью вероятности будут различаться. 10. Как вы думаете, будут ли какие-то проблемы, если у объекта, который используется в качестве ключа в hashMap изменится поле, которое участвует в определении hashCode?
Будут. Опять же будут проблемы связанные с хэш коллекциями. А именно, не сможем выбрать элемент из хэш-коллекции, его как будто и не будет. 10.2 Какой результат выполнения данной программы ?
public class Test {
private void method1() {
MyClass obj = new MyClass();
obj.x = 1;
method2(obj);
System.out.println("obj.x="+obj.x);
}
private void method2(MyClass param) {
param.x = 2;
param = new MyClass();
param.x = 3;
}
class MyClass {
int x;
}
public static void main(String[] args) {
new Test().method1();
}
}
Напечатает "obj.x=2" без кавычек
Иными словами для каждого параметра метода создается своя локальная копия. Следовательно, в Java методах все аргументы передаются по значению. В случае, когда аргумент – примитивный тип, передача по значению означает то, что метод не может изменить оригинальное значение. Когда же аргумент – ссылка на объект, создается локальная копия ссылки, которая указывает на тот же самый объект, при изменении которой оригинальное состояние объекта остается неизменным. (прим. редактора: верно - ВСЕ ПАРАМЕТРЫ В JAVA ПЕРЕДАЮТСЯ ПО ЗНАЧЕНИЮ. Если параметр — ссылка на объект, то ЗНАЧЕНИЕМ является ЗНАЧЕНИЕ самой ссылки, а не значение разнообразных полей в объекте, коих может быть великое множество, как по количеству, так и по разнообразию типов). 11. Какие модификаторы доступа в Java вы знаете?
Private,protected,public, package-private.
При задании доступа к классу его нельзя объявить как private (клас может использовать только сам себя) или protected(исключение внутренние классы). Поэтому при задании доступа к классу можно использовать только public или package-private.
В каждом компилируемом модуле(*.java) может быть только 1 public класс (открытый интерфейс наружу) и произвольное число вспомогательных классов с доступом внутри пакета. 12. Какой из модификаторов более строгий: protected или package-private?
Для начала надо разобраться, что такое package-private модификатор. Он ограничивает видимость до пределов пэкэджа, в котором лежит класс. И только до него! То есть, если класс лежит в пэкэдже "ru.myprog", то из пэкэджа "ru.myprog.base" он виден не будет(тоже самое для методов). Protected модификатор, раскрывает область видимости только для классов-наследников и для классов определенных в том же пэкэдже. Здесь мы видим отличие от C++, в котором только наследники видят protected. Из всего этого следует, что package-private модификатор более строгий.