среда, 4 апреля 2012 г.

Ввод и вывод. Файл и консоль

Для начала поговорим о выводе данных.
Давайте рассмотрим всем известный способ вывода данных, а именно:
System.out.println("123");
Окей. А теперь давайте посмотрим на класс java.io.PrintWriter. Выведем 1 000 000 чисел на экран и засечем время работы.
import java.io.*;

public class Temp {
    public static void main(String[] args){
        PrintWriter writer = new PrintWriter(new OutputStreamWriter(System.out));
        int n = 1000*1000;
        long time = System.currentTimeMillis();
        for (int i = 0; i < n; ++i)
            writer.print(i + " ");
        writer.println();
        writer.println(System.currentTimeMillis()-time);
        writer.close();
    }
}
На моём компьютере результат получается равным примерно 1000-1100 мс. У вас может получится другое число. А теперь попробуем сделать тоже самое с помощью System.out.

суббота, 17 декабря 2011 г.

Integer пул(pool)

Наверняка вам известно, что при сравнении двух объектов в Java на == обычно получается не тот результат, что нужен, т.к. идет сравнение ссылок на объекты, а не данных этих объектов.
Хм, давайте тогда посмотрим на следующий код и на результат его выполнения:
public class Temp {
    public static void main(String []args){
        Integer i1 = 10;
        Integer i2 = 10;
        System.out.println(i1 == i2);
    }
}
Как думаете, что он напечатает? А напечатает он true.

четверг, 15 декабря 2011 г.

Переопределение equals и hashCode

Есть у класса Object такой метод, как equals, который используется для сравнения двух объектов. По умолчанию он выглядит так:
public boolean equals(Object obj){
 return (this == obj);
}
Т.е. просто сравниваются две ссылки(прямо как оператор "=="). Понятно, что обычно, это не то, что нам надо. Обычно два объекта равны, если основные данные их равны. Чтобы это понимали не только мы, но и компилятор, нам и нужно переопределять метод equals. Существует несколько свойств, которым должен удовлетворять наш переопределенный метод, а именно:
  1. Симметричность. Т.е. если для каких-либо объектов x и y x.equals(y) возвращает true, то и y.equals(x) должен возвращать true.
  2. Рефлексивность. Для любого объекта x x.equals(x) должен возвращать true.
  3. Постоянство. Для любых объектов x и y x.equals(y) возвращает одно и тоже, если информация, используемая в сравнениях, не меняется.
  4. Транзитивность. Для любых объектов x, y и z, если x.equals(y) вернет true и y.equals(z) вернет true, то и x.equals(z) должен вернуть true.
В этих свойствах подразумевается, что объекты не null. А для null всё просто
  • Для любого не null объекта x x.equals(null) должен возвращать false.
Итак, предположим у нас есть такой вот класс:

понедельник, 5 декабря 2011 г.

Сериализация статических полей

Сериализация (serialization) объектов Java позволяет взять вам любой объект, реализующий интерфейс Serializable, и превратить его в последовательность байтов, из которой затем можно полностью восстановить исходный объект.
Чтобы сериализовать объект, требуется создать выходной поток OutputStream, который нужно вложить  объект ObjectOutputStream. По сути, вызов метода writeObject() осуществляет сериализацию объекта, и далее вы пересылаете его в выходной поток данных OutputStream. Для восстановления объекта необходимо надстроить объект ObjectInputStream для входного потока InputStream, а затем вызвать метод readObject(). Этот метод возвращает ссылку на объект типа Object, поэтому после вызова метода следует провести нисходящее преобразование для получения объекта нужного типа.

четверг, 1 декабря 2011 г.

Конструкции .this и .new

Если вам понадобится получить ссылку на объект внешнего класса, запишите имя внешнего класса, за которым следует точка, а затем ключевое слово this. Полученная ссылка автоматически относится к правильному типу, известному и проверяемому на стадии компиляции, поэтому дополнительные издержки на стадии выполнения не требуются. Следующий пример показывает, как использовать конструкцию .this:

воскресенье, 20 ноября 2011 г.

Модификаторы

В Java интерфейсы, классы и их члены могут быть объявлены с одним или несколькими модификаторами. Их можно разделить по категориям:
модификаторы класса:
public private(для внутренних классов) protected(для внутренних классов) abstract static final strictfp
модификаторы полей:
public protected private static final transient volatile
модификаторы методов:
public protected private abstract static final synchronized native strictfp
модификаторы конструкторов:
public protected private

Давайте рассмотрим назначения каждого из этих модификаторов.

вторник, 15 ноября 2011 г.

Коллекции. Краткий обзор

В языке Java существует довольно-таки много классов для хранения группы объектов, поэтому, чтобы не запутаться, следует разобраться, что из них и когда стоит использовать.
Начнём с такой вот хорошей таблицы:
Интерфейс Hash table реализация Resizable array реализация Tree реализация Linked list реализация Hash table + Linked list реализация
Set HashSet
TreeSet
LinkedHashSet
List
ArrayList
LinkedList
Queue


LinkedList
Map HashMap
TreeMap
LinkedHashMap


пятница, 11 ноября 2011 г.

finalize() и сборщик мусора

Все знают и помнят о важности инициализации, но многие забывает о значимости приборки за собой. Конечно, в Java есть сборщик мусора(garbage collector), который выполняет за вас грязную работу и освобождает память от ненужных объектов. Но если, например, ваш объект выделяет память каким-нибудь специфическим способом(без использования new), то тут сборщик мусора вам не поможет. Для таких случаев в Java и предусмотрен метод finalize(), который вы можете определить в вашем классе. Когда сборщик мусора захочет освободить память, занимаемую ненужным объектом, он сначала вызовет метод finalize() этого объекта, и только потом удалит сам объект. Но(!) следует помнить, что ваши объекты могут быть и не переданы сборщику мусора.

четверг, 10 ноября 2011 г.

Коротко о clone()

Метод clone() в Java используется для(подожди-подожди...) клонирования объектов. Т.к. Java работает с объектами с помощью ссылок, то простым присваиванием тут не обойдешься, ибо в таком случае копируется лишь адрес, и мы получим две ссылки на один и тот же объект, а это не то, что нам нужно. Механизм копирования обеспечивает метод clone() класса Object.
clone() действует как конструктор копирования. Обычно он вызывает метод clone() суперкласса и т.д. пока не дойдет до Object.

вторник, 8 ноября 2011 г.

String, StringBuilder и StringBuffer: что использовать?

Самое важное отличие String от StringBuilder/StringBuffer - это то, что String immutable, в то время как StringBuilder/StringBuffer mutable.
Что же это значит? А значит это то, что значение String не может изменяться. Но вы ведь много раз так делали, скажите вы. Всё дело в том, что при изменении значения String в действительности создается новый объект с новым значением. И, конечно же, создание новых объектов при каждом изменении - операция неэффективная.