Перейти к содержимому

Как проверить long на null java

  • автор:

Как проверить что в переменную передано null?

вот что значит учится ночью ) я в тесте получал npe вот и не проверяло на нулл сначала проверим обЪект на нулл, а потом с ним работаем, а я наоборот сделал вот правильно как :

 Integer sum = 0; if (number != null) < String string = Integer.toString(number); for (int i = 0; i < string.length(); i++) < sum += Integer.parseInt(String.valueOf(string.charAt(i))); >return sum; > else

Отслеживать
ответ дан 22 дек 2020 в 0:29
Sergiej Koczergin Sergiej Koczergin
11 3 3 бронзовых знака

Вот так будет правильней, без конвертации в строку и обратно и c использованием примитивного int .

public static int sumDigits(int number) < if (number == null) < return -1; >int sum = 0; while (number > 0) < int remain = number % 10; sum += remain; number = (number - remain) / 10; >return sum; > 

Отслеживать
ответ дан 22 дек 2020 в 7:35
Circassian Circassian
2,215 5 5 серебряных знаков 19 19 бронзовых знаков

  • java
  • null
    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.3.2953

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Как проверить на null java

Для проверки на null в Java вы можете использовать оператор сравнения == :

Object obj = null; if (obj == null)  // ваш код. > 

Вы также можете использовать метод Objects.isNull() из класса java.util.Objects , который возвращает true , если переданный ему аргумент является null :

Object obj = null; if (Objects.isNull(obj))  // ваш код. > 

Маленькие хитрости Java

Я уже достаточно много лет занимаюсь разработкой на java и повидал довольно много чужого кода. Как это не странно, но постоянно от одного проекта к другому я вижу одни и те же проблемы. Этот топик — попытка ликбеза в наиболее часто используемых конструкциях языка. Часть описанного — это довольно банальные вещи, тем не менее, как показывает мой опыт, все эти банальности до сих пор актуальны. Надеюсь, статья пригодится многим java программистам. Итак, поехали:

new vs valueOf
//медленно Integer i = new Integer(100); Long l = new Long(100); String s = new String("A"); //быстро Integer i = Integer.valueOf(100); Long l = 100L;//это тоже самое что Long.valueOf(100L); String s = "A";

Старайтесь всегда использовать метод valueOf вместо конструктора в стандартных классах оболочках примитивных типов, кроме случаев, когда вам нужно конкретно выделить память под новое значение. Это связано с тем, что все они, кроме чисел с плавающей точкой, от Byte до Long имеют кеш. По умолчанию этот кеш содержит значения от -128 до 127. Следовательно, если ваше значение попадает в этот диапазон, то значение вернется из кеша. Значение из кеша достается в 3.5 раза быстрее чем при использовании конструктора + экономия памяти. Помимо этого, наиболее часто используемые значения могут также быть закэшированы компилятором и виртуальной машиной. В случае, если ваше приложение очень часто использует целые типы, можно увеличить кеш для Integer через системное свойство «java.lang.Integer.IntegerCache.high», а так же через параметр виртуальной машины -XX:AutoBoxCacheMax=.

+ vs append
//медленно String[] fields = new String[] ; String s = ""; for (int i = 0; i < fields.length; i++) < s = s + fields[i]; >return s; //быстро String[] fields = new String[] ; StringBuilder s = new StringBuilder(); for (int i = 0; i < fields.length; i++) < s.append(fields[i]); >return s.toString();

Никогда не используйте операции конкатенации (оператор +) строки в цикле, особенно если таких операций у вас много, это может очень существенно снизить производительность. Все это происходит потому, что в приведенном выше примере «s = s + fileds[i]» выполняется целых 3 операции: создается StringBuilder на основе строки s, вызывается метод конкатенации append, после конкатенации вызывается метод toString (выглядит так: s = new StringBuilder(s).append(fields[i]).toString();). Целых 3 операции вместо одной! Помимо этого каждый результат s + fileds[i] будет занимать память в куче, как отдельная строка.

StringBuilder vs StringBuffer

Всегда ипользуйте StringBuilder, кроме случаев, когда вам необходимо использовать конкретно StringBuffer, так как в StringBuilder нету синхронизированных методов в отличие от StringBuffer и следовательно производительность будет выше, хоть и не значительно.

instanceOf

Старайтесь как можно реже использовать оператор instanceOf. Это один из самых медленных java операторов и подходить к его использованию нужно осторожно. Имейте в виду — чаще всего наличие этого оператора в коде означает непонимание принципов ООП, нежели попытка реализовать некий паттерн. Почти всегда полиморфизм способен помочь избавится от этого оператора.
P. S. Многие в комментариях аппелируют к «Это один из самых медленных java операторов». Это действительно так. Конечно, не совсем корректно сравнивать операторы языка по производительности, так как они выполняют абсолютно разные задачи, но, тем не менее, механизм работы instanceOf гораздо сложнее, например, оператора ‘*’.

Generics
//плохо List a = new ArrayList(); //хорошо List a = new ArrayList();

Всегда старайтесь типизировать ваши коллекции, методы и классы. Это избавляет сразу от 2-х потенциальных проблем: приведение типов и ошибок выполнения. Также назначение таких коллекций легче воспринимать. Особенно часто этим пренебрегают мои американо-индусские коллеги. Если же ваша коллекция должна содержать обьекты разных типов — используйте , а еще лучше тогда зная общий класс/интерфейс для всех обьектов вам не прийдется делать приведение типов и применять оператор instanceOf.

Interface for Consts
//плохо interface A < public static final String A = "a"; >//хорошо final class A

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

Override

Старайтесь использовать Override аннотацию для методов, которые переопределяют методы супер классов. Это позволяет сразу избежать опечаток и повышает читаемость кода (позволяет сразу понять, что у супер класса есть такой же метод не открывая родительский класс).

null vs empty

Всегда старайтесь в методах вашей бизнес логики возвращать пустые коллекции вместо null значений, это избавляет от лишних null-проверок и делает код чище. Для этого в классе Collections есть несколько замечательных методов:

Collections.emptyList(); Collections.emptyMap(); Collections.emptySet();

В комментариях просят уточнить вариант применения. Типичный случай:

 Set docs = getDocuments(plan); for (Document doc : docs) < sendMessage(doc.getOwner()); >public static Set getDocuments(Plan plan) < //some logic if (isDoSomethingOk() && hasAccessToDocuments(user)) < return plan.getDocuments(); >return Collections.emptySet(); > 

Конечно, это не значит что эта техника должна быть применена абсолютно везде. Скажем, если Вы сериализируете обьекты, то тут лучше подойдут null значения. Собственно — «в методах вашей бизнес логики» как раз и означает применение в логике, а не в модели.

Преобразование чисел
//медленно int a = 12; String s = a + ""; //быстро int a = 12; String s = String.valueOf(a); 

Ситуация очень схожа с конкатенацией строк.

Выводы

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

Как проверить long на null java

Давайте рассмотрим на практике, создав класс с примерами объектов, которые будут использовать наш класс:

 public class InstrumentationExample < public static void printObjectSize(Object object) < System.out.println("Object type: " + object.getClass() + ", size: " + InstrumentationAgent.getObjectSize(object) + " bytes"); >public static void main(String[] arguments) < String emptyString = ""; String string = "Estimating Object Size Using Instrumentation"; String[] stringArray = < emptyString, string, "com.baeldung" >; String[] anotherStringArray = new String[100]; List stringList = new ArrayList<>(); StringBuilder stringBuilder = new StringBuilder(100); int maxIntPrimitive = Integer.MAX_VALUE; int minIntPrimitive = Integer.MIN_VALUE; Integer maxInteger = Integer.MAX_VALUE; Integer minInteger = Integer.MIN_VALUE; long zeroLong = 0L; double zeroDouble = 0.0; boolean falseBoolean = false; Object object = new Object(); class EmptyClass < >EmptyClass emptyClass = new EmptyClass(); class StringClass < public String s; >StringClass stringClass = new StringClass(); printObjectSize(emptyString); printObjectSize(string); printObjectSize(stringArray); printObjectSize(anotherStringArray); printObjectSize(stringList); printObjectSize(stringBuilder); printObjectSize(maxIntPrimitive); printObjectSize(minIntPrimitive); printObjectSize(maxInteger); printObjectSize(minInteger); printObjectSize(zeroLong); printObjectSize(zeroDouble); printObjectSize(falseBoolean); printObjectSize(Day.TUESDAY); printObjectSize(object); printObjectSize(emptyClass); printObjectSize(stringClass); > public enum Day < MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY >> 

Чтобы это сработало, нам необходимо включить параметр -javaagent с путем к нашему JAR-файлу при запуске приложения:

 VM Options: -javaagent:"path_to_agent_directory\InstrumentationAgent.jar" 

Результат работы нашего класса покажет нам приблизительные размеры объектов:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *