Контакты
Местоположение
Россия, Новосибирская обл., Новосибирск

Наибольший вклад в теги

Все теги (9)

Лучшие ответы пользователя

Все ответы (10)
  • @Volatile, кэшировние?

    Erik_Mironov
    @Erik_Mironov
    CPU имеют кэши разного уровня L1, L2, L3. Каждый поток(а также ядро процессора) имеет собственный кэш. Эти кэши хранят минимальный набор оперативной памяти для обеспечения производительности. Если переменная определена как volatile, то все операции записи над ней сразу же отражаются в памяти и не кэшируются. У потоков нет локальной копии памяти и часть данных которую поток читает / записывает может быть из кэша, а не из основной памяти, а поэтому когда один поток изменяет какую-либо переменную, то другой поток не может увидеть изменения над ней. Грубо говоря, для таких случаев и нужен volatile. Фух, объяснил как мог, возможно кто-то объяснит более подробно.

    5fec4c344c127654024248.png

    Можете почитать про модель памяти в Java
    https://docs.oracle.com/javase/specs/jls/se7/html/...
    Ответ написан
  • Зачем json считывать через Scanner?

    Erik_Mironov
    @Erik_Mironov
    Зачем считывать файл через Scanner?


    С помощью класса Scanner вы можете читать данные из файла точно так же, как и с помощью BufferedReader'а, BufferedInputStream'а и других классов, способных читать файловые данные. Почему же здесь использовали Scanner известно только тому, кто написал этот класс, потому что есть более подходящие классы для подобных операций.

    Зачем использовать цикл? нельзя взять и всю прочитать без цикла?


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

    Зачем строке происваевать данные файла?


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

    Зачем указывать тип объекта в конце?


    Метод fromJson десериализует JSON, прочитанный из Reader'а (в данном случае из строки) в объект класса, указанного вторым аргументом.
    Ссылочка на спек класса
    https://www.javadoc.io/doc/com.google.code.gson/gs...
    Ответ написан
  • Добавление строки к строке до определённого (бесконечно большого) числа и нахождение в ней символа 'а'. Как решить?

    Erik_Mironov
    @Erik_Mironov
    Вам не нужно конкатенировать миллиарды символов, вы можете посчитать количество повторов в исходной строке, а затем умножить это число на количество полных повторов строки + остаток
    static long repeatedString(String s, long n) {
            /* Кол-во повторов в исходной строке */
            int rep = (int) s.toLowerCase()
                    .chars()
                    .filter(c -> c == 'a').count();
    
            /* Кол-во циклов, в которых исходная строка будет полностью скопирована */
            long cycles = (n / s.length()) - 1;
    
            /* Кол-во повторов в остаточной строке, которой не хватило на полный цикл */
            int remainder = (int) s.toLowerCase()
                    .substring(0, (int) n % s.length())
                    .chars()
                    .filter(c -> c == 'a').count();
    
            return rep * cycles + remainder + rep;
    }
    Ответ написан
  • Разные методы для каждого потока или synchronized?

    Erik_Mironov
    @Erik_Mironov Автор вопроса
    Я, похоже задал очень глупый вопрос и только сейчас сам понял что он глупый, ведь использование общего ресурса в разных методах не освобождает от необходимости использования synchronized, а если общего ресурса нет, то и synchronized не нужен.
    Ответ написан
  • Как работает рекурсия в Java?

    Erik_Mironov
    @Erik_Mironov
    Когда вы вызываете метод из другого метода, то вызывающий метод приостанавливается в частично завершенном состоянии. Все значения переменных вызывающей функции физически сохраняются в памяти. Метод, вызванный вызывающим его методом размещается поверх вызывающего метода и происходит все то же самое, пока соблюдается рекурсивный случай (условие, при котором метод вызывает сам себя). Когда происходит базовый случай (условие, при котором рекурсия должна быть остановлена), методы по очереди возвращают управление вызвавшему их методу, вплоть до полного завершения исходного (самого нижнего) метода.
    Ответ написан