Я крыс пройду собеседование на 5
ява2сеЗачем оно?
Ну много для чего, я вот орбиты насчитывал используя только "се"
Спрашивайте что бы вы спросили на собеседование по ява2секак технически работает контейнер сервлетов в режиме веб-сервера?
я поотвечаю заодно и немного качнусь
это не se
Я же сказал только "се"
Что бы ты спросил на собеседование по ява2се?
хуи сосеш
Мы, правда, сейчас никого уже не ищем, так что чисто из любопытства...
ява2сеНазови значение 105-го байта в файле java.exe.
Назови значение 105-го байта в файле java.exeУ меня пол года в Java SE не было такого файла.
А вы где , может зайду если буду рядом
павелецкая 2с2
Не знаю про 105
пробел будет как и во ввсех экзешниках в 32 битной системе
Почти всегда задаю такую задачу: приведи пример ситуации, в которой LinkedList подходит значительно лучше, чем ArrayList. "Значительно" обозначает, что разница должна быть на порядки, а не на проценты.
Не знаю , в какой и почему
четыре
так, "Чисто поржать" ?
Не знаю , в какой и почемуСильно уже прокачался?
Как сделать утечку памяти в твоей программе?
Оборжались мы тут всем отделом летом, когда две вакансии было открыто... Ржать, кстати, обычно не хочется. просто грустно ='(
Оборжались мы тут всем отделом летом, когда две вакансии было открытовот она вся правда о синьерах
Может ли статический вложенный класс обратиться к членам данных включающего класса?
(Этот вопрос задали 5 лет назад мне.)
Есть ли в Java невиртуальные функции-члены?
нет
и чо такое функции члены
ты после давай правильные ответы плизз
ну еще статические функции лол
Не только конструкторы, ещё и приватные методы.
// нет
Ответ неверный.
ну значит да
А вообще, почему бы не раздобыть какие-нибудь экзамены на сертификат Sun по Java? Думаю, было бы очень полезно.
ответ тоже неверный.
А это, знаете ли, основы. Я тут не спрашиваю про атомарность работы с Integer64 или почему сборщик мусора может не собрать весь мусор, что тоже, в общем-то, тривиально.
спрашивайте нормальные вопросы а не то что вам кажется "очевидная хуетня"
и да, какой ответ правильный там и почему
Ты хочешь, чтобы тебе задавали вопросы по синтаксису языка? Так это никому не интересно, тебе IDE подскажет синтаксис все равно. Вот и спрашивают с тебя программирование вообще, особенности java-машины и отличия языка Java от других ОО-языков.
Функция-член - C++ - название для "метода класса", в противовес функциям (скажем, main. В Java любая функция - это функция-член.
Есть ли в Java множественное наследование? А если нет, то как мне его реализовать?
Как в в многопоточной Java-программе сделать эксклюзивный доступ к разделяемому ресурсу?
хм, любопытно? Вон, Саттер грит, что в плюсах вообще не надо открытые методы делать виртуальными. Понятно, что это дрочерский заеб для расширяемости во все дыры, но все же, в джаве нельзя сделать private-метод виртуальным? Иногда этого хочется (template method)
да... да идите вы все нахуй
Или private, или виртуальным. Если нужна и виртуальность, и защита от внешнего мира, есть protected.
А Java взботнуть не пробовал? А бошку включить?
private-метод виртуальным сделать нельзя. Но мне, например, как-то не приходит в голову, зачем. А вот приватное наследование очень бы помогло.
Ну вот я вроде знаю java, но вопроса не понял.
Можно создать экземпляр класса и использовать приватные поля, это значит да или нет?
А без экземпляра, конечно, нет. В общем странный вопрос, сильно искусственный и переусложнённый (или там всё гораздо сложнее?).
Кому? Чем? За всё моё время в программировании не помню не одного нормального примера, только один свой, за который мне стыдно . С вероятностью 99.99% "приватное наследование" означает "плохой дизайн".
ну типа может еще хотеться защитить не только от внешнего мира, но и от потомков (нахрена им вызывать детали реализации базового класса?) Ну это не принципиально, можно и так жить, конечно. Хотя это тупо, две несвязанные вещи тут сцеплены.
FAIL!111
Согласен, встречается не часто, не не всегда плохой дизайн
и типичные вопросы на собеседовании
Поищи Thinking in Java (Философия Java). Для SE большего не надо.
> к членам данных включающего класса
Очень тяжело распарсить. Может задашь вопрос нормально?
ну вот и вопрос назрел (мне задавали, правда не совсем на собеседовании) и, логично, что это про плюсы, потому что там есть private-наследование. Ну так вот, собственно, и вопрос: когда оно необходимо
Вопрос задан предельно ясно. Правильный ответ (который я и дал, обчитавшись Thinking in Java): "да, если данные-члены статические".
На собеседовании. Сразу после важнейшего вопроса "что происходит, когда деструктор бросает исключение"?
Есть у тебя объект, который умеет ковыряться в жопе. Но всех ковырять он не хочет, поэтому только по требованию говорит, что на самом-то деле умеет.
Конечно, можно (и почти всегда правильней) держать отдельный ковырятор, и отдавать его, но иногда это связано с проблемами :
циклические зависимости между ковырятором и объектом,
тяжёлая читабельность этой, эм, конструкции,
поскрёбывания от "чувства прекрасного", ибо ковырятор сделать лишь для того чтобы предоставить этот самый контроль
Все просто молятся на нее. Там синтаксис и примеры из Se или вся книга расказывает о особеностях языка?
Даже, блядь, падежи не совпали.
Ответ как и всегда: для повторного использования. Если тебе в классе для использования необходимо переопределять виртуальные методы, то наследование необходимо, если не хочешь при этом наследовать интерфейс, надо наследоваться закрыто. Поэтому агрегирование и не проканает. В опыте такое бывало. Можно, конечно, унаследовать private-класс и его уже заагрегировать. Но ебаааать!
я понял что мне надо почитать основы
Почти всегда задаю такую задачу: приведи пример ситуации, в которой LinkedList подходит значительно лучше, чем ArrayList. "Значительно" обозначает, что разница должна быть на порядки, а не на проценты.пиздатый вопрос, спасибо.
public class TestClass
{
public static void main(String[] args)
{
LinkedList<Integer> lin_list = new LinkedList<Integer>
ArrayList<Integer> arr_list = new ArrayList<Integer>
for(int i = 0; i < 11451103; i++)
{
int num = (intMath.random*10000000);
lin_list.add(num);
arr_list.add(num);
}
long start = System.nanoTime;
lin_list.add(5);
System.out.println(System.nanoTime - start);
start = System.nanoTime;
arr_list.add(5);
System.out.println(System.nanoTime - start);
}
}
output:
12800
120918308
Цимес, как можно понять, в волшебной цифре 11451103 (которую я, не парясь, подсмотрел в дебаге). На этом месте при добавлении следующей циферки arraylist дропает свой внутренний массив и создает новый, удвоенной величины и копирует туда все значения, плюс это новое, а линкедлист, как обычно добавляет элемент за О(1).
Алсо, пацаны, ответы на все ваши вопросы можно найти в гугле! Так не очень интересно!
Цимес, как можно понять, в волшебной цифре 11451103Цимес поставленного автором вопроса вовсе не в этом.
В операциях последовательного добавления большого количества элементов линкедлист будет лучше на _порядки_ (порядки продемонстрированы) из-за периодического пересоздания внутреннего массива в аррейлисте.
наоборот, если суммарное посчитаешь, массив быстрее будет, лол!
В операциях последовательного добавления большого количества элементов линкедлист будет лучше на _порядки_ (порядки продемонстрированы) из-за периодического пересоздания внутреннего массива в аррейлисте.В этих операциях LinkedList будет хуже раза в два, а то и больше.
ну, кстати, если написать свой аллокатор фиксированного размера, то может и не в два раза (потому что при перевыделении не надо будет копировать старые данные). Но дело в любом случае не в последовательном добавлении, конечно
кстати, недавно тестил realloc случайно. Он тоже догадливый, тоже пропорциональный запас делает у меня в glibc, поэтому прога, реаллочащая при каждом увеличении размера не так уж и проигрывает более хитрому варианту. Как раз раза в два, хотя должна в тысячу!
кстати, недавно тестил realloc случайноТы между его вызовами создавал-удалял объекты, которые приводят к фрагментации?
public class TestClass
{
public static void main(String[] args)
{
LinkedList<Integer> lin_list = new LinkedList<Integer>
ArrayList<Integer> arr_list = new ArrayList<Integer>
for(int i = 0; i < 10000000; i++)
{
int num = (intMath.random*10000000);
lin_list.add(num);
arr_list.add(num);
}
long start = System.nanoTime;
for(int i = 0; i < 10000000; i++)
{
lin_list.remove;
}
System.out.println(System.nanoTime - start);
start = System.nanoTime;
for(int i = 0; i < 10000000; i++)
{
arr_list.remove(i);
}
System.out.println(System.nanoTime - start);
}
}
аррайлист до сих пор удаляет
Еще в интернетах пишут, что при реализации очереди линкедлист будет эффективнее, но мне все-таки казалось, что фишка именно в этом удвоении внутреннего массива, это как-то в духе остальных "собеседовательных" вопросов, типа на знание какой-нибудь подковыристой х-ни.
for(int i = 0; i < 10000000; i++)
{
arr_list.remove(i);
}
В принципе, Крыс, я уже составил о тебе мнение как о программисте
Поверь мне, тебе еще рано почивать на лаврах, лучше поучись программированию еще немножко.
А потом, когда он выделяет уже отдельными mmap'ами для каждого блока, он себя не супер-хитро ведет, но тоже не совсем тривиально, начиная примерно с 483322 интов начинает удваивать, чесслово, вот прога, кстати:
#include <stdio.h>
#include <stdlib.h>
int main
{
int *a;
int n;
int reservedSpace;
int i;
int pointerChanges;
n = 0;
reservedSpace = 50;
a = (int*) malloc( reservedSpace * sizeof( int ) );
pointerChanges = 0;
for(i = 0; i < 10000000; ++i) {
if( n == reservedSpace ) {
void* aOld = a;
a = (int*)realloc( a, (reservedSpace += 1) * sizeof( int ) );
if( a != aOld ) {
++pointerChanges;
printf( "%d, ", i );
}
}
a[n] = 18;
++n;
}
}
Соотв-но можно заменить reservedSpace +=1 на что-нибудь типа reservedSpace *= 2 (поэтому, собстно, так странно и написано).
а что тут не так?
да это просто троллинг
сам ответь, иначе поставим три, будет слишком позороно
Ну там надо как-то хитро, потому что если выделить фиксированного размера блок, то он его при одном из первых реаллоков перепрыгнет и он (фрагментирующий блок) начнет выделяться где-то вначале.Ясное дело, но когда ты делаешь realloc в реальной программе, у тебя между этим может быть создано и удалено много разных объектов, в том числе размером до нескольких килобайт. Скорее всего, всё равно придётся делать ручную амортизацию.
начиная примерно с 483322 интов начинает удваивать, чесслово,Ну а malloc, начиная с этого места, тоже удваивает?
других методов удаления в аррайлисте вроде нет
Какая методика проверки?
а, не, ну если ты хочешь удалять именно с начала, то можно, конечно, намекнуть, что это лучше делать на списке, но переходить на список только ради этого тоже позорно и как ответ на вопрос это все еще не годится.
В любом случае сомневаюсь, что malloc может вдруг выделить в два раза больше памяти, чем его попросили.
Какая методика проверки?Я не знаю, потому что не проверял... Попробуй поскладывать string различной длины между вызовами realloc. При этом желательно сохранить 3 строки в векторе, а на следующей итерации удалить среднюю, сохранив две оставшиеся до конца. Вот.
Ты бы не выебывался, а нормально объяснил. С конца удалять быстрее, да, но это неэквивалентные ситуации - допустим, требуется удалять именно с начала
с начала быстро не удалишь, тут уже придется программировать. Например, хранишь число удаленных с начала элементов и прибавляешь его к каждому индексу, когда накопится, скажем, та же половина, можно и на самом деле удалить, одним заходом. Опять же выйдет быстрее, чем со списком. И это если память так быстро нужна. Добавления и удаления только в начале и конце тоже лучше делать массивом, циклическую индексацию там бахнуть (пишется легко например. Списки нужны не так часто Как раз это девочке с геологического недавно объяснял, она сама все написала
Например, хранишь число удаленных с начала элементов и прибавляешь его к каждому индексу, когда накопится, скажем, та же половина, можно и на самом деле удалить, одним заходомА если например второй тред параллельно читает эту структуру постоянно, ты будешь велосипедить проверку, что следующий забираемый элемент не входит в число "удаленных"?
Так фишка в том, что если работать с фиксированным размером памяти, то это все перепрыгнется довольно быстро и дальше будет опять же неважно.
а что тут не так?Ну, если мне не изменяет здравый смысл, то ты удалишь все элементы с четными номерами из массива, а потом еще 5 000 000 раз сделаешь remove(x где x>arr_list.length
Так фишка в том, что если работать с фиксированным размером памяти, то это все перепрыгнется довольно быстро и дальше будет опять же неважно.Я же написал, что надо две строки оставлять в векторе до конца. Тебе нужно сделать так, чтобы между двумя участками памяти образовывалось окно, которого не достаточно для следующей итерации. Может быть, просто добавлять минимальный блок памяти в вектор, до конца цикла.
Ты бы не выебывался, а нормально объяснил. С конца удалять быстрее, да, но это неэквивалентные ситуации - допустим, требуется удалять именно с началаТы уже написал в общем-то подходящий ответ: использовать эти списки в качестве Deque. ArrayList не амортизируется при удалении первого элемента. Но на собеседовании у тебя вряд ли будет время и возможность написать и запустить код.
ну ексель, а что ж сделать? А если ты удаляешь первый элемент со сдвигом, то второму треду вообще ждать придется завершения каждой операции, так еще хуже будет. Тут хотя бы можно атомарным прибавлением единички обойтись, без мутексов, а мутексить только при настоящем удалении. Но это уже отдельный большой вопрос, более сложный, зачем это сюда приплетать?
Ты уже написал в общем-то подходящий ответ: использовать эти списки в качестве Dequeну я вот все равно не согласен дек на массиве все еще быстрее, если самому написать. Все же листы нужны при добавлении и/или удалении из середины или ну там вставке целого участка в середину (наверное и не писал такого никогда )
Но это уже отдельный большой вопрос, более сложный, зачем это сюда приплетать?
ни за чем, ты первый начал смайлики постить.
Ну, если мне не изменяет здравый смысл, то ты удалишь все элементы с четными номерами из массива, а потом еще 5 000 000 раз сделаешь remove(x где x>arr_list.length
омг!
кстати
ну я вот все равно не согласен дек на массиве все еще быстрее, если самому написать. Все же листы нужны при добавлении и/или удалении из середины или ну там вставке целого участка в середину (наверное и не писал такого никогда )Если ты не согласен, то почитай мой пост внимательнее.
Кроме того, добавление/удаление в середине linked list имеет среднюю сложность O(N это такая же сложность, как и в массиве.
омгНадо было написать remove(0)
Тебе нужно сделать так, чтобы между двумя участками памяти образовывалось окно, которого не достаточно для следующей итерации. Может быть, просто добавлять минимальный блок памяти в вектор, до конца цикла.ну это понятно, но мне все еще кажется, что это скажется очень слабо, потому что каждое перевыделение с настоящим перемещением дает много свободной памяти вначале, откуда следущие блоки еще долго смогут выделяться. Так в любом случае, какая цель? Вроде уже определились с тем, что из кучи realloc берет тупо, как написано в манах, пока есть свободное место непосредственно за блоком, что, в принципе, логично. Да, я его переоценил.
Ну, если мне не изменяет здравый смысл, то ты удалишь все элементы с четными номерами из массива, а потом еще 5 000 000 раз сделаешь remove(x где x>arr_list.lengthдействительно, хуйня какая-то произошла
Кроме того, добавление/удаление в середине linked list имеет среднюю сложность O(N это такая же сложность, как и в массиве.ну, во-первых, ты это говоришь о добавлении с поиском (что вовсе не обязательно во-вторых, это O(N) чтений вместо O(N) записей, правда не по последовательным адресам, что довольно существенно, но все еще не очевидно, что равноценно.
Надо было написать remove(0)остановимся на том, что я это имел в виду
ну, во-первых, ты это говоришь о добавлении с поиском (что вовсе не обязательно во-вторых, это O(N) чтений вместо O(N) записей, правда не по последовательным адресам, что довольно существенно, но все еще не очевидно, что равноценно.У тебя есть пример реальной задачи, когда надо добавлять в середину списка без поиска? Не высасывай из пальца какие-то нереальные ситуации, плиз. А то сейчас ты linked list посоветуешь сделать в виде списка из массивов элементов, что позволит тебе ещё быстрее искать середину. А если сделать skip list, так вообще будет логарифм.
правда не по последовательным адресам, что довольно существенно, но все еще не очевидно, что равноценно.Это не равноценно. Даже при последовательном доступе LinkedList в среднем намного медленнее, особенно в языках с GC.
ну блин, у тебя есть проход линейный по последовательности, где иногда надо вставлять. Тут поиск у тебя идет сам по себе. Ну тут да, если один проход, то массив можно просто пересоздавать сразу на новом месте, но это уже «а можно сделать совсем по-другому». Или у тебя могут быть ссылки на элементы списка из какой-нибудь внешней структуры (графа, например) прямо на нужные тебе элементы списка.
Это не равноценно. Даже при последовательном доступе LinkedList намного медленнее, особенно в языках с GC.не понял, причем тут GC, но согласен, с нормальным компилятором удаление элемента из середины массива должно быть быстрее, чем поиск по linked-list'у.
ну блин, у тебя есть проход линейный по последовательности, где иногда надо вставлять. Тут поиск у тебя идет сам по себе.А средняя сложность никуда не идёт и остаётся O(N)
Или у тебя могут быть ссылки на элементы списка из какой-нибудь внешней структуры (графа, например) прямо на нужные тебе элементы списка.
Это уже не структура данных linked list. Так что КПблЦ в итоге нарыл правильные ответ на вопрос автора.
А средняя сложность никуда не идёт и остаётся O(N)хуясе! там O(N(N-1) /2) vs O(N)
не понял, причем тут GCБольше фрагментации, поэтому данные улетают из кэша. Получается так, что для полного последовательного прохода процессор несколько раз должен обновить кэш.
Это уже не структура данных linked list. Так что КПблЦ в итоге нарыл правильные ответ на вопрос автора.т.е. в джаве нет итераторов на linked list, которые не инвалидейтятся, когда не удаляешь соответствующий элемент? Тогда эта структура, понятное дело, нахуй не нужна.
Так что КПблЦ в итоге нарыл правильные ответ на вопрос автора.нет, ну в некотором роде, это, конечно, ответ, но не на пять. Понятно, тупо удалять из начала лучше из linked list, чем из массива, но это плохой пример. Вот у нас в школе на двери кабинета информатики когда-то висела бумажка, на ней говорилось, что умеющий поменять значения двух переменных достоин тройки, умеющий это сделать не используя третьей достоин четверки, а знающий, когда этого делать нельзя, достоин пятерки. Так и тут, логическое удаление из начала не обязательно должно быть выражено инструкцией remove(0)
Еще в интернетах пишут, что при реализации очереди линкедлист будет эффективнее
пожалуйста, читай меня прежде чем отвечать, хотя бы иногда
хуясе! там O(N(N-1) /2) vs O(N)Я не понял твоей оценки O(N^2). Надо более чётко поставить задачу, ты привёл такую ситуацию: есть функция, которая принимает массив из K элементов, где K ~~ N, которые надо вставить в структуру данных LinkedList или ArrayList. Теоретически, их можно вставить в список за O(N а вставка в лоб в массив будет O(N^2 но тут любой разработчик скажет, что он создаст массив заново, потому что O(N) по памяти предпочтительнее сложности O(N^2).
нет, вставлять надо не один непрерывный кусок, а после некоторых элементов по какому-нибудь условию. Ну да, будет O(N*K) vs O(N) при лобовой реализации.
нет, ну в некотором роде, это, конечно, ответ, но не на пять.Это конкретный вопрос с конкретным ответом: когда LinkedList лучше ArrayList. Это конкретные классы в JDK, с конкретной сложностью работы. Ответ про Deque/Queue (ArrayList не реализует эти интерфейсы) здесь вполне тянет на пять.
Потому с амортизацией удаление из начала ArrayList будет иметь сложность O(N ты просто поменяешь коэффициент. Да и сделать амортизацию ты можешь только в своём классе, через ArrayList это сделать не получится.
Только прежде чем писать отзыв о наборе коллекций на массивах, надо понимать, что есть ArrayDeque, который амортизирует массив с обоих концов, и работает быстрее LinkedList; но автор всё-таки спрашивал про ArrayList.
O(N^2 ты просто поменяешь коэффициентнеправда, если по настоящему удалять только когда размер уменьшился вдвое, то будет NlogN
Т.е. у меня в голове пока только какие-то абстракции типа приходят нерегулярные запросы на добавление/удаление из середины и они уже знают, куда именно надо вставить/удалить.
Ну или склейка справа/слева двух списков — вот, но где бы это было нужно?
Теоретически, их можно вставить в список за O(N а вставка в лоб в массив будет O(N^2 но тут любой разработчик скажет, что он создаст массив заново, потому что O(N) по памяти предпочтительнее сложности O(N^2).тут как бэ тоже создавать новый не надо, просто надо смещать сразу на K.
неправда, если по настоящему удалять только когда размер уменьшился вдвое, то будет NlogNТут весь вопрос остаётся в том, когда он уменьшился вдвое? Элементы-то тем временем продолжают добавляться в конец массива. На самом деле для O(1) тебе нужно будет сделать из ArrayList кольцевой буфер; только тогда на собеседовании тебя спросят о готовом (см. выше).
тут как бэ тоже создавать новый не надо, просто надо смещать сразу на K.Согласен, но этой операции нет в ArrayList. И ещё, вроде бы он не умеет удалять целый кусок изнутри.
пока я тут не флудил
Вот именно, что кольцевой буфер (выше писал но я рассматривал сейчас модель КРЫСа — удаление из начала до упора
Согласен, но этой операции нет в ArrayList. И ещё, вроде бы он не умеет удалять целый кусок изнутри.Жесть, если честно (что нету удаления куска). Ну и что значит, нет операции? Можно самому накатать, должно быть быстро.
Жесть, если честно (что нету удаления куска).Нет, ну жести нет, есть subList(from, to) его можно очистить clear; поскольку всё это обёртки, то выполняется без копирования.
Соответсвенно получить в памяти структуру с необходимым форматом было легче и быстрее(по времени) используя LinkedList.
(Правда писалось на C#)
Оставить комментарий
stm6692945
Спрашивайте что бы вы спросили на собеседование по ява2сея поотвечаю заодно и немного качнусь