• LinkedList vs ArrayList разовая вставка и вставка в цикле в середину?

    vabka
    @vabka
    Токсичный шарпист
    Закиньте в список заранее миллион элементов, а потом вставляйте элементы в начало - сразу будет видно эффект
    Ответ написан
    2 комментария
  • LinkedHashMap vs HashMap какие отличия, что дает изменение значения accesOrder?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Главным отличием является сохранение порядка добавления элементов. Всё.
    Ответ написан
    Комментировать
  • HashMap коллизия?

    zagayevskiy
    @zagayevskiy Куратор тега Java
    Android developer at Yandex
    Если речь про стандартный HashMap, то там, конечно, всё работает из коробки. Там реализован, условно, метод цепочек. Но, на самом деле, там строятся не цепочки, a сбалансированные деревья(rb-tree).

    Если речь про самописную реализацию, то в ней, конечно, всё надо руками писать. В каждой ячейке - список, или каким-то образом искать пустую ячейку.
    Ответ написан
    2 комментария
  • HashMap коллизия?

    @gsaw
    Хэш код нужен только для распределения ключей по группам (спискам). А поиск осуществляется простым перебором по списку и сравнением equal.

    То есть создаёте к примеру два списка. При добавлении объекты с четным хэшем кладете в первый список, с нечётным в другой. Так же и поиск. Если хэш чётный перебираете первый список, нечётный второй.

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

    Или вопроса не понял.
    Ответ написан
    Комментировать
  • Как вставить «+» в TextInputEditText на постоянной основе при набора номера?

    TequilaOne
    @TequilaOne
    Ну так добавьте этот символ «+» в поле вашего TextInputEditText после инициализации и собственно перед показом его пользователю.
    Либо слева от TextInputEditText, в отдельном TextView пропишите этот символ "+" , для информирования пользователя, что писать его уже не нужно, а далее, сделайте простую валидацию, контролируя правильность введенного номера, или убирая оттуда лишний "+" и т.д.
    Ответ написан
    Комментировать
  • Function вызов inline и константы?

    zagayevskiy
    @zagayevskiy Куратор тега Kotlin
    Android developer at Yandex
    На каком-то бытовом уровне схоже, конечно. Типа, и то, и другое встраивается. Но различия, конечно есть.
    Есть ситуации, когда компилятор обязан встроить inline функцию, потому что другого ему не позволит JVM, например:
    inline fun <reified T> f() {
        print(T::class.java.name)
    }

    reified дженерики поддерживаются только для inline функций, потому что в JVM на этапе выполнения никаких дженериков нет, и поэтому данную функцию можно использовать только с известным на момент компиляции типом. Тело функции встроится в место вызова и всё хорошо.

    А вот если у тебя просто inline fun, вне зависимости от того, есть ли у неё функциональный параметр, то уже возможны варианты. При обычном вызове тело функции будет встроено, и на этом основаны всякие экстешны, они не просаживают произволительность. Но также ты можешь взять и передать эту функцию в другую в качестве параметра, и в этом случае ей просто некуда встраиваться:
    inline fun f() { ... }
    fun g(p: ()-> Unit) {
        p()
    }
    
    fun main() {
        f() // заинлайнена
        g(::f) // не заинлайнена
    }


    Если хочешь разобраться - смотри декомпилированный байткод, там всё есть. Ещё почитай про модификаторы noinline, crossinline.
    Ответ написан
    Комментировать
  • Produce{} vs iterator{}?

    zagayevskiy
    @zagayevskiy Куратор тега Kotlin
    Android developer at Yandex
    Ничего, iterator это верхнеуровневый билдер. Ты код-то пробовал писать, или просто читаешь эту лабуду?
    iterator {
        yield(1)
        yield(2)
        yield(3)
    }.forEach { i -> print(i) }
    Ответ написан
    1 комментарий
  • CoroutineScope(Dispatchers.Main).launch{} vs CoroutineScope(Dispatchers.Main).launch(DispathersMain){}?

    zagayevskiy
    @zagayevskiy Куратор тега Kotlin
    Android developer at Yandex
    1) имя корутины нужно только для дебага

    2) никакого конструктора лонча нет, это просто функция на CoroutineScope. Разницы между данными примерами нет. Передать диспатчер можно в случае, если ты хочешь лончить в другой диспатчер.

    3) это вроде повтор второго вопроса. Разверну немного. Если в CoroutineScope передать диспатчер(D), то все лончи без дополнительных диспатчеров будут происходить на диспатчере D. A если не передавать, то все такие лончи будут происходить на Dispatchers.Default, то есть для андроида - на диспатчере, у которого несколько потоков, и на котором можно выполнять тяжёлые вычисления.
    Лончи, в которые передан диспатчер, будут выполнены на этом диспатчере.

    Как-то так. Это на самом деле сложная и запутанная тема. За внешней простотой скрывается очень сложная машинерия. Ты пока вскрыл довольно простые вещи.
    Ответ написан
    Комментировать
  • PendingResuld vs BroadcastReceiver?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    Я тебе так скажу. Сервис тебе понадобится с очень маленький вероятностью. В основном сейчас это проигрывание звуков и аналогичное, в фоне, с флажком foreground и нотификашкой. Такой сервис никуда особо передавать данные не будет. Если есть ui, проще просто забиндить его и всё.
    Broadcast receiver в 2021 году нужен только для межпроцессорного взаимодействия, а не внутри одного приложения, это точно.

    Upd не-foreground сервис в современных андроидах, после ухода приложения в фон, живёт очень-очень недолго. Секунды.
    Ответ написан
    2 комментария
  • Что значит однородные и неоднородные данные? Подчеркивающие структуры данных?

    @koperagen
    Ты набрел на сайт машинного перевода ответов со стаковерфлоу.
    В оригинале так:

    1. Arrays store homogeneous data. Collections store both homogeneous as well as heterogeneous data.
    По этим ключевым словам (java homogeneous heterogeneous data) гуглится такой ответ https://stackoverflow.com/questions/36700490/what-...

    2. In Arrays, there are no underlining data structures, whereas Collections have underlining data structures.
    Думаю тут опечатка, имеется ввиду underlying, т.е. "коллекции основываются на структурах данных". Для Map это, например, хэш массив, дерево, trie, для List связный список, массив и т.д.
    Ответ написан
    1 комментарий
  • Нужно отписываться от наблюдателей и удалять ссылки при уничтожении активити, или все делаетcя само?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    Да, в onDestroy лучше отписать всё, что подписано к этому моменту. Нужно освобождения все ресурсы, которые потенциально живут дольше, чем активити.
    Ответ написан
    5 комментариев
  • @Volatile, кэшировние?

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

    5fec4c344c127654024248.png

    Можете почитать про модель памяти в Java
    https://docs.oracle.com/javase/specs/jls/se7/html/...
    Ответ написан
    Комментировать
  • Почему при увеличении числа в корутинах, число иногда имеет другое значение?

    @koperagen
    В комментарии обсудили (: Лог выводится до того, как все корутины отработают увеличение счетчика
    Ответ написан
    Комментировать
  • Как сделать recycler view слайдер?

    @terminator-light
    тут есть 2 варианта: либо использовать RecyclerView и приаттачить к нему PagerSnapHelper,
    либо ViewPager2
    UPD:
    layoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false);
        recyclerView.setLayoutManager(layoutManager);
        PagerSnapHelper snapHelper = new PagerSnapHelper();
        snapHelper.attachToRecyclerView(recyclerView);
    Ответ написан
    4 комментария
  • Нужно ли разбираться в старых версиях библиотек, которые имеют deprecated функции?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    Нет, не нужно. Вьюпейджер вообще больше не нужен. Его функции отлично выполняет ресайклервью.
    Ответ написан
    2 комментария
  • Нужно ли разбираться в старых версиях библиотек, которые имеют deprecated функции?

    DMGarikk
    @DMGarikk
    Lead Software Developer
    1) знать как они работают - желательно, устаревший код всеравно вам встретится в жизни
    2) применять в новых проектах и новых работах такие библиотеки и модули - крайне не желательно
    Ответ написан
    1 комментарий
  • Насколько сильно отличается Ios от Android и когда нужно начинать изучать вторую платформу?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    Сильно отличаются. Никаких активити в айос нет. Multiplatform это не какой-нибудь Xamarin, чтобы взять и начать писать. Там высокий порог входа и куча проблем. И различия в средах разработки там вообще не на первом месте. С твои уровнем знаний не стоит туда соваться.
    Вторую платформу можно начать изучать, когда ты перестанешь плавать в простейших вопросах первой.
    Ответ написан
    4 комментария
  • Объясните пожалуйста getApplicationContext(), getContext(), getBaseContext()?

    zagayevskiy
    @zagayevskiy Куратор тега Android
    Android developer at Yandex
    getApplicationContext это метод Context'a, возвращающий класс приложения. Если ты расширишь Application, и укажешь этот класс в манифесте, то getApplicationContext вернёт объект этого класса.

    getBaseContext() это метод ContextWrapper'a, который возвращает оборачиваемый Context. ContextWrapper оборачивает произвольный контекст, и проксирует его методы, чтобы как-то изменить поведение.

    getContext() это не метод какого-либо контекста. Это может быть метод View, тогда он вернёт контекст, с которым создана вьюха. Например, Activity или ContextThemeWrapper.
    Или это может быть метод фрагмента, тогда он вернёт активити, к которой приаттачен фрагмент в данный момент.

    Вывод:
    getApplicationContext() когда нужно получить доступ к классу Application, например для реализации графа DI.
    getBaseContext() когда нужно получить доступ к базовому контексту(очень-очень редко. Когда до этого дойдёт, ты, скорее всего, поймёшь, что тебе нужно).
    getContext() когда нужен контекст, но есть только фрагмент/вьюха.

    P.S. в вопросе процитирована какая-то белиберда. Не читай ты книги на русском по андроиду.
    Ответ написан
    Комментировать
  • Зачем нужен Dependency Injection в Android разработке?

    artemgapchenko
    @artemgapchenko
    Начать неплохо бы с понимания того, что такое DI. Обратимся к википедии:

    Внедрение зависимости (англ. Dependency injection, DI) — процесс предоставления внешней зависимости программному компоненту.

    Если выражаться не канцеляритом, а обычным русским языком, то DI - это когда вы своему компоненту (например, классу) предоставляете нужные для него зависимости извне, а не создаете их сами в конструкторе, или через инициализацию в месте объявления поля. То есть не так:

    public class Api {
    	....
    	private final HttpClient client = new OkClient();
    }

    А, например, так:

    public class Api {
    	....
    	private final HttpClient client;
    
    	public Api(@NonNull HttpClient client) {
    		this.client = client;
    	}
    }


    И что нам это даёт?

    Ну, очевидно, нам теперь проще менять зависимости. Нужна вам другая реализация абстрактного класса HttpClient - взяли, и передали её через конструктор, или через метод-setter. В случае с первым куском кода, вам пришлось бы ещё и класс Api переписывать, что в случаях, отличных от тривиальных, может привести к ошибкам. Получается, что ваш класс теперь закрыт от изменений (смотрим Open/Closed Principle).

    Окей, а на практике-то какие бенефиты?

    Во-первых, вы теперь можете написать инициализацию вашей программы через конфигурационные файлы. Скажем, на старте будет читаться простенький текстовый файл, который определяет, какой httpclient использовать, какие настройки доступа к бд применять и так далее, и, исходя из этого, будут определяться зависимости.
    Во-вторых, вам теперь существенно проще писать тесты. Написали вы, скажем, какой-нибудь парсер, который принимает InputStream, содержащий в себе данные json-объекта, как-то хитро его парсит, и выдаёт вам объект вашей бизнес-модели. В приложении этот парсер будет принимать на вход реализацию InputStream'а, которая берёт данные из сети, а в тестах - реализацию, которая просто читает файл с диска (потому что тесты должны выполняться часто и быстро, и ваша задача в тесте - протестировать ваш парсер, а не скорость сетевого соединения).

    Вот, в общем-то, и всё. А Dagger - это просто библиотека, которая автоматизирует ручное внедрение зависимостей, равно как и другие DI-библиотеки.

    P.S. В некоторых случаях чрезмерное увлечение DI может привести к нежелательным эффектам, вроде чрезмерного усложнения кода, поэтому внедряйте аккуратно. Понимание приходит с опытом.
    Ответ написан
    Комментировать
  • Android developer, как составить резюме по поиску первой работы и могу ли рассчитывать на зп?

    @WaterSmith
    Android-разработчик. Java, Kotlin
    1) Средне-уверенное владение android studio( Весь функционал я не знаю, проще опишу что я НЕ пробовал:
    ChipGroup,Chip,ChekBox,RadioButton,RadioGroup,ToggleButton,WebView,VideoView,CalendarView,RatingBar,SearchView,
    TextureView,SurfaceView, Hor/Ver Divider, Guideline,TableRow, ViewPager,NestedScrollView,TabLayout,TabItem,ViewStub,AdView,MapView,TabHost, так же не разбираюсь в анимациях.
    )

    Вот всё что вы перечислили, это не "android studio", это Android SDK
    Не путайте, ибо если вы так скажете на собеседовании, ИМХО это будет серьезный минус к впечатлению о вас.
    Ответ написан
    3 комментария