Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shpory_java_2_semtcnh.doc
Скачиваний:
2
Добавлен:
22.09.2019
Размер:
425.98 Кб
Скачать

Коллекции

Коллекции в Java – это наборы произвольных объектов.

Основные преимущества коллекций:

  • имеют динамическую размерность (т.е. размерность не задается при объявлении и может меняться в ходе работы программы)

  • могут хранить объекты любых типов (все объекты, хранимые в коллекции приводятся к базовому типу Object)

  • существуют стандартные методы добавления и удаления элементов коллекции

  • элементы коллекции проиндексированы (аналогично массивам), переиндексация, при добавлении/удалении происходит автоматически.

Они работают с базовым классом Object. Мы можем добавлять в коллекцию любые объекты ЯВА. При извлечении из коллекции мы тоже получаем Object. Зачастую это приводит к необходимости преобразования полученного из коллекции объекта к нужному классу.

Коллекция это динамический массив.

В ЯВА коллекции разбиты на 3 большие категории: 1. List – список; 2. Set - множество 3. Map – отображение.

List – это список объектов. Объекты можно добавлять в список(add()), заменять в списке(set()), удалять(remove()), извлекать(get()). Сущ. возможность организации прохода по списку при помощи итератора.

Set – множество объектов. Те же возможности, что у List, но объект может входить в множество только один раз. Двойное добавление одного и того же объекта множества не изменит самого множества.

Map– отображение или ассоциативный массив. В Map добавляются не отдельные объекты, а пары объектов. Соответственно есть операции поиска значений по ключу. Добавление пары с уже существующим в Map ключом приводит к замене, а не к добавлению. Из отображения можно получать множество ключей и список значений.

Коллекции-списки(List) реализованы в 3-х вариантах: ArrayList, LinkedList и Vector.

ArrayList и Vector – это массивы с изменяющейся длиной.

Класс ArrayList

Это динамический массив объектов(ссылок). Расширяет класс AbstractList и реализует интерфейс List.

Конструкторы:

ArrayList(), ArrayList(Collect x), ArrayList(int y)

“+”:быстрый доступ по индексу и быстрая вставка и удаление краевых элементов

“-”: медленная вставка и удаление элементов

Основные методы ArrayList:

.add(int index, Object object) – вставляет object в позицию, указанную в index

.add(int index, Сollection c) – вставляет в вызывающий список все элементы коллекции с позиции

index

.add(Object object) – добавление объекта в коллекцию

.remove (Object object) – удалить объект из коллекции

.get(index) – получить объект из коллекции по индексу

.clear() – очистить коллекцию (удалить все элементы)

.size() – получить размер коллекции (количество элементов)

Пример

import java.util.*;

public class DemoList1{

public static void main(String [] args){

List c=new ArrayList();

int i=2, j=5;

c.add(new Iterator (i));

c.add(new Boolean(“True”));

c.add(“<String>”);

c.add(2,Integer.toString(j)+”X”);//добавить во вторую позициб 5Х

System.out.println(c);

if(c.contains(“5X”)) c.remove(c.indexOf(“5X”));

System.out.println(c);

}}

На консоль будет выведено:

[2, True,5X,<String>]

[2, True,<String>]

LinkedList

Реализует связанный список.

В отличие от массива, который хранит объекты в последовательных ячейках памяти, связанный список хранит объекты отдельно, но вместе со ссылками на следующее и предыдущее звенья последовательности.

В добавление ко всем методам реализованы следующие методы:

.addFirst(Object ob)-довить в начало

.addLast(Object ob)-|-|-|-|-| в конец

.getFirst()-получить первый эл

.getLast()-получить последний эл

.removeFirst()-удалить первый эл

.removeLast()-удалить последний Эл

Потоки и файловый ввод-вывод

Для описания работы по вводу/выводу данных используется специальное понятие поток данных (stream).

Потоком называется упорядоченная последовательность данных, которая имеет источник (входной поток) или приемник (выходной поток)

Поток - зто объект, который либо доставляет данные к месту назначения (файл, консоль и тп), либо принимает данные из некоторого источника (файл, клавиатура и тп).

Данные – символы, или примитивные данные или двоичные байты

Потоки делятся на входящие(Input) – читающие данные – System.in- тип InputStream

и выходящие(Output) – передающие (записывающие) данные – System.out – тип PrintStream

Введение концепции stream позволяет отделить основную логику программы, обменивающейся информацией с любыми устройствами одинаковым образом, от низкоуровневых операций с такими устройствами ввода/вывода

Базовые, наиболее универсальные, классы позволяют считывать и записывать информацию именно в виде набора байт

Библиотеки ввода/вывода(50 классов и 10 интерфейсов) часто используют абстракцию потока, который представляется любым источником данных или представляется как объект, способный производить или принимать некоторые порции данных.

Поток прячет детали того, что случается с данными внутри реального устройства ввода/вывода

Пакет java.io, кроме потоковых классов содержит также классы, преобразующие любые данные в набор байт.

Когда требуется сохранить объект 1. преобразование в набор байт

2. запись набора в файл.

При чтении данных проделываются обратные действия

1.считывается последовательность байт

2.преобразование последовательности в нужный формат.

В пакете java.io определяется несколько абстрактных классов и интерфейсов для базовых входных и выходных потоков.

Класс Input Stream

Работа InputStream состоит в представлении классов, которые производят ввод от различных источников. Источниками могут быть:

-Массив байт

-Объект String

-Клавиатура

-Файл

-"Труба", которая работает так же, как и физическая труба: помещаются данные в один конец, а они выходят из другого

-Последовательность других потоков, так что вы можете собрать их вместе в единый поток

-Другие источники, такие как Internet соединение

Методы класса InputStream

--public abstract int read() throws IOException Читает один байт из входного потока. Результат - int (4 байта). Прочитанный байт заносится в младший байт результата.

Метод read() – это абстрактный метод, он должен быть реализован в классах-наследниках

-- public int read(byte[] b) throws IOException Читает последовательность байт из потока в массив b. Длина последовательности равна длине массива, заданного в качестве параметра. Может прочесть меньше байт, если чтение достигло конца потока. Возвращает количество прочитанных байтов или -1.

--public int read(byte[] b, int off, int len) throws IOException То же, что и предыдущий метод, но заполняет массив с указанного байта и читает не больше, чем указано параметром len.

--public long skip(long n) throws IOException Пропускает n байт во входном потоке. Количество пропущенных байтов может меньше из-за достижения конца потока. Возвращает фактическое количество пропущенных байтов.

--public int available() throws IOException возвращает число – количество байт, на данный момент готовых к считыванию

--public void close() throws IOException Закрывает входной поток,будут освобождены все системные ресурсы, связанные с потоком (буферы ввода, файловые дескрипторы и т.д.).

OutputStream

Класс OutputStream – это базовый класс для потоков вывода

В классе OutputStream аналогичным образом определяются три метода --public abstract void write(int b) throws IOException

--public void write(byte[] b) throws IOException

--public void write(byte[] b, int off, int

len) throws IOException

--public void flush() throws IOException Выталкивает из буфера в поток все, что в нем накоплено.

--public void close() throws IOException Закрывает поток.

Пример1.Подсчитать общее количество символов и разделителей в файле.

import java.io.*;

class CountSpace {

public static void main (String[] args)

throws IOException {

InputStream in;

if (args.length ==0)

in = System.in;//станд.входной

//поток

else

in = new FileInputStream (args[0]);

//открыть файл для чтения

int ch, total;

int spaces = 0;

for (total=0;(ch = in.read()) !=

-1;total++ ) {

if (Character.isSpace((char) ch)

spaces ++;

} //end of for

System.out.println (total +”chars,” +

spaces + “spaces”);

} //end of main}

Программа либо берет имя файла из командной строки, либо читает данные из стандартного входного потока System.in.Если имя файла не задано, используется стандартный входной поток, если оно указано, то создается объект FileInputStream – расширение InputStream

Пример2Создать приложение, копирующее входной поток в выходной. Приложение получает 2 параметра:строки from и to.

Если во входном потоке встречается символ, входящий в строку from, он заменяется символом строки to, находящимся в той же позиции.

import java.io.*;

class Translate {

public static void main(String[] args) {

InputStream in = System.in;

OutputStream out = System.out;

if (args.length !=2)

error (‘’must provide 2 arguments’’);

String from = args[0], to = args[1];

int ch, i;

if (from.length() != to.length)

error(“from and to must be same

length”);

try {

while ((ch= in.read()) != -1) {

if (( i = from.indexOf(ch)) != -1)

out.write (to.charAt(i));

else out.write (ch);

} //end of while

}

catch (IOExeption e) {

System.out.print (“I/O Exception”

+e.getMessage());

}

} // main end

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]