Массивы и строки в java - alexey vladykin · Массивы и строки в java...

41
Массивы и строки в Java Алексей Владыкин 23 сентября 2013 Алексей Владыкин Массивы и строки в Java 23 сентября 2013 1 / 33

Upload: others

Post on 09-Jul-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Массивы и строки в Java

Алексей Владыкин

23 сентября 2013

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 1 / 33

Page 2: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

1 Ссылочные типы

2 Массивы

3 Строки

4 Кодировки строк

5 Регулярные выражения

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 2 / 33

Page 3: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Ссылочные типы

* ссылочный тип

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 3 / 33

Page 4: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Ссылочные типы

Ссылочные типы

Все остальные, кроме примитивныхПередаются по ссылкеЯвляются объектами (java.lang.Object)Имеют поля и методыequals / hashCode / toString

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 4 / 33

Page 5: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Массивы

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 5 / 33

Page 6: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Массивы

Объявление

Массив обозначается квадратными скобками

int[] numbers;String [] args;boolean bits [];char[] letters , digits;float rates[], maxRate;

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 6 / 33

Page 7: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Массивы

Создание

Массив создается оператором new

Все элементы массива инициализируются нулямиРазмер массива фиксируется в момент создания

int[] numbers = new int [100];String [] args = new String [1];boolean [] bits = new boolean [0];

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 7 / 33

Page 8: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Массивы

Инициализация

Можно перечислить значения всех элементовпри создании массива

int[] numbers = new int[] {1, 2, 3, 4, 5};boolean [] bits = new boolean [] {true , true , false};

// this works only in variable declarationchar[] digits = {

’0’, ’1’, ’2’, ’3’, ’4’,’5’, ’6’, ’7’, ’8’, ’9’};

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 8 / 33

Page 9: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Массивы

Индексация

Элементы индексируются с нуляДлина массива доступна как array.length

При выходе за границы массива бросается исключение

int[] numbers = {1, 2, 3, 4, 5};// numbers.length -> 5// numbers [0] -> 1// numbers [1] -> 2// numbers [4] -> 5// numbers [5] -> ArrayIndexOutOfBoundsException

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 9 / 33

Page 10: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Массивы

Многомерные массивы

Многомерный массив — это массив массивов

int [][] matrix0;int [][] matrix1 = new int [2][2];int [][] matrix2 = {{1, 2}, {3, 4}};int[] row = matrix2 [0]

// matrix2 [1][1] -> 4// row[0] -> 1

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 10 / 33

Page 11: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Массивы

Многомерные массивы

Разрешены ступенчатые массивы

int [][] triangle = {{1, 2, 3, 4, 5},{6, 7, 8, 9},{10, 11, 12},{13, 14},{15}};

// triangle.length -> 5// triangle [0]. length -> 5// triangle [4]. length -> 1

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 11 / 33

Page 12: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Массивы

Представление в памяти

Одномерный массив занимает непрерывный участок памятиДвумерный массив занимает n + 1 участок в памяти,где n — первая размерность

int [][] a = new int [10][1000];int [][] b = new int [1000][10];

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 12 / 33

Page 13: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Массивы

Varargs

Специальный синтаксис для массива аргументовПоддерживается с Java 5

int max(int[] numbers );// usage: max(new int[] {1, 2, 3, 4});

int max(int... numbers );// usage: max(1, 2, 3, 4);

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 13 / 33

Page 14: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Массивы

Как сравнить два массива

a == bсравнивает ссылки

a.equals(b)сравнивает ссылки

Arrays.equals(a, b)сравнивает содержимое

Arrays.deepEquals(a, b)сравнивает содержимое многомерных массивов

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 14 / 33

Page 15: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Массивы

Как сравнить два массива

a == bсравнивает ссылки

a.equals(b)сравнивает ссылки

Arrays.equals(a, b)сравнивает содержимое

Arrays.deepEquals(a, b)сравнивает содержимое многомерных массивов

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 14 / 33

Page 16: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Массивы

Как сравнить два массива

a == bсравнивает ссылки

a.equals(b)сравнивает ссылки

Arrays.equals(a, b)сравнивает содержимое

Arrays.deepEquals(a, b)сравнивает содержимое многомерных массивов

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 14 / 33

Page 17: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Массивы

Как сравнить два массива

a == bсравнивает ссылки

a.equals(b)сравнивает ссылки

Arrays.equals(a, b)сравнивает содержимое

Arrays.deepEquals(a, b)сравнивает содержимое многомерных массивов

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 14 / 33

Page 18: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Массивы

Как распечатать массив

System.out.println(a)выводит «абракадабру» [I@2ce83912

System.out.println(Arrays.toString(a))выводит содержимое

System.out.println(Arrays.deepToString(a))выводит содержимое многомерных массивов

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 15 / 33

Page 19: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Массивы

Как распечатать массив

System.out.println(a)выводит «абракадабру» [I@2ce83912

System.out.println(Arrays.toString(a))выводит содержимое

System.out.println(Arrays.deepToString(a))выводит содержимое многомерных массивов

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 15 / 33

Page 20: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Массивы

Как распечатать массив

System.out.println(a)выводит «абракадабру» [I@2ce83912

System.out.println(Arrays.toString(a))выводит содержимое

System.out.println(Arrays.deepToString(a))выводит содержимое многомерных массивов

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 15 / 33

Page 21: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Массивы

java.util.Arrays

copyOf, copyOfRangefill

sort

binarySearch

java.lang.System.arraycopy

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 16 / 33

Page 22: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Строки

http://xkcd.com/171/

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 17 / 33

Page 23: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Строки

Класс java.lang.String

Последовательность символов произвольной длины

Строка — это не char[], хотя есть способы конвертации

Никаких нулевых символов в конце, длина хранится отдельно

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 18 / 33

Page 24: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Строки

Создание строк

Строковые литералы

String zeros = "\u0000\u0000";String hello = "Hello";String specialChars = "\r\n\t\"\\";String unicodeEscapes = "\u0101\u2134\u03ff";

Создание из массива символов

char[] charArray = {’a’, ’b’, ’c’};String string = new String(charArray );

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 19 / 33

Page 25: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Строки

Создание строк

Строковые литералы

String zeros = "\u0000\u0000";String hello = "Hello";String specialChars = "\r\n\t\"\\";String unicodeEscapes = "\u0101\u2134\u03ff";

Создание из массива символов

char[] charArray = {’a’, ’b’, ’c’};String string = new String(charArray );

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 19 / 33

Page 26: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Строки

Доступ к содержимому строки

Строки неизменяемы

int length()

char charAt(int index)

char[] toCharArray()

String substring(int beginIndex)String substring(int beginIndex, int endIndex)

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 20 / 33

Page 27: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Строки

Конкатенация строк

Оператор +

String helloWorld = "Hello" + " World!";

java.lang.StringBuilder

StringBuilder buf = new StringBuilder ();buf.append("Hello");buf.append(" World");buf.append(’!’);String result = buf.toString ();

Компилятор преобразует + в операции с StringBuilder

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 21 / 33

Page 28: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Строки

Конкатенация строк

Оператор +

String helloWorld = "Hello" + " World!";

java.lang.StringBuilder

StringBuilder buf = new StringBuilder ();buf.append("Hello");buf.append(" World");buf.append(’!’);String result = buf.toString ();

Компилятор преобразует + в операции с StringBuilder

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 21 / 33

Page 29: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Строки

Сравнение строк

Оператор == сравнивает ссылки, а не содержимое строки

boolean equals(Object anObject)boolean equalsIgnoreCase(String anotherString)

int compareTo(String anotherString)int compareToIgnoreCase(String anotherString)

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 22 / 33

Page 30: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Кодировки строк

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 23 / 33

Page 31: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Кодировки строк

JVM использует для строк кодировку UTF-16(каждый символ занимает один или два char’а)

Кодировка строк в памяти не зависит от платформы или локали

Можно конвертировать данные в другие кодировки

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 24 / 33

Page 32: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Кодировки строк

Преобразование кодировок

byte[] getBytes(String charsetName)

String str = "test";byte[] ascii = str.getBytes("US -ASCII");// ascii -> {116, 101, 115, 116}

String(byte bytes[], String charsetName)

byte[] ascii = {116, 101, 115, 116};String str = new String(ascii , "US-ASCII");// str -> "test"

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 25 / 33

Page 33: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Кодировки строк

Преобразование кодировок

byte[] getBytes(String charsetName)

String str = "test";byte[] ascii = str.getBytes("US -ASCII");// ascii -> {116, 101, 115, 116}

String(byte bytes[], String charsetName)

byte[] ascii = {116, 101, 115, 116};String str = new String(ascii , "US-ASCII");// str -> "test"

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 25 / 33

Page 34: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Регулярные выражения

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 26 / 33

Page 35: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Регулярные выражения

Способ задания шаблонов строк для поиска и замены

Регулярные выражения поддерживаются в стандартнойбиблиотеке Javaboolean matches(String regex)

String[] split(String regex)

String replaceAll(String regex, String replacement)

String replaceFirst(String regex, String replacement)

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 27 / 33

Page 36: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Регулярные выражения

Язык регулярных выражений

x конкретный символ[a-z] диапазон символов[ˆa-z] любой символ вне диапазона. любой символre+ одно или более повторенийre* ноль или более повторенийre? ноль или одно повторение(re) группировкаre1|re2 выбор

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 28 / 33

Page 37: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Регулярные выражения

Пример

String str = "a, b, c,d, e";String [] items = str.split(", *");

// str.split (",[\t ]*");// str.split ("\\s*,\\s*");

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 29 / 33

Page 38: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Регулярные выражения

Пример

String str = "abracadabra";String regex = "(ab|ac|ad|r.?)+";

// str.matches(regex) -> true

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 30 / 33

Page 39: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Регулярные выражения

Пример

String str = "(aa)(bb)(cccc)";String regex = "\\(([^)]*)\\)";String result = str.replaceAll(regex , "$1");// result -> "aabbcccc"

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 31 / 33

Page 40: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Регулярные выражения

Pattern p = Pattern.compile("a*b");Matcher m = p.matcher("aaaaab");boolean b = m.matches ();

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 32 / 33

Page 41: Массивы и строки в Java - Alexey Vladykin · Массивы и строки в Java АлексейВладыкин 23сентября2013 Алексей Владыкин

Что сегодня узнали

Как создавать и использовать массивы

Как создавать и использовать строки

Как конвертировать строки из одной кодировки в другую

Что такое регулярные выражения и какие задачи можно решать сих помощью

Алексей Владыкин Массивы и строки в Java 23 сентября 2013 33 / 33