
Объекты Class для массивов
Каждый массив имеет связанный объект Class, разделяемый со всеми другими массивами, имеющими тот же самый тип компонент. Суперкласс типа-массива рассматривается как Object, что видно из следующего примера:
class Test {
public static void main(String[] args) {
int[] ia = new int[3];
System.out.println(ia.getClass());
System.out.println(ia.getClass().getSuperclass());
}
}
который печатает:
class [I
class java.lang.Object
где строка "[I" является сигнатурой типа время выполнения для объекта класса "массив с компонентами типа int" (§20.1.1).
Массив символов - не String
В языке Ява, в отличие от Cи, массив типа char - не String , и ни строка, ни массив типа char не заканчиваются ‘\u0000‘ (символом NUL).
Объект String языка Ява не меняется, то есть никогда не меняется его содержание, в то время как массив типа char имеет непостоянные элементы. Метод toCharArray в классе String, возвращает массив символов, содержащий одинаковую последовательность символов, такую как String. Класс StringBuffer реализует полезные методы для непостоянных массивов символов.
Исключение сохранения массива
Если vпеременная-массив имеет типA [ ], гдеA- ссылочный тип, тогдаvможет содержать ссылку для реализации любого типа-массиваB [ ], если разрешается Bприсваивать А.
Таким образом, пример:
class Point { int x, y; }
class ColoredPoint extends Point { int color; }
class Test {
public static void main(String[] args) {
ColoredPoint[] cpa = new ColoredPoint[10];
Point[] pa = cpa;
System.out.println(pa[1] == null);
try {
pa[0] = new Point();
} catch (ArrayStoreException e) {
System.out.println(e);
}
}
}
выводит следующее:
true
java.lang.ArrayStoreException
Здесь переменная pa имеет тип Point[], и переменная cpa имеет его ссылочное значение для объекта типа ColoredPoint[]. ColoredPoint может присваиваться Point; поэтому значение cpa может быть присвоено pa.
Например, ссылка на этот массив pa, при проверке является ли pa [1]- null, не будет заканчиваться ошибкой времени выполнения. Это происходит потому, что элемент массива типа ColoredPoint[] - есть ColoredPoint, а ColoredPoint может рассматриваться как Point, поскольку Point - это суперкласс ColoredPoint.
С другой стороны, присваивание массиву pa может заканчиваться ошибкой во время выполнения. Во время компиляции, присваивание элементу pa проверяется, чтобы удостовериться в том, что присвоенное значение - Point. Но когда pa содержит ссылку на массив типа ColoredPoint присваивание допустимо, только если тип присвоенного значения во время выполнения - тип ColoredPoint.
Во время выполнения Ява контролирует такую ситуацию, чтобы гарантировать что присваивание допустимо; если это не так, то генерируется ArrayStoreException . Более формально: присваивание элементу массива, чей тип - A [ ], гдеA- тип ссылки, проверяется во время выполнения, чтобы гарантировать что присвоенное значение может предназначаться для фактического типа элементов массива, где фактическим типом элементов может быть любой ссылочный тип, который можно присвоить кA.
Текст программы.
public class MaxArr {
public static void main(String[] args) throws Exception {
int n, i, a[];
n = Xterm.inputInt("Введите длину массива n -> ");
a = new int[n];
for (i=0; i<n; i++)
a[i] = Xterm.inputInt("Введите a[" + i + "] -> ");
int max = a[0];
for (i=1; i<n; i++)
if (a[i] > max)
max = a[i];
Xterm.println("Максимальный элемент массива = " + max);
}
}
В заключение рассмотрим задачу, включающую дополнительное требование на структуру программы.
Текст программы.
public class NumMaxArr {
public static void main(String[] args) throws Exception {
int n, i, a[];
n = Xterm.inputInt("Введите длину массива n -> ");
a = new int[n];
int max = Integer.MIN_VALUE;
int nMax = 0;
for (i=0; i<n; i++) {
a[i] = Xterm.inputInt("Введите a[" + i + "] -> ");
if (a[i] > max) {
max = a[i];
nMax = 1;
} else if (a[i] == max)
nMax += 1;
}
Xterm.println("Количество макс. элементов = " + nMax);
}
}
Использование константы Integer.MIN_VALUEпозволяет избежать необходимости присваивания переменнойmaxзначения нулевого элемента массива до начала циклического просмотра остальных элементов.
Можно заметить, что при решении этой задачи массив по-существу не используется. Если в этой программе удалить описание массива a, заменив его на описание целой переменнойa, и произвести замену всех вхождений выраженияa[i] наa, то программа останется работающей.
Задача сортировки является классической задачей на массивы.
Приведенный ниже алгоритм, который
последовательно обменивает все соседние
пары элементов, расположенных в
неправильном порядке, являетсяодним
из самых медленныхалгоритмов
сортировки среди всех широко известных
-- его асимптотическая сложность является
квадратичной (
).
Текст программы.
public class Sort {
private static void sort(int[] a, int n) {
int i, j, t;
for (i=0; i<n-1; i+=1)
for (j=n-1; j>i; j-=1)
if (a[j] < a[j-1]) {
t=a[j]; a[j]=a[j-1]; a[j-1]=t;
}
}
public static void main(String[] args) throws Exception {
int n, i, a[];
n = Xterm.inputInt("Введите длину массива n -> ");
a = new int[n];
for (i=0; i<n; i++)
a[i] = Xterm.inputInt("Введите a[" + i + "] -> ");
Xterm.print("Исходный массив\n");
for (i=0; i<n; i++)
Xterm.print(" " + a[i]);
Xterm.print("\n");
sort(a, n);
Xterm.print("Отсортированный массив\n");
for (i=0; i<n; i++)
Xterm.print(" " + a[i]);
Xterm.print("\n");
}
}
Задачи
Создайте массив из всех чётных чисел от 2 до 20 и выведите элементы массива на экран сначала в строку, отделяя один элемент от другого пробелом, а затем в столбик (отделяя один элемент от другого началом новой строки). Перед созданием массива подумайте, какого он будет размера.
2 4 6 … 18 20 2 4 6 … 20
Создайте массив из всех нечётных чисел от 1 до 99, выведите его на экран в строку, а затем этот же массив выведите на экран тоже в строку, но в обратном порядке (99 97 95 93 … 7 5 3 1).
Создайте массив из 15 случайных целых чисел из отрезка [0;9]. Выведите массив на экран. Подсчитайте сколько в массиве чётных элементов и выведете это количество на экран на отдельной строке.
Создайте массив из 8 случайных целых чисел из отрезка [1;10]. Выведите массив на экран в строку. Замените каждый элемент с нечётным индексом на ноль. Снова выведете массив на экран на отдельной строке.
Создайте 2 массива из 5 случайных целых чисел из отрезка [0;5] каждый, выведите массивы на экран в двух отдельных строках. Посчитайте среднее арифметическое элементов каждого массива и сообщите, для какого из массивов это значение оказалось больше (либо сообщите, что их средние арифметические равны).
Создайте массив из 4 случайных целых чисел из отрезка [10;99], выведите его на экран в строку. Определить и вывести на экран сообщение о том, является ли массив строго возрастающей последовательностью.
Создайте массив из 20-ти первых чисел Фибоначчи и выведите его на экран. Напоминаем, что первый и второй члены последовательности равны единицам, а каждый следующий — сумме двух предыдущих.
Создайте массив из 12 случайных целых чисел из отрезка [-15;15]. Определите какой элемент является в этом массиве максимальным и сообщите индекс его последнего вхождения в массив.
Создайте два массива из 10 целых случайных чисел из отрезка [1;9] и третий массив из 10 действительных чисел. Каждый элемент с i-ым индексом третьего массива должен равняться отношению элемента из первого массива с i-ым индексом к элементу из второго массива с i-ым индексом. Вывести все три массива на экран (каждый на отдельной строке), затем вывести количество целых элементов в третьем массиве.
Создайте массив из 11 случайных целых чисел из отрезка [-1;1], выведите массив на экран в строку. Определите какой элемент встречается в массиве чаще всего и выведите об этом сообщение на экран. Если два каких-то элемента встречаются одинаковое количество раз, то не выводите ничего.
Пользователь должен указать с клавиатуры чётное положительное число, а программа должна создать массив указанного размера из случайных целых чисел из [-5;5] и вывести его на экран в строку. После этого программа должна определить и сообщить пользователю о том, сумма модулей какой половины массива больше: левой или правой, либо сообщить, что эти суммы модулей равны. Если пользователь введёт неподходящее число, то программа должна требовать повторного ввода до тех пор, пока не будет указано корректное значение.
Программа должна создать массив из 12 случайных целых чисел из отрезка [-10;10] таким образом, чтобы отрицательных и положительных элементов там было поровну и не было нулей. При этом порядок следования элементов должен быть случаен (т. е. не подходит вариант, когда в массиве постоянно выпадает сначала 6 положительных, а потом 6 отрицательных чисел или же когда элементы постоянно чередуются через один и пр.). Вывести полученный массив на экран.
Пользователь вводит с клавиатуры натуральное число большее 3, которое сохраняется в переменную n. Если пользователь ввёл не подходящее число, то программа должна просить пользователя повторить ввод. Создать массив из n случайных целых чисел из отрезка [0;n] и вывести его на экран. Создать второй массив только из чётных элементов первого массива, если они там есть, и вывести его на экран.