Показ дописів із міткою Java. Показати всі дописи
Показ дописів із міткою Java. Показати всі дописи

понеділок, 8 серпня 2022 р.

Винятки Java

'''Виняткова ситуація''' або просто '''виняток''' (англ. exception) – це аварійний стан, який відбувається саме під час виконання програми. Прикладом є — ділення на нуль, помилки читання з файлу та мережі тощо. Іншими словами – це помилки які можуть виникнути при виконанні програми. В ряді мов програмування необхідно заздалегідь передбачити можливість тієї чи іншої помилки і передбачити шлях її обробки. В java для цього передбачений спеціальний механізм винятків.

Винятки в java
Виняток в java – це об'єкт, який описує виняткову (тобто, помилкову) ситуацію, що відбулась в певному місці коду. Коли така ситуація виникає створюється об'єкт, який передається («вкидається») в метод, в якому виникла помилка. Далі в методі даний виняток може оброблятися, або бути переданий ще кудись для обробки.

Розглянемо для прикладу наступну програму '''DivZero.java'''
public class DivZero {
    public static void main(String[] args) {
        int my = 0;
        int medium = 44 / my;
        System.out.println("medium=" + medium);
    }
}
Як бачимо в програмі присутнє ділення на нуль. При компіляції ми не отримаємо помилок. Проте, після запуску програми, отримаємо наступне:

понеділок, 1 серпня 2022 р.

HashMap

HashMap розширює AbstractMap та реалізує інтерфейс Map. Клас не додає власних методів. Клас використовує хеш таблиці для зберігання зіставлення. HashMap не гарантує порядок елементів.

HashMap має наступні конструктори:

HashMap( )

HashMap(Map<? extends K, ? extends V> m)

HashMap(int capacity)

HashMap(int capacity, float fillRatio)

Перший створює HashMap по замовчуванню. Другий створює хеш зіставлення використовуючи елементи m. Третій задає ємність хеш зіставлення. Четвертий задає ємність(по замовчуванню 16) та коефіцієнт заповнення (по замовчуванню 0.75).


суботу, 2 травня 2020 р.

Клас EnumSet (Java)

EnumSet, Java, Collection, Колекції, Коллекции
Клас EnumSet — це одна з спеціалізованих реалізацій інтерфейсу Set для використання з перелічуваним типом даних (enum). EnumSet розширює AbstractSet та реалізує Cloneable та Serializable інтерфейси Java. EnumSet заміщує більшість методів інтерфейсів Set та Collection. EnumSet доволі швидка реалізація Set, швидша за HashSet, тому що всередині використовуються побітові операції, а не хеш-коди об’єктів.

EnumSet не синхронізований і повинен бути синхронізований ззовні, наприклад з використанням методу Collections.synchronizedSet(java.util.Set).

Всі елементи enum множини мають походити від єдиного перелічуваного типу, що вказується, коли множина створюється явно або неявно. EnumSet не дозволяє додавати значення null. Елементи зберігаються в порядку в якому їх подано в переліченні (enum).

EnumSet використовує безвідмовний (fail-safe) ітератор, що працює з копією EnumSet, тобто ітератор не буде викидати виняток ConcurrentModificationException, в разі зміни даних множини поза ітератором.

четвер, 30 квітня 2020 р.

Клас ArrayDeque (Java)

ArrayDeque, Java, Колекції, Коллекции
ArrayDeque (читається як еррейдек) – це клас який забезпечує двосторонню чергу. Іншими словами - це автоматично зростаючий масив, що дозволяє нам додавати або видаляти елементи з обох боків черги. ArrayDeque може бути використано як стек (LIFO, останній ввійшов - перший вийшов) або ж як черга (FIFO, перший ввійшов - перший вийшов).

ArrayDeque не може містити в якості елемента null.

Клас ArrayDeque швидший за клас Stack, якщо використовувати його в якості стеку і швидший за LinkedList, якщо використовувати в якості черги.

ArrayDeque розширює клас AbstractCollection та реалізує інтерфейси Deque, Cloneable, Serializable. Таким чином ми можемо використовувати для роботи з даним класом, як методи інтерфейсу Deque (який розширює інтерфейс Queue) так і методи інтерфейсу Collection.

Якщо використовується ітератор, то він буде викидати виняток ConcurrentModificationException, якщо вміст ArrayDeque був модифікований після створення ітератора. Таким чином ітератор необхідно з обережністю використовувати з ArrayDeque.

понеділок, 27 квітня 2020 р.

Клас PriorityQueue (Java)

PriorityQueue дозволяє реалізувати чергу на основі пріоритету. Така черга може бути корисна, наприклад, у разі необхідності обслуговування клієнтів згідно пріоритету. При зберіганні чисел в пріоритетній черзі, така черга гарантує, що першим елементом завжди буде найменший елемент. При цьому не гарантується ніякий стабільний послідовний порядок збереження елементів. Після додавання або видалення елементу з пріоритетної черги, порядок зберігання елементів в цій черзі змінюється таким чином, що в голові черги опиняється найменший елемент згідно його природнього порядку або згідно заданого компаратора.

PriorityQueue має наступні конструктори:

неділю, 19 квітня 2020 р.

Клас TreeSet (Java)

Клас TreeSet дозволяє створювати відсортовану множину. Тобто елементи не повторюються та зберігаються у відсортованому порядку. Для зберігання елементів застосовується бінарна деревоподібну структура. Об'єкти зберігаються в відсортованому порядку по зростанню. Час доступу та одержання елементів доволі малий, тому клас TreeSet підходить для зберігання великих об’ємів відсортованих даних, які повинні бути швидко знайдені.

Клас TreeSet розширює клас AbstractSet та реалізує інтерфейс NavigableSet. NavigableSet реалізується на базі TreeMap.

В класі доступні чотири конструктори:

TreeSet () 
TreeSet(Collection  с) 
TreeSet(Comparator  компаратор) 
TreeSet(SortedSet  ss)

суботу, 18 квітня 2020 р.

Клас LinkedHashSet

Клас LinkedHashSet розширює клас HashSet не додаючи ніяких нових методів. Працює він дещо довше за HashSet проте зберігає порядок в якому елементи додаються до нього. Відповідно це дозволяє організувати послідовну ітерацію вставлення та витягнення елементів. Всі конструктори та методи роботи з LinkedHashSet аналогічні тим, що є в класі HashSet.
import java.util.HashSet;
import java.util.LinkedHashSet;

public class TestLinkedHashSet {
    public static void main(String[] args) {
        HashSet<String> hs=new HashSet<String>();
        LinkedHashSet<String> lhs=new LinkedHashSet<String>();
        hs.add("1");
        hs.add("2");
        hs.add("3");
        hs.add("4");
        hs.add("5");
        lhs.add("1");
        lhs.add("2");
        lhs.add("3");
        lhs.add("4");
        lhs.add("5");
        System.out.println("HashSet: "+hs);
        System.out.println("LinkedHashSet: "+lhs);
    }
}
Результат роботи програми:
HashSet: [3, 2, 1, 5, 4]
LinkedHashSet: [1, 2, 3, 4, 5]


пʼятницю, 17 квітня 2020 р.

Клас HashSet

HashSet – це клас призначений для зберігання даних у вигляді множини невпорядкованих елементів. Якщо потрібна впорядкована множина, то використовуйте TreeSet. HashSet також не гарантує стабільного порядку збереження об’єктів. Тобто при додаванні об’єктів порядок зберігання елементів змінюється. Вони можуть бути збережені як в кінці множити так і в середині. Якщо потрібен один порядок зберігання об’єктів використовуйте LinkedHashSet.

Сам термін «множина» означає, що елементи не будуть повторюватися. Для зберігання і пошуку елементів використовується хеш-код об’єкта. HashSet також може містити значення null. Власне всередині самої реалізації HashSet використовується клас HashMap, який дозволяє зберігати елементи у вигляді двох складових ключа та хеш-коду. У класі HashSet хеш-код недоступний і використовується неявно для користувача.

Клас HashSet розширює клас AbstractSet та реалізує інтерфейс Set. Також реалізовує інтерфейси Serializable та Clonable.

HashSet має такі конструктори:
HashSet()
HashSet (Collection  c)
HashSet (int об’єм)
HashSet (int об’єм, float коефіцієнт_заповнення)

середу, 15 квітня 2020 р.

Клас LinkedList

LinkedList — це структура даних Java, що являє собою пов’язаний список елементів (об’єктів).

Різниця між ArrayList та LinkedList полягає в тому, що ArrayList реалізований у вигляді масиву, а LinkedList у вигляді пов’язаних між собою об’єктів. ArrayList швидко виконує читання і заміну елементів (посилань на об’єкти), проте, щоб вставити новий елемнт в середину ArrayList або видалити існуючий в середині ArrayList здійснюється послідовний зсув цілого ряду елементів масиву. В LinkedList доволі швидко відбувається вставлення нового елементу або видалення існуючого. Це відбувається тому, що в середині реалізації LinkedList змінюються лише посилання на попередній і наступний об’єкти (елементи). Проте доступ до об’єктів по індексу в LinkedList відбувається повільніше ніж в ArrayList. Тож загалом, LinkedList корисний, коли необхідно часто вставляти та видаляти елементи зі списку, а в інших випадках краще використовувати ArrayList.

Існує два конструктури LinkedList:

вівторок, 14 квітня 2020 р.

Клас ArrayList

Клас ArrayList - це по суті динамічний масив посилань на об'єкти. Динамічний означає, що якщо його об'єму недостатньо, то він автоматично змінює свій об'єм при додаванні до нього нових елементів. При потребі можна задати йому потрібний об'єм методом ensureCapacity (). ArrayList дозволяє читати об'єкти як по індексу так і послідовно через ітератор.

Клас ArrayList розширює клас AbstractList та реалізовує інтерфейс List.

Наступний приклад демонструє створення ArrayList, його наповнення об'єктами типу String та їх читання за допомогою методу get (int index) та за допомогою ітератора.

вівторок, 31 березня 2020 р.

Java vs Python

Так склалось, що останнім часом багато працюю з аналізом даних на Python. Попередньо опробував Matlab та R, після яких перейти на Python не склало взагалі ніяких проблем. Проте досвіду в програмуванні у мене все таки більше на Java, тому тут опишу Python з точки зору Java програміста. Нічим не хочу образити Python програмістів, просто погляд з під дещо іншим фокусом. Python потужна, просто освоювана мова програмування, з деякими недоліками, які втім не заважають конкурувати з іншими мовами програмування і з Java зокрема.

Динамічна типізація - жах Java програміста:-). Перше, що  впадає в очі це динамічне перетворення типів і відсутність контролю за типами змінних, що передаються у функції. В java  ти явно маєш вказувати тип і приведення до інших типів даних (крім деяких винятків). Крім того в Java при передачі змінної у функцію(метод) автоматично іде перевірка на відповідність типу змінної сигнатурі методу ще на етапі компіляції. В Java, щоправда, існує можливість написати універсальний метод, який прийматиме будь-який тип або ж якусь групу типів, але це необхідно явно вказати при оголошенні методу. Pyhon старається все робити автоматично і у функцію можна передати будь-який тип. Тому часто різноманітні функції з популярних модулів для аналізу даних Python "матюкаються" на те, що вони не можуть працювати з певним типом даних під час виконання програми (інколи з тієї інформації, що видає функція не завжди і зрозуміло в чому причина помилки). Методом проб і помилок приходиться здійснювати перетворення у відповідний тип власноруч.

четвер, 13 лютого 2020 р.

Adapter pattern

Вирізка із книги "GoF Design Patterns - with examples using Java and UML2" by: Benneth Christiansson (Ed.) Mattias Forss, Ivar Hagen, Kent Hansson, Johan Jonasson, Mattias Jonasson, Fredrik Lott, Sara Olsson, and Thomas Rosevall. License: Creative Commons Attribution-ShareAlike 3.0 License.

Визначення

Патерн адаптер(Adapter) або ж обгортка (Wrapper) використовується для трансляції інтерфейсу одного класу в інтерфейс іншого. Це означає, що ми можемо зробити так, щоб класи працювали разом, хоча вони мають несумісні інтерфейси. Клас адаптер використовує множинне успадкування (розширяючи один клас і/або реалізуючи один або більше класів), щоб адаптувати один інтерфейс до іншого. Об’єкт адаптер покладається на агрегацію об’єктів.

Де використовується
  • Коли ви хочети використовувати існуючий клас, але його інтерфейс не зіставляється з тим який вам потрібен
  • Коли ви хочете створити повторно використовуваний клас, що взаємодії з непов’язаними або невідомими наперед класами, що є класами, що необов’язково мають сумісний інтерфейс.
  • Коли ви хочете збільшити прозорість класів
  • Коли ви хочете створити вбудовуваний набір.

вівторок, 27 листопада 2018 р.

JAXB: розпаковування та генерування XML документів

JAXB (Java Architecture for XML Binding) дозволяє швидко розпакувати (unmarshall) xml файл у об’єкти та згенерувати/запакувати (marshall) xml із об’єкту. JAXB використовується, зокрема, при розробці RESTtful Веб-сервісів, коли необхідно швидко згенерувати xml у якості відповіді клієнту або розпакувати із http запиту.
Для прикладу є простий XML документ:
<?xml version="1.0" encoding="UTF-8"?>
<Data>
 <id>1</id>
 <name>Галина Мер</name>
 <mobile>+380970000001</mobile>
</Data>

Для того, щоб розпакувати наш xml об'єкт нам потрібен клас із відповідною анотацією.

понеділок, 7 вересня 2015 р.

Параноїдальне програмування на Java

Як програмувати, щоб допускати менше помилок при програмуванні - ціла наука з якої виросли патерни і ряд нових віянь у Java як то Generics. Проте помилки на зразок випадкового небажаного присвоєння зустрічаються доволі часто. Хороша стаття як програмувати, щоб допускати менше помилок:



Особливо мені сподобалось, щоб уникнути випадкового присвоєння в умовах, краще ставити на перше місце літерал, а змінну на друге (5==variable), таким чином забувши написати замість подвійного дорівнює одинарне, зразу ж помилка буде локалізована. Інструкція присвоєння за любих умов не спрацює.:) Власне поради корисні не тільки Java програмістам.

середу, 5 листопада 2014 р.

Цикл while та цикл do...while



У відео ідеться про цикли з передумовою (while) та з післяумовою (do..while) у Java, особливості їхнього застосування, ключові слова break та continue. Приведено приклад консольної гри на вгадування числа з використанням циклу do...while.

вівторок, 9 вересня 2014 р.

Патерн «Фабрика»

Вирізка із книги "GoF Design Patterns - with examples using Java and UML2" by: Benneth Christiansson (Ed.) Mattias Forss, Ivar Hagen, Kent Hansson, Johan Jonasson, Mattias Jonasson, Fredrik Lott, Sara Olsson, and Thomas Rosevall. License: Creative Commons Attribution-ShareAlike 3.0 License.

Визначення
Патерн Фабрика (Factory Pattern) надає шлях використання екземпляру як об’єктну фабрику. Фабрика може повертати екземпляр одного з декількох можливих класів (у ієрархії класів), в залежності від заданих даних.

Де використовується:
  • Коли клас не може передбачити, який об’єкт, якого класу потрібно створити
  • Ви хочете вказати, екземпляр якого клас хочете створити
  • Коли ви маєте класи, які походять від одних і тих же класів, або ж класи, які ділять один інтерфейс.  Тобто, методи у екземплярів цих класів одні і ті ж самі і можуть використовуватися взаємозамінно.  
  • Коли ви хочете ізолювати клієнта від актуального типу, що ініціалізується.

середу, 27 серпня 2014 р.

Отримуємо шлях до файлу в кирилиці

Є виконуваний jar файл, поряд з ним у каталозі є підкаталог у якому є файл help.txt. Необхідно запустити jar файл і при виборі із меню пункту "Help" запустити файл help.txt.

Тож все це робиться так:
File currentJavaJarFile = new File
     (Test.class.getProtectionDomain()
     .getCodeSource().getLocation().getPath());
String path=currentJavaJarFile.getParent();
String comand="notepad.exe " + path+"\\Resources\\help.txt";
Runtime.getRuntime().exec(comand);

Проте як виявлось усе працює правильно, якщо шлях до файлу латинськими літерами. Як тільки у шляху з'являється кирилиця, видає помилку знаходження файлу.

Отримати правильно шлях допоможе UrlDecoder:
currentJavaJarFile=new File(java.net.URLDecoder.decode(
            (Test.class.getProtectionDomain().getCodeSource()
            .getLocation().getPath()).toString() ,
            "UTF-8"));




get path with cyrillic

вівторок, 26 серпня 2014 р.

Вибір подальшого шляху (MindMap)

Написанню даної замітки посприяла стаття "Роздоріжжя навколо нас".

Постійно приходиться нагадувати собі що головне, а що другорядне. Хочеться багато чого освоїти, проте реально приходиться зосереджуватися на найбільш актуальному і потрібному для себе в даний час. Вирішив якось промалювати свою інтелект карту в яких напрямках рухатись дальше. В результаті вирішив що краще розділити на декілька невеличких, але основних. У мене вийшло аж 4 основні інтелект карти: Англійська, Математика, Програмування, Java (як підкарта програмування). У перших трьох розгалужень не так і багато, а ось Java вийшла доволі розкішна:) Постарався представити те що я освоїв, але ще варто закріпити знання, або уже почав освоювати, або збираюсь освоїти найближчим, або ж просто є велике бажання в майбутньому освоїти (як то Android SDK). Результат того, що накидав десь за хвилин 20-ть:

Java - My Mind Map

Можна звичайно деталізувати безкінечно, так у Java EE багато цікавого чого хотілось б освоїти, але поки що зобразив як на мене основне.

середу, 13 серпня 2014 р.

Як показати діалог "зберегти" з допомогою JFileChooser

Як показати діалог "зберегти" з допомогою JFileChooser

Якщо вашій програмі потрібно зручно вказати положення файлу, папки або ж місцезбереження файлу, то для цих цілей Swing надає клас javax.swing.JFileChooser. Виклик діалогу збереження файлу схожого на той що використовується у віндовз, здійснюється через метод showSaveDialog():

  public int showSaveDialog(Component parent)

Де parent - це батьківський компонент діалогу, переважно JFrame. Коли користувач введе ім'я файлу і натисне ОК або Cancel, метод повертає одне з наступних значень:

   
   JFileChooser.CANCEL_OPTION // користувач відмінив вибір файлу
   JFileChooser.APPROVE_OPTION // користува здійснив вибір файлу
   FileChooser.ERROR_OPTION // якщо користувач закрив вікно
                            // кнопкою закриття Х.

Після того як користувач здійснив свій вибір, ми можемо використати метод getSelectedFile() щоб взяти нам об'єкт файлу:

    File getSelectedFile()

Перед викликом методу showSaveDialog(),  ви можливо захочете встановити деякі опції для діалогу:
  
    setDialogTitle(String) // встановлює заголовок вікна.
    setCurrentDirectory(File) // встановити директорію для збереження

Приклад коду:

// батьківський компонет діалогового вікна
JFrame parentFrame = new JFrame();
 
JFileChooser fileChooser = new JFileChooser();
fileChooser.setDialogTitle("Вкажіть як зберегти файл");   
 
int userSelection = fileChooser.showSaveDialog(parentFrame);
 
if (userSelection == JFileChooser.APPROVE_OPTION) {
    File fileToSave = fileChooser.getSelectedFile();
    System.out.println("Зберегти як: " + fileToSave.getAbsolutePath());
}

Можна встановити фільтр для задання розширень файлу:

 
FileNameExtensionFilter filter = 
                      new FileNameExtensionFilter("csv файл","csv");
fileChooser.setFileFilter(filter);

Вікно може виглядати так:


В результаті отримали об'єкт File і можна створювати потоки вводу-виводу і записувати у файл використовуючи отриманий об'єкт File. Об'єкт File, хто ще не знає є дискриптором файлу і мабуть, основне що в ньому є - це адрес розміщення файлу і його назва.

 При написанні було використано матеріали із codejava.net

пʼятницю, 25 липня 2014 р.

Заміщення (overriding) методів у Java


У відеоуроці розглядається наступне:
Що таке заміщення  методів? 
Чому заміщення і перевизначення це не одне й те саме? 
Дещо про успадкування та поліморфізм у Java.
Особливості статичних методів.
Модифікатор final при визначенні методів Java.