INSERT INTO table
SELECT trunc(sysdate), 0
FROM dual
WHERE NOT EXISTS (
SELECT NULL
FROM table
WHERE day=trunc(sysdate)
);
четверг, 30 мая 2013 г.
Вставка данных в таблицу, если запись в ней отсутствует. Oracle
вторник, 28 мая 2013 г.
Чем отличается абстрактный класс от интерфейса?
Казалось бы, этот вопрос задается на многих собеседованиях на вакансию Java-программиста, но многие на него почему-то не могут дать достойного ответа. Так в чем же отличие? Отличия эти подразделяются на два типа: семантические и идеологические. Первые определяет структуру, а второй - для какой цели.
В абстрактном классе может присутствовать реализация методов, конструкторов, переменных состояния, а так же объявление методов, которые должны быть реализованы наследниками. В интерфейсе не может быть реализации методов, он может содержать список методов, которые должны быть переопределены.
Один класс может напрямую наследовать только от одного абстрактного класса. Реализаций интерфейса может быть несколько для одного класса. Осносное назначеине - решение проблемы с множественным наследованием. Т.е. класс может быть одновременно нескольких типов. Так же интерфейс помогает избавиться от ромбовидного наследования
Абстрактный класс должен служить для определения общей функциональности объектов, а интерфейс должен описывать, через какие методы можно обращаться в объекту.
четверг, 16 мая 2013 г.
Как работает substring для объектов String в Java?
Ответ
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";