Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Это - вопрос выравнивания памяти. 4-байтовые переменные работают быстрее, чем 2-байтовые. Это - причина, почему необходимо использовать интервал вместо байта или короткий для счетчиков и т.п..
необходимо использовать 2-байтовые переменные только, когда память является большим беспокойством, чем скорость. И это - причина, почему символ (который является Unicode в.NET) берет два байта вместо четыре.
приблизительно boolean
Большинство других ответов понимает его превратно - выравнивание и скорость состоят в том, почему программист должен придерживаться интервала для счетчиков цикла, не, почему компилятор может заставить байт быть 4 байта шириной. Все Ваши обоснования, на самом деле, относятся к байту и короткий, а также булев.
В C#, по крайней мере, bool (или Система. Булевская переменная), встроенная структура 1 байт шириной, которая может быть автоматически упакована, таким образом, у Вас есть объект (которому нужны два слова памяти, которые будут представлены, по крайней мере, т.е. 8/16 байта на средах на 32/64 бита соответственно), с полем (по крайней мере один байт) плюс одно слово памяти для указания на него, т.е. всего по крайней мере 13/25 байта.
Это - действительно 1-я запись Google на "типах примитивов C#". http://msdn.microsoft.com/en-us/library/ms228360 (По сравнению с 80) .aspx
Также заключенная в кавычки ссылка ( http://geekswithblogs.net/cwilliams/archive/2005/09/18/54271.aspx ) также указывает, что булевская переменная, по стандарту CLI, берет 1 байт.
На самом деле, однако, единственное место, где это видимо, находится на массивах булевских переменных - n, булевские переменные взяли бы n байты. В других случаях одна булевская переменная может взять 4 байта.
приблизительно char
char
составляют два байта, потому что, когда поддержка интернационализации требуется, использование двухбайтовых символов внутренне является самой безопасной ставкой. Это не связано непосредственно с желанием поддерживать Unicode, но с выбором придерживаться UTF-16 и к Основной Многоязычной Плоскости. В Java и C#, можно предположить все время, что один логический символ вписывается в переменную символа типа.
Поэтому в 32-разрядной среде, ЦП может обработать 32-разрядные значения, более быстрые, чем 8-разрядные или 16-разрядные значения, таким образом, это - компромисс скорости/размера. Если необходимо сохранить память, и Вы имеете большое количество bools, просто используете uint с и сохраняете Ваши булевские переменные как биты 4 байтов uint с. Символы 2 байта шириной, так как они хранят 16-разрядные символы Unicode.
Независимо от незначительных различий в устройстве хранения данных памяти с помощью булевской переменной для истинного/ложного да/нет значения важны для разработчиков (включая себя, когда необходимо пересмотреть код год спустя), потому что это более точно отражает намерение. Создание Вашего более понятного кода намного более важно, чем сохранение двух байтов.
Создание Вашего кода более точно отразить Ваше намерение также уменьшает вероятность, что некоторая оптимизация компилятора будет иметь отрицательный эффект. Этот совет превышает платформы и компиляторы.
Необходимо также использовать булевскую переменную, чтобы помочь написать удобный в сопровождении код. Если я гляжу на код, видя, что что-то - булевская переменная, больше затем стоит сбережений памяти, чтобы выяснить что Ваш символ использования как булевские переменные.
Я нашел это: "На самом деле булевская переменная составляет 4 байта, не 2. Причина состоит в том, что это - то, что CLR поддерживает для булевской переменной. Я думаю, что это - то, что это делает, потому что 32 битовых значения намного более эффективны управлять, таким образом, компромисс времени/пространства, в целом, стоит того. Необходимо использовать класс битовый вектора (забудьте, где это), если необходимо создать затор набор битов вместе..."
Это записано Paul Wick в http://geekswithblogs.net/cwilliams/archive/2005/09/18/54271.aspx
В первую очередь, необходимо ли использовать профилировщика для определения, где у Вас есть проблема памяти, по моему скромному мнению.
Память является только беспокойством, если у Вас есть большой массив битов, в этом случае можно использовать Систему. Наборы. Класс BitArray.
Потому что Windows и.Net использовали Unicode (UTF 16) начиная с начала как их внутренний набор символов. UTF 16 использует 2 байта за символ или пара 2-байтовых слов на символ, но только если необходимый, как это переменная ширина, кодирующая .
"Для символов в Основной многоязычной плоскости (BMP) получающееся кодирование является единственным 16-разрядным словом. Для символов в других плоскостях кодирование приведет к паре 16-разрядных слов"
, Мое предположение относительно булевских переменных было бы, они - четыре байта, поскольку регистр по умолчанию составляет 32 бита, и это было бы минимальным размером.Net, мог сделать логическую операцию на эффективно, если использование битовых операций.