Класс LinkedHashMap<K, V>
- Параметры типа:
K- тип ключей, хранящихся в этой картеV- тип сопоставленных значений
- Все реализуемые интерфейсы:
Serializable, Cloneable, Map<K,V>, SequencedMap<K, V>
public class LinkedHashMap<K,V> extends HashMap<K,V> implements SequencedMap<K,V>
Реализация интерфейса Map на основе хеш-таблицы и связного списка с четко определенным порядком обхода. Эта реализация отличается от HashMap тем, что поддерживает двусвязный список, проходящий через все записи. Этот связный список задает порядок обхода (порядок итерации), который обычно соответствует порядку вставки ключей в карту (порядок вставки). Первая запись — вставленная раньше всех (самая старая), последняя — вставленная позже всех (самая новая). Обратите внимание, что порядок обхода не меняется, если ключ повторно вставляется в карту с помощью метода put. (Ключ k вставляется повторно в карту m, если m.put(k, v) вызывается, когда m.containsKey(k) непосредственно перед вызовом возвращает true.) Представление этой карты в обратном порядке имеет противоположный порядок: сначала идет самая новая запись, а последней — самая старая. Порядок обхода уже находящихся в карте записей можно изменить с помощью методов putFirst и putLast.
Эта реализация избавляет клиентов от неопределенного, обычно хаотичного порядка, предоставляемого HashMap (и Hashtable), не неся повышенных затрат, связанных с TreeMap. Ее можно использовать для создания копии карты с тем же порядком, что и у исходной, независимо от реализации исходной карты:
void foo(Map<String, Integer> m) {
Map<String, Integer> copy = new LinkedHashMap<>(m);
...
}
Этот прием особенно полезен, если модуль получает карту на вход, копирует ее, а затем возвращает результаты, порядок которых определяется порядком копии. (Клиентам обычно нравится, когда результаты возвращаются в том же порядке, в котором они были переданы.) Предусмотрен специальный constructor для создания связной хеш-карты, порядок обхода которой соответствует порядку последнего доступа к ее записям — от давно использованных к недавно использованным (порядок доступа). Такой тип карты хорошо подходит для создания кэшей LRU. Вызов методов put, putIfAbsent, get, getOrDefault, compute, computeIfAbsent, computeIfPresent или merge означает обращение к соответствующей записи (при условии, что она существует после завершения вызова). Методы replace приводят к обращению к записи только в том случае, если значение заменяется. Метод putAll обращается к каждой записи для каждого сопоставления в указанной карте в порядке, в котором сопоставления ключей и значений предоставляются итератором набора записей этой карты. Никакие другие методы не приводят к обращению к записям. Вызов этих методов для обратного представления приводит к обращению к записям базовой карты. Обратите внимание, что в обратном представлении обращение к записи перемещает ее на первое место в порядке обхода. Методы явного позиционирования, такие как putFirst или lastEntry, как для карты, так и для ее представления в обратном порядке, выполняют операцию позиционирования и не приводят к обращению к записям. Операции над представлениями keySet, values и entrySet или над их упорядоченными аналогами не влияют на порядок обхода базовой карты.
Метод removeEldestEntry(Map.Entry) можно переопределить, чтобы задать политику автоматического удаления устаревших сопоставлений при добавлении новых сопоставлений в карту. Кроме того, поскольку «самая старая» запись находится первой в порядке обхода, программы могут проверять и удалять устаревшие сопоставления с помощью методов firstEntry и pollFirstEntry.
Этот класс предоставляет все необязательные операции Map и SequencedMap и допускает нулевые элементы. Как и HashMap, он обеспечивает постоянное время выполнения основных операций (add, contains и remove) при условии, что хеш-функция равномерно распределяет элементы по корзинам. Производительность, вероятно, будет лишь немного ниже, чем у HashMap, из-за дополнительных затрат на поддержку связного списка. Исключение составляет итерация по представлениям-коллекциям LinkedHashMap: она занимает время, пропорциональное размеру карты, независимо от ее емкости. Итерация по HashMap, вероятно, будет дороже и займет время, пропорциональное ее емкости.
На производительность связной хеш-карты влияют два параметра: начальная емкость и коэффициент загрузки. Они определены так же, как и для HashMap. Однако обратите внимание, что для этого класса штраф за чрезмерно высокое значение начальной емкости менее значителен, чем для HashMap, поскольку емкость не влияет на время итерации для этого класса.
Обратите внимание, что эта реализация не является синхронизированной. Если несколько потоков одновременно обращаются к связной хеш-карте и хотя бы один из них структурно изменяет карту, доступ должен быть синхронизирован извне. Обычно для этого синхронизируют доступ к некоторому объекту, который естественным образом инкапсулирует карту. Если такого объекта нет, карту следует «обернуть» с помощью метода Collections.synchronizedMap. Лучше всего сделать это во время создания карты, чтобы предотвратить случайный несинхронизированный доступ к ней:
Map m = Collections.synchronizedMap(new LinkedHashMap(...));Структурным изменением считается любая операция, добавляющая или удаляющая одно или несколько сопоставлений, а также, в случае связных хеш-карт с порядком доступа, изменяющая порядок итерации. В связных хеш-картах с порядком вставки простое изменение значения, связанного с уже находящимся в карте ключом, не является структурным изменением. В связных хеш-картах с порядком доступа простой запрос к карте с помощью
get является структурным изменением. ) Итераторы, возвращаемые методом iterator коллекций, возвращенных всеми методами представлений-коллекций этого класса, являются быстроотказывающими: если после создания итератора карта каким-либо образом структурно изменяется, кроме как с помощью собственного метода remove итератора, итератор выбрасывает исключение ConcurrentModificationException. Таким образом, при параллельном изменении итератор быстро и корректно завершается с ошибкой, а не рискует в неопределенный момент в будущем вести себя произвольным и непредсказуемым образом.
Обратите внимание, что гарантировать быстроотказывающее поведение итератора невозможно, поскольку, вообще говоря, при несинхронизированном параллельном изменении нельзя дать никаких строгих гарантий. Быстроотказывающие итераторы выбрасывают ConcurrentModificationException лишь при первой возможности. Поэтому было бы неправильно писать программу, корректность которой зависит от этого исключения: быстроотказывающее поведение итераторов следует использовать только для обнаружения ошибок.
Сплитераторы, возвращаемые методом spliterator коллекций, возвращенных всеми методами представлений-коллекций этого класса, являются привязываемыми с задержкой, быстроотказывающими и дополнительно сообщают о свойстве Spliterator.ORDERED.
Этот класс входит в состав Java Collections Framework.
- Примечание по реализации:
- Сплитераторы, возвращаемые методом spliterator коллекций, возвращенных всеми методами представлений-коллекций этого класса, создаются на основе итераторов соответствующих коллекций.
- Начиная с:
- 1.4
- См. также:
Краткое описание вложенных классов
Вложенные классы и интерфейсы, объявленные в классе AbstractMap
AbstractMap.SimpleEntry<K, V>, AbstractMap.SimpleImmutableEntry<K, V> | Модификатор и тип | Класс | Описание |
|---|---|---|
static class |
AbstractMap.SimpleEntry<K, |
Запись, содержащая ключ и значение. |
static class |
AbstractMap.SimpleImmutableEntry<K, |
Неизменяемая запись, содержащая ключ и значение. |
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
LinkedHashMap() |
Создает пустой экземпляр LinkedHashMap с порядком вставки, начальной емкостью по умолчанию (16) и коэффициентом загрузки по умолчанию (0.75). |
LinkedHashMap |
Создает пустой экземпляр LinkedHashMap с порядком вставки, указанной начальной емкостью и коэффициентом загрузки по умолчанию (0.75). |
LinkedHashMap |
Создает пустой экземпляр LinkedHashMap с порядком вставки, указанными начальной емкостью и коэффициентом загрузки. |
LinkedHashMap |
Создает пустой экземпляр LinkedHashMap с указанными начальной емкостью, коэффициентом загрузки и режимом упорядочения. |
LinkedHashMap |
Создает экземпляр LinkedHashMap с порядком вставки и теми же сопоставлениями, что и в указанной карте. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
boolean |
containsValue |
Возвращает true, если эта карта сопоставляет один или несколько ключей с указанным значением. |
Set |
entrySet() |
Возвращает представление Set сопоставлений, содержащихся в этой карте. |
V |
get |
Возвращает значение, сопоставленное с указанным ключом, или null, если в этой карте нет сопоставления для ключа. |
Set |
keySet() |
Возвращает представление Set ключей, содержащихся в этой карте. |
static <K, |
newLinkedHashMap |
Создает новую пустую LinkedHashMap с порядком вставки, подходящую для ожидаемого количества сопоставлений. |
V |
putFirst |
Вставляет указанное сопоставление в карту, если его там еще нет, или заменяет значение сопоставления, если оно уже есть (необязательная операция). |
V |
putLast |
Вставляет указанное сопоставление в карту, если его там еще нет, или заменяет значение сопоставления, если оно уже есть (необязательная операция). |
protected boolean |
removeEldestEntry |
Возвращает true, если эта карта должна удалить самую старую запись. |
SequencedMap |
reversed() |
Возвращает представление этой карты в обратном порядке. |
SequencedSet |
sequencedEntrySet() |
Возвращает представление SequencedSet набора entrySet этой карты. |
SequencedSet |
sequencedKeySet() |
Возвращает представление SequencedSet набора keySet этой карты. |
SequencedCollection |
sequencedValues() |
Возвращает представление SequencedCollection коллекции values этой карты. |
Collection |
values() |
Возвращает представление Collection значений, содержащихся в этой карте. |
Методы, объявленные в классе HashMap
clear, clone, compute, computeIfAbsent, computeIfPresent, containsKey, isEmpty, merge, newHashMap, put, putAll, remove, size | Модификатор и тип | Метод | Описание |
|---|---|---|
void |
clear() |
Удаляет все сопоставления из этой карты. |
Object |
clone() |
Возвращает поверхностную копию этого экземпляра HashMap: сами ключи и значения не клонируются. |
V |
compute |
Пытается вычислить сопоставление для указанного ключа и текущего сопоставленного с ним значения или null, если текущего сопоставления нет (необязательная операция). |
V |
computeIfAbsent |
Если указанному ключу еще не сопоставлено значение (или ему сопоставлено null), пытается вычислить его значение с помощью заданной функции сопоставления и добавляет его в эту карту, если результат не равен null (необязательная операция). |
V |
computeIfPresent |
Если для указанного ключа имеется ненулевое значение, пытается вычислить новое сопоставление, используя ключ и текущее сопоставленное с ним значение (необязательная операция). |
boolean |
containsKey |
Возвращает true, если эта карта содержит сопоставление для указанного ключа. |
boolean |
isEmpty() |
Возвращает true, если эта карта не содержит сопоставлений ключей и значений. |
V |
merge |
Если указанному ключу еще не сопоставлено значение или ему сопоставлено null, сопоставляет ему заданное ненулевое значение (необязательная операция). |
static <K, |
newHashMap |
Создает новую пустую HashMap, подходящую для ожидаемого количества сопоставлений. |
V |
put |
Сопоставляет указанное значение с указанным ключом в этой карте. |
void |
putAll |
Копирует в эту карту все сопоставления из указанной карты. |
V |
remove |
Удаляет сопоставление для указанного ключа из этой карты, если оно есть. |
int |
size() |
Возвращает количество сопоставлений ключей и значений в этой карте. |
Методы, объявленные в классе AbstractMap
equals, hashCode, toString | Модификатор и тип | Метод | Описание |
|---|---|---|
boolean |
equals |
Сравнивает указанный объект с этой картой на предмет равенства. |
int |
hashCode() |
Возвращает значение хеш-кода этой карты. |
String |
toString() |
Возвращает строковое представление этой карты. |
Методы, объявленные в классе Object
finalize, getClass, notify, notifyAll, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected void |
finalize() |
Устарело, будет удалено: этот элемент API подлежит удалению в будущей версии. Финализация устарела и подлежит удалению в одном из будущих выпусков. |
final Class |
getClass() |
Возвращает класс времени выполнения этого Object. |
final void |
notify() |
Пробуждает один поток, ожидающий на мониторе этого объекта. |
final void |
notifyAll() |
Пробуждает все потоки, ожидающие на мониторе этого объекта. |
final void |
wait() |
Заставляет текущий поток ожидать пробуждения, обычно посредством уведомления или прерывания. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно посредством уведомления или прерывания, либо до истечения заданного интервала реального времени. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно посредством уведомления или прерывания, либо до истечения заданного интервала реального времени. |
Методы, объявленные в интерфейсе Map
forEach, getOrDefault, putIfAbsent, remove, replace, replace, replaceAll | Модификатор и тип | Метод | Описание |
|---|---|---|
default void |
forEach |
Выполняет заданное действие для каждой записи в этой карте, пока не будут обработаны все записи или действие не выбросит исключение. |
default V |
getOrDefault |
Возвращает значение, сопоставленное с указанным ключом, или defaultValue, если в этой карте нет сопоставления для ключа. |
default V |
putIfAbsent |
Если указанному ключу еще не сопоставлено значение (или ему сопоставлено null), сопоставляет ему заданное значение и возвращает null; в противном случае возвращает текущее значение (необязательная операция). |
default boolean |
remove |
Удаляет запись для указанного ключа, только если в данный момент ему сопоставлено указанное значение (необязательная операция). |
default V |
replace |
Заменяет запись для указанного ключа, только если в данный момент ему сопоставлено какое-либо значение (необязательная операция). |
default boolean |
replace |
Заменяет запись для указанного ключа, только если в данный момент ему сопоставлено указанное значение (необязательная операция). |
default void |
replaceAll |
Заменяет значение каждой записи результатом вызова заданной функции для этой записи, пока не будут обработаны все записи или функция не выбросит исключение (необязательная операция). |
Методы, объявленные в интерфейсе SequencedMap
firstEntry, lastEntry, pollFirstEntry, pollLastEntry | Модификатор и тип | Метод | Описание |
|---|---|---|
default Map.Entry |
firstEntry() |
Возвращает первое сопоставление ключа и значения в этой карте или null, если карта пуста. |
default Map.Entry |
lastEntry() |
Возвращает последнее сопоставление ключа и значения в этой карте или null, если карта пуста. |
default Map.Entry |
pollFirstEntry() |
Удаляет и возвращает первое сопоставление ключа и значения в этой карте или null, если карта пуста (необязательная операция). |
default Map.Entry |
pollLastEntry() |
Удаляет и возвращает последнее сопоставление ключа и значения в этой карте или null, если карта пуста (необязательная операция). |
Подробное описание конструкторов
LinkedHashMap
public LinkedHashMap(int initialCapacity, float loadFactor)
LinkedHashMap с упорядочением по вставке и указанными начальной емкостью и коэффициентом загрузки.- Примечание API:
- Чтобы создать
LinkedHashMapс начальной емкостью, достаточной для ожидаемого количества отображений, используйтеnewLinkedHashMap. - Параметры:
-
initialCapacity— начальная емкость -
loadFactor— коэффициент загрузки - Исключения:
-
IllegalArgumentException— если начальная емкость отрицательна или коэффициент загрузки неположителен
LinkedHashMap
public LinkedHashMap(int initialCapacity)
LinkedHashMap с упорядочением по вставке, указанной начальной емкостью и коэффициентом загрузки по умолчанию (0.75).- Примечание API:
- Чтобы создать
LinkedHashMapс начальной емкостью, достаточной для ожидаемого количества отображений, используйтеnewLinkedHashMap. - Параметры:
-
initialCapacity— начальная емкость - Исключения:
-
IllegalArgumentException— если начальная емкость отрицательна
LinkedHashMap
public LinkedHashMap()
LinkedHashMap с упорядочением по вставке, начальной емкостью по умолчанию (16) и коэффициентом загрузки по умолчанию (0.75).LinkedHashMap
public LinkedHashMap(Map<? extends K, ? extends V> m)
LinkedHashMap с упорядочением по вставке и теми же отображениями, что и в указанной карте. Экземпляр LinkedHashMap создается с коэффициентом загрузки по умолчанию (0.75) и начальной емкостью, достаточной для размещения отображений указанной карты.- Параметры:
-
m— карта, отображения которой следует поместить в эту карту - Исключения:
-
NullPointerException— если указанная карта равна null
LinkedHashMap
public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)
LinkedHashMap с указанными начальной емкостью, коэффициентом загрузки и режимом упорядочения.- Параметры:
-
initialCapacity— начальная емкость -
loadFactor— коэффициент загрузки -
accessOrder— режим упорядочения:trueдля порядка доступа,falseдля порядка вставки - Исключения:
-
IllegalArgumentException— если начальная емкость отрицательна или коэффициент загрузки неположителен
Подробное описание методов
putFirst
public V putFirst(K k, V v)
Если эта карта уже содержит отображение для данного ключа, при необходимости оно перемещается так, чтобы стать первым в порядке обхода.
- Определено в:
-
putFirstв интерфейсеSequencedMap<K,V> - Параметры:
-
k— ключ -
v— значение - Возвращает:
- значение, ранее связанное с k, или null, если такого значения не было
- Начиная с версии:
- 21
putLast
public V putLast(K k, V v)
Если эта карта уже содержит отображение для данного ключа, при необходимости оно перемещается так, чтобы стать последним в порядке обхода.
- Определено в:
-
putLastв интерфейсеSequencedMap<K,V> - Параметры:
-
k— ключ -
v— значение - Возвращает:
- значение, ранее связанное с k, или null, если такого значения не было
- Начиная с версии:
- 21
containsValue
public boolean containsValue(Object value)
true, если эта карта связывает один или несколько ключей с указанным значением.- Определено в:
-
containsValueв интерфейсеMap<K,V> - Переопределяет:
-
containsValueв классеHashMap<K,V> - Параметры:
-
value— значение, наличие которого в этой карте требуется проверить - Возвращает:
-
true, если эта карта связывает один или несколько ключей с указанным значением
get
public V get(Object key)
null, если в этой карте нет отображения для ключа. Точнее, если эта карта содержит отображение от ключа k к значению v такое, что (key==null ? k==null :
key.equals(k)), то этот метод возвращает v; в противном случае он возвращает null. (Такое отображение может быть не более чем одно.)
Возвращаемое значение null не обязательно означает, что в карте нет отображения для ключа; также возможно, что карта явно связывает ключ со значением null. Операцию containsKey можно использовать, чтобы различить эти два случая.
removeEldestEntry
protected boolean removeEldestEntry(Map.Entry<K,V> eldest)
true, если эта карта должна удалить самую старую запись. Этот метод вызывается методами put и putAll после вставки новой записи в карту. Он предоставляет реализующему классу возможность удалять самую старую запись при каждом добавлении новой. Это полезно, если карта представляет собой кэш: таким образом карта может уменьшать расход памяти, удаляя устаревшие записи. Пример использования: это переопределение позволит карте увеличиться до 100 записей, а затем удалять самую старую запись при каждом добавлении новой, поддерживая постоянное количество записей — 100.
private static final int MAX_ENTRIES = 100;
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() > MAX_ENTRIES;
}
Обычно этот метод никак не изменяет карту, а позволяет карте изменяться в соответствии с возвращаемым значением. Допускается, чтобы этот метод напрямую изменял карту, но в таком случае он должен вернуть false (указывая, что карта не должна пытаться вносить дополнительные изменения). Результат возврата true после изменения карты внутри этого метода не определен.
Эта реализация просто возвращает false (поэтому эта карта ведет себя как обычная карта — самый старый элемент никогда не удаляется).
- Параметры:
-
eldest— запись, вставленная в карту раньше всех, или, если карта упорядочена по доступу, запись, к которой обращались дольше всего назад. Эта запись будет удалена, если данный метод вернетtrue. Если до вызоваputилиputAll, приведшего к вызову этого метода, карта была пуста, это будет только что вставленная запись; иными словами, если карта содержит одну запись, самая старая запись одновременно является и самой новой. - Возвращает:
-
true, если самую старую запись следует удалить из карты;false, если ее следует сохранить.
keySet
public Set<K> keySet()
Set. Порядок обхода ключей в представлении совпадает с порядком обхода отображений этой карты. Множество поддерживается картой, поэтому изменения карты отражаются в множестве, и наоборот. Если карта изменяется во время итерации по множеству (за исключением изменений, выполняемых собственной операцией remove итератора), результаты итерации не определены. Множество поддерживает удаление элементов, которое удаляет соответствующее отображение из карты, с помощью операций Iterator.remove, Set.remove, removeAll, retainAll и clear. Оно не поддерживает операции add или addAll. Его Spliterator, как правило, обеспечивает более высокую производительность при последовательной обработке, но значительно более низкую — при параллельной, чем HashMap.sequencedKeySet
public SequencedSet<K> sequencedKeySet()
SequencedSet для keySet этой карты. Возвращаемое представление обладает теми же характеристиками, которые указаны для представления, возвращаемого методом keySet.
- Определено в:
-
sequencedKeySetв интерфейсеSequencedMap<K,V> - Возвращает:
- представление
SequencedSetдляkeySetэтой карты - Начиная с версии:
- 21
values
public Collection<V> values()
Collection. Порядок обхода значений в представлении совпадает с порядком обхода записей этой карты. Коллекция поддерживается картой, поэтому изменения карты отражаются в коллекции, и наоборот. Если карта изменяется во время итерации по коллекции (за исключением изменений, выполняемых собственной операцией remove итератора), результаты итерации не определены. Коллекция поддерживает удаление элементов, которое удаляет соответствующее отображение из карты, с помощью операций Iterator.remove, Collection.remove, removeAll, retainAll и clear. Она не поддерживает операции add или addAll. Ее Spliterator, как правило, обеспечивает более высокую производительность при последовательной обработке, но значительно более низкую — при параллельной, чем HashMap.sequencedValues
public SequencedCollection<V> sequencedValues()
SequencedCollection для коллекции values этой карты. Возвращаемое представление обладает теми же характеристиками, которые указаны для представления, возвращаемого методом values.
- Определено в:
-
sequencedValuesв интерфейсеSequencedMap<K,V> - Возвращает:
- представление
SequencedCollectionдля коллекцииvaluesэтой карты - Начиная с версии:
- 21
entrySet
public Set<Map.Entry<K,V>> entrySet()
Set. Порядок обхода представления совпадает с порядком обхода записей этой карты. Множество поддерживается картой, поэтому изменения карты отражаются в множестве, и наоборот. Если карта изменяется во время итерации по множеству (за исключением изменений, выполняемых собственной операцией remove итератора или операцией setValue над записью карты, возвращенной итератором), результаты итерации не определены. Множество поддерживает удаление элементов, которое удаляет соответствующее отображение из карты, с помощью операций Iterator.remove, Set.remove, removeAll, retainAll и clear. Оно не поддерживает операции add или addAll. Его Spliterator, как правило, обеспечивает более высокую производительность при последовательной обработке, но значительно более низкую — при параллельной, чем HashMap.sequencedEntrySet
public SequencedSet<Map.Entry<K,V>> sequencedEntrySet()
SequencedSet для entrySet этой карты. Возвращаемое представление обладает теми же характеристиками, которые указаны для представления, возвращаемого методом entrySet.
- Определено в:
-
sequencedEntrySetв интерфейсеSequencedMap<K,V> - Возвращает:
- представление
SequencedSetдляentrySetэтой карты - Начиная с версии:
- 21
newLinkedHashMap
public static <K,V> LinkedHashMap<K,V> newLinkedHashMap(int numMappings)
- Параметры типа:
K— тип ключей, хранящихся в новой картеV— тип отображаемых значений- Параметры:
-
numMappings— ожидаемое количество отображений - Возвращает:
- созданную карту
- Исключения:
-
IllegalArgumentException— если numMappings отрицательно - Начиная с версии:
- 19
reversed
public SequencedMap<K,V> reversed()
Изменения представления с обратным порядком и его представлений карты разрешены и будут передаваться этой карте. Кроме того, изменения этой карты будут видны в представлении с обратным порядком и его представлениях карты.
- Определено в:
-
reversedв интерфейсеSequencedMap<K,V> - Возвращает:
- представление этой карты с обратным порядком
- Начиная с версии:
- 21
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.