Thinking in Java Ликбез от скипи Regexp'ы Тонкости работы со строками Примеры использования устойчивых конструкций языка Риал-тайм тестер регекспов Понятно об equals() Понятно о hashCode() ХэшКод для разных типов Джошуа Блох. Java. Эффективное программирование Гайд по клонированию Клонирование коллекций Вирт. Алгоритмы и структуры данных ООП, сравнение языков Кормен Топики info.javarush в избранном Начинающим Java программистам Начинаем с начала или 'Hello, Java World!' Java по-русски. Часть первая: Книги Библиотека профессионала. Том 1-2 Java по-русски. Часть вторая: интернет-ресурсы Символы / Escape-последовательности Ошибки начинающих java-программистов Удаление элементов их коллекции без получения ConcurrentModificationException Типы исключений в Java Маленькие хитрости Java Сортировка. Годится как для массивов, так и коллекций. По умолчанию строки сортируются в алфавитном порядке, числа по возрастанию. ----------- Comparator() создаёт условие сортировки. ----------- //сортировка массива чисел по возрастанию public static void sort(Integer[] array) { Arrays.sort(array, new Comparator() { public int compare(Integer i1, Integer i2) { return i1 - i2; } } ); } Сравнение строк //Метод для сравнения строк: 'а' больше чем 'b' public static boolean isGreaterThen(String a, String b) { return a.compareTo(b) < 0; } Ещё способ безопасного удаления элементов из коллекций без получения ConcurrentModificationException public static void removeCats(Set pets, Set cats) { HashSet petsCopy = new HashSet(pets); for (Object pet : petsCopy) pets.removeAll(cats); } Primitive types casting Расширяющие преобразования чисел — это преобразования числового типа в «больший» числовой тип, которые считаются безопасными, т. к. не приводят к потере величины преобразуемого значения. Такими преобразованиями в Java являются: — преобразования byte в short, int, long, float и double; — преобразования short в int, long, float и double; — преобразования char в int, long, float и double; — преобразования int в long, float и double; — преобразования long в float и double; — преобразования float в double. То есть, цепочка расширения выглядит так: byte >> short >> int >> long >> float >> double. Сужающие преобразования чисел — это преобразования числового типа в «меньший» числовой тип, которые могут привести как к потере величины, так и к потере точности. Такими преобразованиями в Java являются: — преобразования byte в char; — преобразования short в byte и char; — преобразования int в byte, short и char; — преобразования long в byte, short, int и char; — преобразования float в byte, short, int, long и char; — преобразования double в byte, short, int, long, float и char; Особенности interrupt() при использовании нитей Thread.currentThread().interrupt(); так, и только так можно и нужно вызывать метод interrupt() в том случае, если ты в своем классе просто реализуешь интерфейс implements Runnable , если же ты наследуешься от класса трэд extends Thread , то достаточно вызывать его просто так interrupt(); , т.к. это уже унаследованный метод, и вызван он будет именно у той нити из которой вызывается. /*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/* 1) механизм работы интеррапта прост как пять копеек, грубо говоря this.interrupt() просто выкидывает флаг прерывания для для нити this, он ничего фактически не останавливает, а ты уже что хочешь с этим флагом, то и делаешь, хочешь, отрабатываешь его, хочешь месседж какой в консоль выведи, а хочешь тупо игнорь. Что бы как-то на него реально отреагировать и действительно завершить нить этот while (!isInterrupted()) { } цикл и пишется, он просто отслеживает этот флаг интерапта для this нити. Хочешь можешь прописать do { if (isInterrupted()){ System.out.println("Прощай, любимый мой, родной!"); } }while (!isInterrupted()); тогда нить попрощается с тобой перед завершением), хочешь подвешиваешь любое другое действие на флаг прерывания, вообщем как поступить с этим флагом, решаешь только ты, сам по себе он ничего не завершает. Такс, с интераптом я думаю разобрались… 2) Вот с join() тут уже всё поинтересней будет Что именно делает метод join()? Метод join() ожидает завершения нити, для которой он вызван, другими словами когда вызывается Thread.join(), вызывающая нить блокируется до завершения работы целевой нити. А вот теперь ВНИМАНИЕ гвоздь программы! ВОПРОС на засыпку: из какой нити и для какой нити вызывается join() (в правильном варианте решения задачи)? То есть какая нить у нас вызывающая, а какая целевая??? =) ОТВЕТ:вызывающая нить main, а целевая нить thread4!!! То есть вызвать из main message.showWarning(); в данном случае будет равносильно этому коду в main: thread4.interrupt(); thread4.join(); System.out.println(thread4.isAlive()); и эта строчка System.out.println(thread4.isAlive()); не выполниться до тех пор пока thread4 не завершится. Много о нитях: синхронизация Java Patterns Java Patterns 2 -------------- смещение массива вниз, "тетрис" public static void main(String[] args) { int[][] matrix = { {1,1,1,1}, {1,1,1,0}, {1,1,1,0} }; int height = 3; int width = 4; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { if (matrix[i][j] == 0) break; if (j == width - 1) matrix[i] = null; } } for (int i = height - 1; i >= 0;) { if (matrix[i] == null) { for (int j = i; j > 0; j--) { matrix[j] = matrix[j - 1]; } matrix[0] = new int[width]; } else i--; } } --------------