Не могу поверить, что никто не упомянул, что я считаю самой важной причиной:
«int» - это намного проще, чем «Integer». Я думаю, что люди недооценивают важность краткого синтаксиса. Производительность на самом деле не причина их избегать, потому что большую часть времени, когда кто-то использует числа, находится в индексах цикла, а увеличение и сравнение этих значений ничего не стоит в любом нетривиальном цикле (независимо от того, используете ли вы int или Integer).
Другая причина заключалась в том, что вы можете получить NPE, но этого очень легко избежать с помощью коробочных типов (и этого гарантированно избежать, если вы всегда инициализируете их ненулевыми значениями).
Другая причина заключалась в том, что (new Long (1000)) == (new Long (1000)) имеет значение false, но это просто еще один способ сказать, что «.equals» не имеет синтаксической поддержки коробочных типов (в отличие от операторов <,>, = и т. д.), поэтому мы возвращаемся к причине «более простого синтаксиса».
Я думаю, что пример непримитивного цикла Стива Йегге очень хорошо иллюстрирует мою точку зрения:
http://sites.google.com/site/steveyegge2/language-trickery-and-ejb
Подумайте об этом: как часто вы используете типы функций в языках, которые имеют хороший синтаксис для них (например, любой функциональный язык, python, ruby и даже C) по сравнению с Java, где вы должны имитировать их с помощью интерфейсов, таких как Runnable и вызываемые и безымянные классы.