Как сделать счетчик в java
Как реализовать счетчик объектов в Java
интервьюер спросил меня об этом
как вы можете реализовать класс Foo, где вы сможете рассчитывать экземпляры этого класса. Есть больше потоков, которые создают экземпляр класса Foo.
я ответил, что со следующим кодом
Она снова спросила меня, что
если поток заканчивается, счетчик должен быть уменьшен, как вы можете это сделать это?
Я не ответил на этот вопрос.
у меня еще нет решения, можете ли вы объяснить это, пожалуйста?
3 ответов
вы могли бы обернуть нити Runnable внутри Runnable это уменьшит счетчик:
таким образом, Вы можете передать этот ThreadFactory в пул потоков, например, или вы можете использовать его самостоятельно, когда хотите построить нить: (new FooCountingThreadFactory()).newThread(job);
в любом случае, все еще есть проблема с этим подходом: если поток создает экземпляры Foo и сохраняет их в глобальной области (читать: static fields), то эти экземпляры будут все еще живы после того, как поток умер, и счетчик все равно будет уменьшен до 0.
делая то же самое в обратном направлении.
создать decrementCount() метод Foo класс и обязательно позвоните ему перед возвращением из run() в вашей ветке.
Я полагаю, вы также можете создать новый SoftReference к вновь созданному экземпляру в конструкторе и соберите их в статическом списке.
Если вы хотите количество экземпляров, вы можете подсчитать ссылки, которые все еще живы.
таким образом, счетчик ссылок уменьшается, когда сборщик мусора выполнит свою работу.
Урок 2. Простейший счетчик.
В этом уроке мы создадим простейшее приложение в котором будут затронуты следующие темы: работа с виджетами textview и imagebutton, преобразование типов данных, обработка событий (нажатие кнопки).
После установки Android Studio (далее Студия) можно приступать к созданию своей первой программы.
Учтите, что на данный момент Студия постоянно обновляется, поэтому внешний вид окон и другие детали могут отличаться от данного примера.
В качестве языка программирования для Android используется Java. Для создания пользовательского интерфейса используется XML.
По традиции, заложенной в прошлом веке, каждый программист должен был написать «Hello World!» (Здравствуй, Мир!) в качестве первой программы. Времена меняются, и программа «Hello World!» уже встроена в среду разработки под Android. Но так как Hello World мы уже запускали в первом уроке, несколько усложним задачу — добавим на экран две кнопки увеличивающие и уменьшающие некий счетчик и собственно отобразим на форме сам счетчик.
Разобьём задачу на две части. Сначала запустим готовую программу Hello World! без написания кода и разберем её, а потом уже модифицируем под новые задачи.
Создание нового проекта
Запускаем Студию и выбираем File | New Project…. Появится диалоговое окно мастера.
Поле Application name: — понятное имя для приложения, которое будет отображаться в заголовке приложения. По умолчанию у вас уже может быть My Application. Заменим на MyCount. В принципе вы могли написать здесь и Здравствуй, мир!, но у Android есть замечательная возможность выводить нужные строки на телефонах с разными языками. Скажем, у американца на телефоне появится надпись на английском, а у русского — на русском. Поэтому в первоначальных настройках всегда используются английские варианты, а локализованные строки подготовите позже. Необходимо сразу вырабатывать привычку к правильному коду.
Поле Company Domain: служит для указания вашего сайта. По умолчанию там может появиться ваше имя как пользователя компьютера. Если сайт у вас есть, то можете ввести его адрес, либо придумайте какое-нибудь название. Введённое имя запоминается и будет автоматически подставляться в следующих новых проектах. Экономия, однако.
Поле Package name: формирует специальный Java-пакет на основе вашего имени из предыдущего поля. В Java используется перевёрнутый вариант для наименования пакетов, поэтому сначала идёт ru, а потом уже название сайта. Пакет служит для уникальной идентификации вашего приложения, когда вы будете его распространять. Если сто человек напишет сто приложений с названием «Cat», то будет непонятно, где приложение, написанное разработчиком Василием Котовым. А приложение с именем пакета ru.mydomain.cat проще найти. Обратите внимание, что Гугл в своей документации использует пакет com.example в демонстрационных целях. Если вы будете просто копировать примеры из документации и в таком виде попытаетесь выложить в Google Play, то у вас ничего не выйдет — это название зарезервировано и запрещено к использованию в магазине приложений. Кнопка Edit позволяет отредактировать подготовленный вариант. Например, вы пишете приложение на заказ и вам нужно использовать имя пакета, утверждённое заказчиком, а не ваш вариант по умолчанию.
Третье поле Project location: позволяет выбрать место на диске для создаваемого проекта.
Нажимаем на кнопку Next и переходим к следующему окну. Здесь мы выбираем типы устройств, под которые будем разрабатывать своё приложение. В большинстве случае мы будет писать для смартфонов и планшетов, поэтому оставляем флажок у первого пункта. Также вы можете писать приложения для Android TV, Android Wear и Glass (я не устанавливал необходимый SDK для гуглоочков, поэтому последний флажок у меня не доступен).
Кроме выбора типа устройств, надо выбрать минимальную версию системы, под которую будет работать приложение. До мая 2014 года предлагалось ставить поддержку Android 2.2, летом было API 15 (Android 4.0), а сейчас (декабрь 14) рекомендуют ставить API 16 (Android 4.1). Если вам нужно поддерживать старые устройства, то выберите свой вариант. Лично я предпочитаю использовать API 10 (Android 2.3.3), т.к. до сих пор иногда встречаю людей с телефонами на данной версии ОС.
Если щёлкнуть по ссылке Help me choose, то откроется окно с графиком.
Идём дальше и снова нажимаем кнопку Next.
Здесь следует выбрать внешний вид экрана приложения.
Предложенные шаблоны позволяют сэкономить время на написание стандартного кода для типичных ситуаций. Опытный разработчик может вручную написать любой из предложенных вариантов, используя первый случай Add No Activity, где никаких заготовок не будет.
Пару лет назад был только один шаблон. Список шаблонов постоянно пополняется и теперь их больше. Перечислю часть из них.
Шаблон Blank Activity предназначен для обычных телефонов. На картинке над названием шаблона вы видите приблизительный вид приложения с использованием данной заготовки. Для учебных программ в 99% подойдёт этот вариант. Практически все примеры на сайте написаны с помощью данного шаблона.
Шаблон Master/Detail Flow предназначен для планшетов с реализацией двухпанельного режима. Шаблон Fullscreen Activityможно использовать для игр, когда требуется дополнительное пространство без лишних деталей. Другие шаблоны нужны для создания приложений с гуглокартами или сервисами Google Play.
Итак, мы выбрали вариант Blank Activity и переходим к следующему окну.
Activity Name я по старой привычке (Delphi) называю обычно Form1. Title — название заголовка окна. Например можно — написать «Мой счетчик»
Ну вот, мы закончили с первоначальной настройкой. Нажимаем кнопку Finish и смотрим, что дальше будет.
А дальше студия формирует проект и создаёт необходимую структуру из различных файлов и папок. Поначалу глаза разбегаются.
В левой части среды разработки на вкладке Project появится иерархический список из папок, которые относятся к проекту.
Содержание проекта
Вкладка Project содержит две основные папки: app и Gradle Scripts. Первая папка app содержит все необходимые файлы приложения — код, ресурсы картинок и т.п. Вторая папка служит для различных настроек, управления проектом и многих других вещей.
Сейчас нас должна интересовать папка app. Раскройте её. В ней находятся три папки: manifest, java, res.
manifest
Папка manifest содержит единственный файл манифеста AndroidManifest.xml. Если вы уже раньше использовали Eclipse, то возьмите на заметку, что часть настроек из манифеста в студии была перенесена в Gradle.
В этом файле должны быть объявлены все активности, службы, приёмники и контент-провайдеры приложения. Также он должен содержать требуемые приложению разрешения. Например, если приложению требуется доступ к сети, это должно быть определено здесь. «AndroidManifest.xml» можно рассматривать, как описание для развертывания Android-приложения.
Более подробно о структуре манифеста читайте в дополнительной статье Файл AndroidManifest.xml
Папка содержит две подпапки — рабочая и для тестов. Рабочая папка имеет название вашего пакета и содержит файлы классов. Сейчас там один класс MainActivity. Папку для тестов можете не трогать.
Папка res содержит файлы ресурсов, разбитых на отдельные подпапки.
Со временем вы будет свободно ориентироваться в этих папках, пока не забивайте себе голову.
Работа с проектом — Здравствуй, Мир!
Как уже говорилось, программа Hello, World! уже встроена в любой новый проект, поэтому вам даже не нужно ничего писать. Просто нужно запустить проект и получить готовую программу!
Для изучения вам нужно открыть два файла — (скорее всего он уже открыт) и activity_main.xml (res/layout) в центральной части Студии. Если файлы не открыты, то откройте их самостоятельно двойным щелчком для редактирования (или просмотра). Таким способом вы можете открыть любой нужный вам файл.
Не будем пока изучать код, а просто нажмём на зелёный треугольник Run (Shift+F10) на панели инструментов в верхней части студии для запуска приложения.
Если вы не настроили эмулятор, значит вы не читали предыдущий урок. Настройте сначала эмулятор и запускайте проект снова.
Если всё сделали правильно, то в эмуляторе загрузится ваша программа. Поздравляю!
Итак, если программа загрузилась в эмуляторе, то увидите окно приложения с надписью Hello World. Заголовок у программы будет также Hello World. Все эти строки можно найти в файле res/values/strings.xml и отредактировать при желании.
Теперь посмотрим на код. Сначала изучим activity_main.xml.
Смотреть его можно в двух режимах — Design и Text.
Циклы в Java – как создать и прервать
Цикл — это блок команд, который выполняется снова и снова, пока соблюдается определённое условие. Повторяемый фрагмент кода называют «телом цикла». Одно выполнение тела цикла называют итерацией.
while – цикл с предусловием – сначала проверяем условие, затем выполняем тело цикла;
do… while – цикл с постусловием – сначала выполняем один раз тело цикла, затем проверяем условие и, если оно соблюдается, продолжаем;
for – цикл со счётчиком – выполняется и при каждой итерации обновляет счётчик, пока условие в объявлении цикла соблюдается (т.е. проверка условия возвращает true);
сокращенный for (в других языках известен как foreach) – перебирает массив от первого элемента до последнего и на каждой итерации выполняет тело цикла.
Суть условия цикла – проверка выражения с одной или несколькими переменными: «Пока a int a = 1;
while (a
System.out.println(a);
a++; //увеличиваем а на единицу
Если же переменная работает как счётчик цикла, а за его пределами не используется, её инициализируют прямо в условии. И тут же пишут, что с ней делать в конце каждой итерации. Всё это – в одну строку – с помощью for:
System.out.println(a);
Получаем тот же результат. Список можно было начать с нуля или с отрицательного значения – диапазон определяем сами.
Сокращенный вариант цикла for не содержит указаний ни на число повторов, ни на действия в конце шага. Цикл типа foreach используют для перебора массивов. От первого элемента нужно переходить к следующему – пока массив не кончится.
int[] ms = < 1, 2, 3, 4>; //создаем массив
int s = 0;
s *= i; //последовательно перемножаем элементы
System.out.println(s);
Вложенные циклы Java
Циклы можно вкладывать один в другой. При этом число повторов наружного и вложенных циклов умножается. Если внешний должен выполняться 5 раз и внутренний – 5, всего цикл будет выполнен 25 раз.
Выведем таблицу умножения с помощью двух массивов:
int a, b, result = 0;
for (a = 2; a
for (b = 2; b
result = a*b;
System.out.println(a+»x»+b+» = «+result);
Cоздание объектов в цикле Java
Циклы удобны, когда нужно создать и пронумеровать множество объектов. Их число бывает неизвестно заранее: объекты могут создаваться по запросу пользователя. Вот мы спросили, сколько нужно чего-то, и записали число в переменную n. Теперь создадим объекты в нужном количестве:
Something[] array = new Something[n]; //создаем массив типа “что-то” из n элементов
for(int i = 0; i
array[i] = new Something(); //создаем “что-то” и помещаем его в массив
Как выйти из цикла Java
Для выхода из цикла есть ключевые слова break — «прервать», continue — «возобновить» и return — «вернуться». Команда break переключает программу на выполнение следующих за циклом операторов. Условия прерывания цикла в Java оформляют через if-ветвление. Главное, чтобы проверка выполнялась перед основной частью тела цикла.
//после создания массива m пишем:
if (a==5) break;
System.out.println(a);
Операторы ветвления и цикла в Java часто работают вместе: запускаем цикл, а внутри него проверяем, не выполнено ли еще условие, при котором нужно прервать цикл или сделать что-то ещё.
Если использовать break во вложенном цикле, прервётся только он, а внешний продолжит выполняться.
Для досрочного прерывания итерации цикла for в Java используют continue. Когда программа до него доходит, она пропускает невыполненную часть итерации, обновляет счётчик и переходит к следующей итерации.
В конструкциях while тот же continue работает иначе: возвращает нас к проверке условия продолжения цикла. Другая команда – return – возвращает программу к месту, откуда был вызван метод, в котором цикл находится.
break Mark1; //при условии, что где-то выше стоит метка Mark1 :
Бесконечный цикл Java
Создать бесконечный цикл легко — достаточно не указывать параметры в for:
for (; 😉 <>
Сложнее извлечь из этого пользу. Обычно бесконечность цикла – критическая ошибка, которая мешает выполнению программы. Поэтому каждый цикл стоит проверять на способность корректно завершиться в нужный момент. Для этого нужно:
Советуем также посмотреть мастер-класс по созданию приложения «Погода», где рассматривается работа с циклами
Цикл — это блок команд, который выполняется снова и снова, пока соблюдается определённое условие. Повторяемый фрагмент кода называют «телом цикла». Одно выполнение тела цикла называют итерацией.
while – цикл с предусловием – сначала проверяем условие, затем выполняем тело цикла;
do… while – цикл с постусловием – сначала выполняем один раз тело цикла, затем проверяем условие и, если оно соблюдается, продолжаем;
for – цикл со счётчиком – выполняется и при каждой итерации обновляет счётчик, пока условие в объявлении цикла соблюдается (т.е. проверка условия возвращает true);
сокращенный for (в других языках известен как foreach) – перебирает массив от первого элемента до последнего и на каждой итерации выполняет тело цикла.
Суть условия цикла – проверка выражения с одной или несколькими переменными: «Пока a int a = 1;
while (a
System.out.println(a);
a++; //увеличиваем а на единицу
Если же переменная работает как счётчик цикла, а за его пределами не используется, её инициализируют прямо в условии. И тут же пишут, что с ней делать в конце каждой итерации. Всё это – в одну строку – с помощью for:
System.out.println(a);
Получаем тот же результат. Список можно было начать с нуля или с отрицательного значения – диапазон определяем сами.
Сокращенный вариант цикла for не содержит указаний ни на число повторов, ни на действия в конце шага. Цикл типа foreach используют для перебора массивов. От первого элемента нужно переходить к следующему – пока массив не кончится.
int[] ms = < 1, 2, 3, 4>; //создаем массив
int s = 0;
s *= i; //последовательно перемножаем элементы
System.out.println(s);
Вложенные циклы Java
Циклы можно вкладывать один в другой. При этом число повторов наружного и вложенных циклов умножается. Если внешний должен выполняться 5 раз и внутренний – 5, всего цикл будет выполнен 25 раз.
Выведем таблицу умножения с помощью двух массивов:
int a, b, result = 0;
for (a = 2; a
for (b = 2; b
result = a*b;
System.out.println(a+»x»+b+» = «+result);
Cоздание объектов в цикле Java
Циклы удобны, когда нужно создать и пронумеровать множество объектов. Их число бывает неизвестно заранее: объекты могут создаваться по запросу пользователя. Вот мы спросили, сколько нужно чего-то, и записали число в переменную n. Теперь создадим объекты в нужном количестве:
Something[] array = new Something[n]; //создаем массив типа “что-то” из n элементов
for(int i = 0; i
array[i] = new Something(); //создаем “что-то” и помещаем его в массив
Как выйти из цикла Java
Для выхода из цикла есть ключевые слова break — «прервать», continue — «возобновить» и return — «вернуться». Команда break переключает программу на выполнение следующих за циклом операторов. Условия прерывания цикла в Java оформляют через if-ветвление. Главное, чтобы проверка выполнялась перед основной частью тела цикла.
//после создания массива m пишем:
if (a==5) break;
System.out.println(a);
Операторы ветвления и цикла в Java часто работают вместе: запускаем цикл, а внутри него проверяем, не выполнено ли еще условие, при котором нужно прервать цикл или сделать что-то ещё.
Если использовать break во вложенном цикле, прервётся только он, а внешний продолжит выполняться.
Для досрочного прерывания итерации цикла for в Java используют continue. Когда программа до него доходит, она пропускает невыполненную часть итерации, обновляет счётчик и переходит к следующей итерации.
В конструкциях while тот же continue работает иначе: возвращает нас к проверке условия продолжения цикла. Другая команда – return – возвращает программу к месту, откуда был вызван метод, в котором цикл находится.
break Mark1; //при условии, что где-то выше стоит метка Mark1 :
Бесконечный цикл Java
Создать бесконечный цикл легко — достаточно не указывать параметры в for:
for (; 😉 <>
Сложнее извлечь из этого пользу. Обычно бесконечность цикла – критическая ошибка, которая мешает выполнению программы. Поэтому каждый цикл стоит проверять на способность корректно завершиться в нужный момент. Для этого нужно:
Советуем также посмотреть мастер-класс по созданию приложения «Погода», где рассматривается работа с циклами
Циклы в Java
Что такое циклы
Циклы с предусловием: условие выполнения определяется перед первой итерацией.
Циклы с постусловием: условие выполнения определяется после первой итерации (поэтому они всегда выполняются минимум один раз). Полезны, когда нужно выполнять некое действие, пока не реализуется некое условие: например, считывать ввод пользователя, пока он не введет слово “stop”.
Циклы со счетчиком: количество итераций определяется смоделированным счетчиком. В условии цикла задается его начальное и конечное значение. Каждую итерацию счетчик наращивается. Мы можем заранее определить количество итераций.
Эти циклы бывают полезны, когда нужно перебрать все элементы в какой-то коллекции. Циклы со счетчиком называют “циклами для. ”. “Для каждого элемента некоторой коллекции осуществить следующие действия”.
Допустимы случаи, когда выполнение цикла можно прервать до достижения его условия. Например, если у нас есть коллекция из 100 чисел и нам необходимо понять, содержит ли она отрицательные числа. Мы можем начать перебор всех чисел, используя цикл “для”. Но когда мы найдем первое отрицательное число, нам не обязательно перебирать оставшиеся числа. Мы можем прервать выполнение цикла, если его дальнейшее выполнение не имеет смысла. Подобные ситуации называют прерыванием цикла.
Безусловные циклы — циклы, которые выполняются бесконечно. Например: “Пока 1=1, печатать “1=1””. Такая программа будет выполняться, пока ее вручную не прервут.
Данные циклы тоже бывают полезны, когда используются вместе с прерыванием цикла “изнутри”. Используйте их осторожно, чтобы не спровоцировать зависание программы.
Подробнее с циклами в языке программирования Java можно познакомиться на 4-ом уровне курса JavaRush. В частности, с циклами while и for.
Циклы в Java
Как использовать циклы в языке Java. Полное руководство
Всё — от простейших конструкций до тонкостей и самых неочевидных моментов — в одной статье.
Цикл — это конструкция, которая позволяет многократно выполнять один и тот же участок кода. Например, вы хотите написать в консоль слово «Привет» 10 раз. Это можно сделать таким образом:
Вроде бы и не очень сложно, но код постоянно дублируется. А если нам нужно повторить это 100 раз — не добавлять же в программу 100 одинаковых строк? В таких случаях на помощь приходят циклы.
Вот как можно записать этот же код с помощью одного из циклов (далее мы рассмотрим его подробнее) — получилось всего три строчки вместо десяти:
А вот вариант для стократного вывода в консоль сообщения «Привет»:
Количество строк не увеличилось, мы просто заменили число 10 на число 100. Ровно так же будет и в случае с тысячей строк, и с миллионом, и с любым другим числом повторений.
В языке Java существует четыре вида циклов:
Начнём рассматривать их по порядку.
Java-разработчик, преподаёт в Skillbox, осваивает машинное обучение.
Содержание
Цикл for
В самом начале мы уже привели пример, в котором использовался именно цикл for — для вывода повторяющихся строк. Рассмотрим его подробнее.
Синтаксис цикла for имеет такой вид:
Здесь итерация — одно выполнение тела цикла. Смысл параметров, используемых в записи цикла:
- — в этом месте обычно объявляется счётчик цикла, но может быть произведено любое иное действие. Данная часть выполнится только единожды, перед началом цикла. — в этой части мы указываем условие для цикла. Если условие возвращает true, то цикл выполняет указанные в его цикле действия, иначе — прекращает работу. — действие, которое будет выполнено после каждой итерации, если она не была прервана. Если в параметре счётчик цикла обычно объявляется, то здесь он, как правило, увеличивается. Но может быть совершено и любое другое действие.
Эти три части цикла указываются в круглых скобках цикла и обязательно разделяются знаком точки с запятой. За ними следует:
- — код, который будет выполняться при каждой итерации.
Последовательность выполнения цикла (пошаговый алгоритм работы):
Шаг 3. Выполняем итерацию цикла (команды, которые записаны в строках ). Если выполнение итерации не было прервано, то переходим к шагу 4, иначе — к шагу 5.
Шаг 5. Выходим из цикла, продолжаем работу программы.
Для нашего примера (вывод повторяющихся строк) можно нарисовать такую блок-схему: