Клас Vector

призначений для роботи з масивом змінного розміру, що складається з елементів Object Нові елементи можуть додаватися в початок, середину або кінець

вектора, і до будь-якого елементу можна звернутися за допомогою індексу Масиви в мові Java мають фіксований розмір, так що обєкти Vector виявляються корисними в тих випадках, коли в момент створення масиву невідомо максимальну кількість зберігаються елементів або це кількість велика, а досягається воно рідко

Методи класу Vector діляться на три категорії:

Методи для модифікації вектора

Методи для отримання обєктів, що зберігаються у векторі

Методи, що керують процесом розширення вектора, коли його ємності виявляється недостатньо

Безаргументний конструктор створює обєкт Vector, розмір якого регулюється відповідно до прийнятих за замовчуванням правилами Інші конструктори розглядаються нижче, разом з методами управління розміром вектора

Багато методи класу змінюють вміст вектора Всі вони, крім setElements, при необхідності здійснюють динамічна зміна розміру вектора у відповідності зі своїми потребами

public final synchronized void setElementAt(Object obj, int index)

Присвоює obj елементу вектора з індексом index Старе значення цього елемента пропадає При завданні індексу, що перевищує поточний розмір вектора, збуджується виключення IndexOutOfBoundsException Щоб переконатися в коректності індексу перед його застосуванням, використовуйте метод setSize (див нижче)

public final synchronized void removeElementAt(Object obj, int index)

Видаляє елемент вектора з індексом index Елементи, що знаходяться після віддаленого,

зсуваються до початку, а розмір вектора зменшується на 1

public final synchronized void insertElementAt(Object obj, int index)

Вставляє елемент obj в позицію index Елементи, наступні після віддаленого,

зсуваються, щоб звільнити місце для вставки public final synchronized void addElement(Object obj) Додає елемент obj до кінця вектора

public final synchronized boolean removeElement(Object obj)

Еквівалентний методу indexOf (obj) і – у разі вдалого пошуку – викликом removeElementAt для знайденого індексу Якщо обєкт не є елементом вектора, removeElement повертає false (метод indexOf описується нижче)

public final synchronized void removeAllElements()

Видаляє всі елементи вектора Вектор стає порожнім

Клас Polygon призначений для зберігання списку обєктів Point, які представляють собою вершини багатокутника:

import javautilVector

public class Polygon {

private Vector vertices = new Vector()

public void add(Point p) {

verticesaddElements(p)

}

public void remove(Point p) {

vertices RemoveElement(p)

}

public int numVertices() {

return verticessize()

}

/ / .. Інші методи ..

}

Існує ряд методів, призначених для перегляду вмісту вектора При завданні неприпустимого індексу збуджується виключення Index OutOfBoundsException Всі методи, які шукають елемент у векторі, використовують метод Objectequals для порівняння шуканого обєкта з елементами Vector

public final synchronized Object elementAt(int index)

Повертає елемент з індексом index public final boolean contains(Object  obj)

Повертає true, якщо obj є елементом вектора public final synchronized int indexOf(Object  obj, int index)

Шукає перше входження заданого обєкта obj починаючи з позиції index, і повертає його

індекс або -1, якщо обєкт не знайдений public final int indexOf(Object  obj) Еквівалентний indexOf (obj, 0)

public final synchronized int lastIndexOf(Object obj, int index)

Здійснює пошук obj в зворотному напрямку від позиції index і повертає його індекс або -1, якщо обєкт не знайдений

public final int lastIndexOf(Object obj)

Еквівалентний lastIndexOf (obj, size () -1)

public final synchronized void copyInto(Object[] anArray)

Копіює елементи вектора в заданий масив Метод може застосовуватися для

“Фотографування вмісту вектора public final synchronized Enumeration elements()

Повертає Enumeration для поточного складу елементів Для послідовної вибірки елементів обєкта, що повертається застосовуються методи Enumeration Вихідний стан при цьому не фіксується, тому для отримання фотографії вмісту вектора користуйтеся методом copy Into

public final synchronized Object firstElement()

Повертає перший елемент вектора Якщо вектор порожній, збуджується виключення

NoSuchElementException

public final synchronized Object lastElement()

Повертає останній елемент вектора Якщо вектор порожній, збуджується виключення NoSuchElementException Пара методів firstElement / lastElement може використовуватися для перебору елементів вектора, але існує ризик зміни вектора під час

виконання циклу Для отримання фотографії вмісту вектора користуйтеся методом copyInto

Розмір вектора дорівнює кількості елементів, що містяться в ньому Щоб змінити розмір вектора, можна додавати або видаляти елементи або викликати метод setSize або trimSize:

public final int size()

Повертає кількість елементів, що містяться у векторі Зверніть увагу, що ця величина відрізняється від ємності вектора

public final boolean isEmpty()

Повертає true, якщо вектор не містить жодного елемента public final synchronized void trimToSize()

Скорочує ємність вектора до поточного розміру Цей метод використовується для

мінімізації обсягу памяті, коли вектор знаходиться в стійкому стані

Наступні додавання елементів до вектора приведуть до його збільшення public final synchronized void setSize(int newSize)

Встановлює розмір вектора рівним newSize Якщо при цьому вектор скорочується, то

елементи за його кінцем губляться якщо вектор збільшується, то нові елементи рівні

null

Правильне управління ємністю вектора істотно впливає на ефективність роботи з ним Якщо прирощення ємності виявляється невеликим, а кількість додаються елементів велике, то занадто багато часу буде витрачатися на те, щоб повторно створювати новий буфер збільшеного розміру і копіювати в нього вміст вектора Краще відразу створювати вектор, ємність якого дорівнює максимальному можливому розміром або близька до нього Якщо ви знаєте, скільки елементів буде додано в вектор, використовуйте метод ensureCapacity для одноразового збільшення ємності вектора Параметри управління ємністю задаються при конструюванні вектора Для створення обєктів Vector застосовуються такі конструктори:

public Vector(int initialCapacity, int capacityIncrement)

Створює порожній вектор із заданою вихідною ємністю і запамятовує її прирощення Приріст, рівний 0, означає подвоєння ємності буфера при кожному його збільшенні в іншому випадку буфер збільшується на capacityIncrement елементів

public Vector(int initialCapacity) Еквівалентний Vector (initialCapacity, 0) public Vector()

Конструює порожній вектор зі значеннями вихідної ємності та прирощення, заданими за замовчуванням

public final int capacity()

Повертає поточну ємність вектора – кількість елементів, які можуть зберігатися у векторі без збільшення його розміру

public final synchronized void ensureCapacity   (int      minCapacity)

Метод гарантує, що ємність вектора буде не нижче заданої, і при необхідності збільшує поточну ємність

Наведемо метод класу Polygon, який приєднує до обєкта вершини іншого багатокутника:

public void merge(Polygon other) {

int otherSize = otherverticessize()

verticesenusreCapacity(verticessize()  + otherSize)

for (int i = 0 i &lt&lt otherSize i++)

verticesaddElement(otherverticeselementAt(i))

}

У цьому прикладі метод ensureCapacity використовується для того, щоб з додаванням нових вершин ємність вектора збільшувалася не більше одного разу

Реалізація vectortoString видає рядок з повним описом вектора, що включає результат виклику toString для кожного з містяться в ньому елементів

Крім цих відкритих методів, підкласи Vector можуть використовувати захищені поля класу Дотримуйтеся обережності в роботі з ними – наприклад, методи Vector припускають, що розмір буфера перевищує кількість елементів вектора

public Object elementData[]

Буфер, в якому зберігаються елементи вектора public int elementCount

Поточне кількість елементів у буфері

public int capacityIncrement

Кількість елементів, яке додається до ємності вектора при заповненні буфера elementData Якщо значення цього поля дорівнює 0, то розмір буфера подвоюється при кожній необхідності його збільшення

Вправа 121

Напишіть програму, яка відкриває файл і читає з нього рядки (по одній), зберігаючи кожен рядок в обєкті Vector, сортованому методом StringcompareTo У цьому вам може стати в нагоді клас для читання рядків з файлу, створений у вправі 112

125 Клас Stack

Клас Stack розширює Vector, додаючи методи для реалізації найпростішого стека обєктів Object, побудованого за принципом LIFO (останнім прийшов, першим вийшов) Метод push заносить обєкт в стек, а pop виштовхує верхній елемент стека Метод peek повертає значення верхнього елементу стека, при цьому сам елемент залишається в стеку Метод empty повертає true, якщо стек порожній Спроба виклику pop або peek для порожнього обєкта-стека призводить до порушення винятку EmptyStackException

Щоб зясувати, наскільки далеко розташований той чи інший елемент від вершини стека, застосовується метод search 1 відповідає вершині стека Якщо обєкт не знайдений, повертається -1 Для перевірки збігу шуканого обєкта з обєктами в стеку застосовується метод Objectequals

У наведеному нижче прикладі клас Stack використовується для стеження за тим, у кого в даний момент знаходиться деякий предмет – скажімо, іграшка Імя вихідного власника потрапляє в стек першим Коли хто-небудь позичає в нього іграшку, імя боржника також заноситься в стек При поверненні іграшки імя боржника виштовхується з стека Останнє імя повинно завжди залишатися в стеку, тому що в противному випадку буде втрачена інформація про власника

import javautilStack

public class Borrow {

private String itemName

private Stack hasIt = new Stack()

public Borrow(String name, String owner) {

itemName = name

hasItpush (owner) / / Перший слід імя власника

}

public void borrow(String borrower) {

hasItpush(borrower)

}

public String currentHolder() {

return (String)hasItpeek()

}

public String returnIt() {

String ret = (String)hasItpop()

if (hasItempty ()) / / випадково виштовхнути власник

hasItpush (ret) / / Повернути його назад

return ret

}

}

Вправа 122

Додайте метод, який використовує метод search, щоб визначити кількість боржників

126 Клас Dictionary

Абстрактний клас Dictionary фактично являє собою інтерфейс У ньому визначено ряд абстрактних методів, призначених для зберігання елемента з деяким ключем і подальшої вибірки елемента по ключу Цей інтерфейс є базовим для класу Hashtable, однак клас Dictionary визначено окремо, щоб інші реалізації могли використовувати різні алгоритми для зіставлення ключа з елементом Клас Dictionary повертає null, сигналізуючи про такі події, як відсутність елемента із заданим ключем отже, ні ключ, ні елемент не можуть бути рівні null Якщо задати значення null для аргументу-ключа або елемента, збуджується виключення NullPointerException У разі, якщо вам знадобиться ввести спеціальний елемент-

маркер, слід використовувати для нього значення, відмінне від null

Клас Dictionary містить наступні методи:

public abstract Object put(Object key, Object element)

Заносить element в словник з ключем key Повертає старий елемент, що зберігався з ключем key, або null, якщо такого елемента немає

public abstract Object get(Object key)

Повертає обєкт, занесений в словник з ключем key, або null, якщо ключ не визначений

public abstract Object remove(Object key)

Видаляє зі словника елемент з ключем key і повертає значення віддаленого елемента або null, якщо ключ не визначений

public abstract int size()

Повертає кількість елементів у словнику public abstract boolean isEmpty()

Повертає true, якщо словник не містить жодного елемента public abstract Enumeration keys()

Повертає обєкт-перерахування для всіх ключів, що входять в словник public abstract Enumeration elements()

Повертає обєкт-перерахування для всіх елементів, що входять в словник

Обєкти-перерахування, що повертаються методами keys і elements, не гарантують фіксації вихідного стану, однак при створенні класу, в якому використовується Dictionary, можна здійснити таку гарантію у вашій власній реалізації цих методів

Джерело: Арнольд К, Гослінг Д – Мова програмування Java (1997)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*