Nie mogę uwierzyć, że nikt nie wspomniał o tym, co moim zdaniem jest najważniejszym powodem: „int” jest takie, o wiele łatwiejsze do wpisania niż „Integer”. Myślę, że ludzie nie doceniają wagi zwięzłej składni. Wydajność nie jest tak naprawdę powodem, aby ich unikać, ponieważ większość czasu, gdy używa się liczb, znajduje się w indeksach pętli, a inkrementacja i porównywanie ich nic nie kosztuje w żadnej nietrywialnej pętli (niezależnie od tego, czy używasz int czy Integer).
Drugim podanym powodem było to, że możesz uzyskać NPE, ale jest to niezwykle łatwe do uniknięcia w przypadku typów pudełkowych (i gwarantuje się unikanie tego, o ile zawsze inicjujesz je na wartości inne niż null).
Drugim powodem było to, że (new Long (1000)) == (new Long (1000)) jest fałszem, ale to tylko inny sposób na powiedzenie, że „.equals” nie obsługuje składni dla typów pudełkowych (w przeciwieństwie do operatorów <,> , = itd.), więc wracamy do powodu „prostszej składni”.
Myślę, że przykład nieprymitywnej pętli Steve'a Yegge'a bardzo dobrze ilustruje mój punkt widzenia:
http://sites.google.com/site/steveyegge2/language-trickery-and-ejb
Pomyśl o tym: jak często używasz typów funkcji w językach, które mają dobrą składnię (jak każdy język funkcjonalny, Python, Ruby, a nawet C) w porównaniu z Javą, gdzie musisz symulować je za pomocą interfejsów, takich jak Runnable i Callable oraz bezimienne klasy.