powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / autoboxing: простая но полезная головоломка
4 сообщений из 4, страница 1 из 1
autoboxing: простая но полезная головоломка
    #33495896
грсв
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот пример класса Java SE 5:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 public   class  JustATest {
   private   static   final   int  intNumbers[] =  new   int [] {- 129 , - 128 ,  127 ,  128 };
  
   public   static   void  main(String[] args) {
     for  ( int  i : intNumbers) {
      Integer i1 = i;
      Integer i2 = i;
      System.out.println("i = " + i + ": " + (i1 == i2));
    }
  }
}

результат работы:
Код: plaintext
1.
2.
3.
4.
i = -129: false
i = -128:  true 
i = 127:  true 
i = 128: false

вопрос: почему? :)
...
Рейтинг: 0 / 0
autoboxing: простая но полезная головоломка
    #33495960
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
грсв
....
вопрос: почему? :)

Засада, однако!
Надо полагать, проблема связана с особенностью реализации класса - оболочки
Integer.
Чтобы каждый раз не плодить массу int объектов и не засорять кучу (и не
тратить ресурсы процессора), был создан статический класс
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 private   static   class  IntegerCache {
  private  IntegerCache(){}

  static   final  Integer cache[] =  new  Integer[-(- 128 ) +  127  +  1 ];

  static  {
      for ( int  i =  0 ; i < cache.length; i++)
  cache[i] =  new  Integer(i -  128 );
 }
    }

....в котором, как видим, "сразу" создавалось 256 Integer объектов со
значениями int от -128 до 127.
И в дальнейшем, если нужно упаковать int - значение, просто проверяется: а
не входит ли оно в указанный диапазон. Если входит - то в качестве объекта
просто возвращается ссылка на объект IntegerCache.cache плюс смещение,
равное значению int, если не входит - увы, создаем новый объект Integer:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
     public   static  Integer valueOf( int  i) {
  final   int  offset =  128 ;
  if  (i >= - 128  && i <=  127 ) { // must cache
      return  IntegerCache.cache[i + offset];
 }
         return   new  Integer(i);
    }


Однако!
2 грсв: респект!

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
autoboxing: простая но полезная головоломка
    #33495961
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. упаковка маленьких чисел работает быстрее?
Я давно об этом подозревал!

Теперь жду подтверждения подозрения, что отрицательные числа занимают в
памяти меньше места, чем положительные.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
autoboxing: простая но полезная головоломка
    #33496221
грсв
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
более того, кэшируются не только Integer, но и все целочисленные
(Byte, Short, Long) для диапазона -128 ... 127.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / autoboxing: простая но полезная головоломка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]