Feb 17, 2015 20:55
1. HashMap всеядный, но это совсем не бесплатно.
Да, в Java'е у любого объекта есть метод hashCode, но как он работает? Вы тоже считали, что он просто возвращает внутренний адрес объекта? В JVM объекты двигаются в памяти, там нет постоянных адресов. Приходится заводить поле, чтобы хранить этот identity hash code и возвращать всегда одно и то же число.
2. Методы классов вызываются как в C++ (хорошо), методы интерфейсов вызываются как в JavaScript'е (плохо).
Для классов работает стандартная схема: экземпляр ссылается на виртуальную таблицу; известно, что требуемый метод хранится, скажем, в ячейке №5. Итого, один переход по указателю и один переход по смещению. А для интерфейсов такого нет: когда нужно вызвать метод, например, int size(), то делается переход в виртуальную таблицу, где во всем списке натурально по имени и сигнатуре приходится искать нужную запись, вообще говоря, каждый раз. Потому что никакого фиксированного номера ячейки у нас нет.
3. Какой тип получается у анонимного класса?
Допустим, вы создали на лету Runnable:
(new Runnable() { public void run() { } })
Прада ли, что у вас получилось выражение типа Runnable?
Нет, не правда, это другой тип. Он конечно у вас очень скоро сдуется до обычного Runnable'а, но можно успеть поймать, пока тип настоящий:
new Object() {
int gcd(int a, int b) {
if (a == b) {
return a;
} else if (a < b) {
return gcd(a, b - a);
} else {
return gcd(a - b, b);
}
}
}.gcd(1071, 462);
Видите, у этого класса есть метод gcd(int, int), я его вызываю. (Таким образом можно на лету сделать рекурсивный код целиком внутри другого метода.)
java