Java Object Persistance - PullRequest
       3

Java Object Persistance

0 голосов
/ 27 сентября 2018

Я пытаюсь написать код с меньшим количеством строк без потери эффективности обработки.Рассмотрим следующий код:

JSONArray arr = new JSONArray();
for(i = 0; i < 10; i++){
    JSONObject main = = new JSONObject();
    main.put("RedApples", i);
    main.put("GreenApples", i);
    arr.add(main);
}

Теперь мы знаем, что это плохой код, поскольку JSONObject объявлен внутри цикла, поэтому вы объявите 10 различных объектов JSONObjects, которые остаются в памяти до тех пор, пока код не будет завершен.Мы должны объявить JSONObject вне массива и просто установить его внутри цикла.

А что насчет функций?Если внутри функции объявлен JSONObject, и эта функция вызывается 10 раз, будет ли она содержать все 10 в памяти или память полностью выгружается после завершения функции?Я использую это внутри сервлета.Я пытался найти это, но трудно найти, что происходит внутри функции, по сравнению с остальной частью сервлета.

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

так что вы объявите 10 различных объектов int, которые остаются в памяти до завершения кода

Нет, Java работает не так.Прежде всего, переменные примитивного типа, такие как int, не являются объектами.Я не знаю, что именно вы подразумеваете под "пока код не будет завершен", но переменная int, которую вы объявляете внутри цикла, не останется в памяти за пределами тела цикла.

Объявление переменной вне цикла будет очень мало влиять на эффективность или использование памяти.

Обратите внимание, что вы также можете написать свой цикл без этой переменной:

for(i = 0; i < 10; i++){
    setApples(i * 5);
}

Но даже этона практике он будет почти таким же, как ваш исходный код.

Обычно не стоит беспокоиться о таких микрооптимизациях, как эти.JVM намного умнее, чем понимают большинство программистов, и содержит множество сложных оптимизаций для обеспечения быстрого выполнения кода.

0 голосов
/ 28 сентября 2018

Прежде всего то, что вы пытаетесь сделать здесь, называется «преждевременная оптимизация».Это написание кода с некоторой идеей эффективности, а не написание понятного, простого кода.Как правило, это приводит к тому, что код становится сложнее для чтения и обслуживания, и в большинстве случаев он действительно не повышает эффективность программы.

[Если вы хотите оптимизировать, сначала проанализируйте, используя хороший профилировщик, и только потом запускайтечтобы изменить код в местах, которые вы нашли горячими точками.]

Отвечая на новый пример кода с помощью JSONObject:

В результате вам потребуется JSONArray, содержащий 10 различных JSONObjects, которые нене существует заранее.Нет никакого способа избежать создания этих 10 JSONObjects, и это именно то, что делает ваш пример кода.Если вы просто создадите один JSONObject вне цикла и установите для его полей разные значения при каждой итерации цикла, вы получите в итоге JSONArray, содержащий в 10 раз идентичный JSONObject со значениями полей из последней итерации, как и все вызовы setXXX()просто изменит один созданный вами объект, и последний набор победит.Если вы хотите, чтобы 10 JSONObjects различались по значениям полей, вам нужно 10 экземпляров, поскольку один экземпляр может содержать только один набор значений, независимо от того, как часто вы добавляете его в какой-либо список или массив.

0 голосов
/ 27 сентября 2018

Вы смешали несколько терминов здесь.В вашем примере кода вы не создаете объект, вы объявляете переменную примитивного типа int.Эта переменная создается в стеке.Каждая переменная имеет область видимости, которая в данном случае является телом цикла.Ожидается, что значение переменной будет действительным только в ее области, поэтому, когда каждая итерация заканчивается, переменная больше не используется (ее память может быть восстановлена ​​и использована для других целей).

То же самое верно для методов -они объявляют область действия, в которой их объявленная переменная действительна.Когда функция возвращается, объявленные переменные больше не используются, и их память может быть восстановлена.

Для получения дополнительной информации проверьте Локальные переменные и область действия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...