четверг, 30 мая 2013 г.

Вставка данных в таблицу, если запись в ней отсутствует. Oracle


INSERT INTO table
SELECT trunc(sysdate), 0
FROM dual
WHERE NOT EXISTS (
  SELECT NULL 
  FROM table
  WHERE day=trunc(sysdate)
);

вторник, 28 мая 2013 г.

Чем отличается абстрактный класс от интерфейса?

Казалось бы, этот вопрос задается на многих собеседованиях на вакансию Java-программиста, но многие на него почему-то не могут дать достойного ответа. Так в чем же отличие? Отличия эти подразделяются на два типа: семантические и идеологические. Первые определяет структуру, а второй - для какой цели.

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

Один класс может напрямую наследовать только от одного абстрактного класса. Реализаций интерфейса может быть несколько для одного класса. Осносное назначеине - решение проблемы с множественным наследованием. Т.е. класс может быть одновременно нескольких типов. Так же интерфейс помогает избавиться от ромбовидного наследования

Абстрактный класс должен служить для определения общей функциональности объектов, а интерфейс должен описывать, через какие методы можно обращаться в объекту.

четверг, 16 мая 2013 г.

Как работает substring для объектов String в Java?

Как работает метод substring для объектов String в Java?

Ответ

Работа метода substring зависит от версии Java. Начиная с версии 7u6, после вызова метода substring создается новый объект String, через конструктор

public String(char value[], int offset, int count) {
    ...
    ...
    this.value = Arrays.copyOfRange(value, offset, offset+count);
}
где char value[] исходный массив символов строки, offset - смещение и count - количество символов. Из кода видно, что создается новый массив, хранящий символы. В версиях до Java 7u6 дела обстоят иначе: так же создается новый объект String, но используется старый массив char value[].

// Package private constructor which shares value array for speed.
String(int offset, int count, char value[]) {
    this.value = value;
    this.offset = offset;
    this.count = count;
}
Т.е. если исходная строка имеет очень большой размер, то создав короткий substring от нее, мы будем хранить в памяти большой массив из-за оставшейся на него ссылки. Это не позволяет сборщику мусора собрать оригинальную строку, из-за чего может возникнуть утечка памяти. Изначально это было сделано для ускорения создания подстрок, но было отмечено как баг и устранено в версии Java 7u6.

Чем отличается создание строки через new от создания через литерал?


String s1 = new String("test1");
String s2 = "test2";

Ответ

При создании строки через new, она не попадает в string pool. Что бы она туда попала, необходимо сделать s1.intern() или создать строку через литерал. String pool служит для того, что бы не создавались повторно существующие строки.