Статьи

30 советов по программированию на Java и рекомендации для начинающих

Java — один из самых популярных языков программирования — будь то приложения Win, веб-приложения, мобильные устройства, сети, потребительские электронные товары, устройства для телеприставок, везде есть Java.

Более 3 миллиардов устройств работают на Java. По данным Oracle , используется 5 миллиардов Java-карт.

Более 9 миллионов разработчиков решили написать свой код на Java, и он очень популярен среди разработчиков, а также является самой популярной платформой разработки.

Для начинающих разработчиков Java этот блог представляет коллекцию лучших практик, которые были изучены за определенный период времени:

1. Предпочитаете возвращать пустые коллекции вместо нуля

Если программа возвращает коллекцию, которая не имеет никакого значения, убедитесь, что возвращается пустая коллекция, а не элементы Null. Это экономит массу « если еще » тестирования на Null Elements.

1
2
3
public class getLocationName {
    return (null==cityName ? "": cityName);
}

2. Используйте строки осторожно

Если две строки объединяются с помощью оператора «+» в цикле «for», то каждый раз создается новый объект String. Это приводит к потере памяти и увеличивает время производительности. Кроме того, при создании экземпляра объекта String следует избегать конструкторов, а создание экземпляров должно происходить напрямую. Например:

1
2
3
4
5
//Slower Instantiation
String bad = new String("Yet another string object");
      
//Faster Instantiation
String good = "Yet another string object"

3. Избегайте ненужных объектов

Одной из самых дорогих операций (с точки зрения использования памяти) в Java является создание объектов. Таким образом, рекомендуется, чтобы Объекты создавались или инициализировались только при необходимости. Следующий код дает пример:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
import java.util.ArrayList;
import java.util.List;
 
public class Employees {
 
    private List Employees;
 
    public List getEmployees() {
 
        //initialize only when required
        if(null == Employees) {
            Employees = new ArrayList();
        }
        return Employees;
    }
}

4. Дилемма между Array и ArrayList

Разработчикам часто трудно решить, следует ли им использовать структуру данных типа Array типа ArrayList. У них обоих есть свои сильные и слабые стороны. Выбор действительно зависит от требований.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import java.util.ArrayList;
 
public class arrayVsArrayList {
 
    public static void main(String[] args) {
        int[] myArray = new int[6];
        myArray[7]= 10; // ArraysOutOfBoundException
 
        //Declaration of ArrayList. Add and Remove of elements is easy.
        ArrayList<Integer> myArrayList = new ArrayList<>();
        myArrayList.add(1);
        myArrayList.add(2);
        myArrayList.add(3);
        myArrayList.add(4);
        myArrayList.add(5);
        myArrayList.remove(0);
         
        for(int i = 0; i < myArrayList.size(); i++) {
        System.out.println("Element: " + myArrayList.get(i));
        }
         
        //Multi-dimensional Array
        int[][][] multiArray = new int [3][3][3];
    }
}
  1. Массивы имеют фиксированный размер, но ArrayLists имеют переменные размеры. Поскольку размер массива фиксирован, память выделяется во время объявления переменной типа массив. Следовательно, массивы очень быстрые. С другой стороны, если мы не знаем о размере данных, то ArrayList is More data приведет к ArrayOutOfBoundException, а меньшее количество данных приведет к потере места для хранения.
  2. Добавить или удалить элементы из ArrayList намного проще, чем Array
  3. Массив может быть многомерным, но ArrayList может быть только одним измерением.

5. Когда, наконец, не выполняется с Try

Рассмотрим следующий фрагмент кода:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
public class shutDownHooksDemo {
    public static void main(String[] args) {
        for(int i=0;i<5;i++)
        {
            try {
                if(i==4) {
                    System.out.println("Inside Try Block.Exiting without executing Finally block.");
                    System.exit(0);
                }
            }
            finally {
                System.out.println("Inside Finally Block.");
            }
        }
    }
}

Из программы выглядит, что «println» внутри блока finally будет выполнен 5 раз. Но если программа будет выполнена, пользователь обнаружит, что блок finally вызывается только 4 раза. В пятой итерации функция выхода вызывается и, наконец, никогда не вызывается в пятый раз. Причина в том, что System.exit останавливает выполнение всех запущенных потоков, включая текущий. Даже блок finally не выполняется после попытки, когда выполняется выход .

Когда вызывается System.exit , JVM выполняет две задачи очистки перед выключением:

Во-первых, он выполняет все перехватчики завершения работы, которые были зарегистрированы в Runtime.addShutdownHook . Это очень полезно, поскольку освобождает ресурсы, внешние по отношению к JVM.

Второй связан с финализаторами . Либо System.runFinalizersOnExit, либо Runtime.runFinalizersOnExit . Использование финализаторов давно устарело. Финализаторы могут работать на живых объектах, когда ими управляют другие потоки. Это приводит к нежелательным результатам или даже к тупику.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class shutDownHooksDemo {
 
    public static void main(String[] args) {
            for(int i=0;i<5;i++)
            {
                    final int final_i = i;
                    try {
                            Runtime.getRuntime().addShutdownHook(
                                            new Thread() {
                                            public void run() {
                                            if(final_i==4) {
                                            System.out.println("Inside Try Block.Exiting without executing Finally block.");
                                            System.exit(0);
                                            }
                                            }
                                            });
                    }
                    finally {
                            System.out.println("Inside Finally Block.");
                    }
 
            }
    }
}

6. Проверьте Странность

Посмотрите на строки кода ниже и определите, могут ли они использоваться для точной идентификации, является ли данное число нечетным?

1
2
3
public boolean oddOrNot(int num) {
    return num % 2 == 1;
}

Эти строки кажутся правильными, но они будут возвращать неверные результаты один раз в четыре раза (по статистике). Рассмотрим отрицательное нечетное число, остаток от деления с 2 не будет 1. Таким образом, возвращаемый результат будет ложным, что неверно!

Это можно исправить следующим образом:

1
2
3
public boolean oddOrNot(int num) {
    return (num & 1) != 0;
}

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

7. Разница между одинарными и двойными кавычками

1
2
3
4
5
6
public class Haha {
    public static void main(String args[]) {
    System.out.print("H" + "a");
    System.out.print('H' + 'a');
    }
}

Из кода может показаться, что возвращается «HaHa», но фактически он возвращает Ha169. Причина состоит в том, что если используются двойные кавычки, символы обрабатываются как строка, но в случае одинарных кавычек, операнды с символами (‘H’ и ‘a’) превращаются в значения int посредством процесса, известного как расширяющее примитивное преобразование. После целочисленного преобразования числа добавляются и возвращаются 169.

8. Предотвращение утечек памяти с помощью простых приемов

Утечки памяти часто вызывают снижение производительности программного обеспечения. Поскольку Java управляет памятью автоматически, разработчики не имеют большого контроля. Но есть все еще некоторые стандартные методы, которые могут использоваться, чтобы защитить от утечек памяти.

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

9. Как избежать тупиков в Java

Блокировки могут возникать по разным причинам. Нет единого рецепта, чтобы избежать тупиков. Обычно взаимоблокировки возникают, когда один синхронизированный объект ожидает блокировки ресурсов, заблокированных другим синхронизированным объектом.

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public class DeadlockDemo {
   public static Object addLock = new Object();
   public static Object subLock = new Object();
 
   public static void main(String args[]) {
 
      MyAdditionThread add = new MyAdditionThread();
      MySubtractionThread sub = new MySubtractionThread();
      add.start();
      sub.start();
   }
private static class MyAdditionThread extends Thread {
      public void run() {
         synchronized (addLock) {
        int a = 10, b = 3;
        int c = a + b;
            System.out.println("Addition Thread: " + c);
            System.out.println("Holding First Lock...");
            try { Thread.sleep(10); }
            catch (InterruptedException e) {}
            System.out.println("Addition Thread: Waiting for AddLock...");
            synchronized (subLock) {
               System.out.println("Threads: Holding Add and Sub Locks...");
            }
         }
      }
   }
   private static class MySubtractionThread extends Thread {
      public void run() {
         synchronized (subLock) {
        int a = 10, b = 3;
        int c = a - b;
            System.out.println("Subtraction Thread: " + c);
            System.out.println("Holding Second Lock...");
            try { Thread.sleep(10); }
            catch (InterruptedException e) {}
            System.out.println("Subtraction  Thread: Waiting for SubLock...");
            synchronized (addLock) {
               System.out.println("Threads: Holding Add and Sub Locks...");
            }
         }
      }
   }
}

Выход:

1
2
3
4
5
6
7
=====
Addition Thread: 13
Subtraction Thread: 7
Holding First Lock...
Holding Second Lock...
Addition Thread: Waiting for AddLock...
Subtraction  Thread: Waiting for SubLock...

Но если порядок, в котором вызываются потоки, изменяется, проблема взаимоблокировки решается.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public class DeadlockSolutionDemo {
   public static Object addLock = new Object();
   public static Object subLock = new Object();
 
   public static void main(String args[]) {
 
      MyAdditionThread add = new MyAdditionThread();
      MySubtractionThread sub = new MySubtractionThread();
      add.start();
      sub.start();
   }
 
 
private static class MyAdditionThread extends Thread {
      public void run() {
         synchronized (addLock) {
        int a = 10, b = 3;
        int c = a + b;
            System.out.println("Addition Thread: " + c);
            System.out.println("Holding First Lock...");
            try { Thread.sleep(10); }
            catch (InterruptedException e) {}
            System.out.println("Addition Thread: Waiting for AddLock...");
            synchronized (subLock) {
               System.out.println("Threads: Holding Add and Sub Locks...");
            }
         }
      }
   }
    
   private static class MySubtractionThread extends Thread {
      public void run() {
         synchronized (addLock) {
        int a = 10, b = 3;
        int c = a - b;
            System.out.println("Subtraction Thread: " + c);
            System.out.println("Holding Second Lock...");
            try { Thread.sleep(10); }
            catch (InterruptedException e) {}
            System.out.println("Subtraction  Thread: Waiting for SubLock...");
            synchronized (subLock) {
               System.out.println("Threads: Holding Add and Sub Locks...");
            }
         }
      }
   }
}

Выход:

1
2
3
4
5
6
7
8
9
=====
Addition Thread: 13
Holding First Lock...
Addition Thread: Waiting for AddLock...
Threads: Holding Add and Sub Locks...
Subtraction Thread: 7
Holding Second Lock...
Subtraction  Thread: Waiting for SubLock...
Threads: Holding Add and Sub Locks...

10. Зарезервируйте память для Java

Некоторые из приложений Java могут сильно загружать процессор, так как им требуется много оперативной памяти. Такие приложения обычно работают медленно из-за высокого требования к оперативной памяти. Для повышения производительности таких приложений ОЗУ зарезервировано для Java. Так, например, если у нас есть веб-сервер Tomcat и он имеет 10 ГБ ОЗУ. При желании мы можем выделить ОЗУ для Java на этом компьютере, используя следующую команду:

1
export JAVA_OPTS="$JAVA_OPTS -Xms5000m -Xmx6000m -XX:PermSize=1024m -XX:MaxPermSize=2048m"
  • Xms = минимальный пул выделения памяти
  • Xmx = максимальный пул выделения памяти
  • XX: PermSize = начальный размер, который будет выделен во время запуска JVM
  • XX: MaxPermSize = максимальный размер, который может быть выделен во время запуска JVM

11. Как рассчитать время работы в Java

Существует два стандартных способа определения времени операций в Java: System.currentTimeMillis () и System.nanoTime () . Вопрос в том, какой из них выбрать и при каких обстоятельствах. В принципе, они оба выполняют одно и то же действие, но отличаются друг от друга следующими способами:

  1. System.currentTimeMillis занимает где-то от 1/1000-й секунды до 15/1000-й секунды (в зависимости от системы), а System.nanoTime () — около 1/1000 000-й секунды (1000 наносекунд)
  2. System.currentTimeMillis занимает несколько тактов для выполнения операции чтения. С другой стороны, System.nanoTime () занимает более 100 тактов.
  3. System.currentTimeMillis отражает абсолютное время (количество миллисекунд с 1 января 1970 года 00:00 (время эпохи)), но System.nanoTime () не обязательно представляет какую-либо контрольную точку.

12. Выбор между Float и Double

Тип данных Байт использовано Значимые цифры (десятичные)
терка 4 7
двойной 8 15

Double часто предпочтительнее, чем float в программном обеспечении, где важна точность по следующим причинам:

Большинству процессоров требуется примерно одинаковое количество времени для выполнения операций на Float и Double. Double предлагает гораздо больше точности в то же время вычислений.

13. Расчет мощности

Чтобы вычислить мощность (^), Java выполняет исключающее ИЛИ (XOR). Чтобы вычислить мощность, Java предлагает два варианта:

  1. Умножение:
    1
    2
    3
    4
    5
    double square = double a * double a;                            // Optimized
    double cube = double a * double a * double a;                   // Non-optimized
    double cube = double a * double square;                         // Optimized
    double quad = double a * double a * double a * double a;            // Non-optimized
    double quad = double square * double square;                    // Optimized
  2. pow (двойное основание, двойная экспонента): метод pow используется для вычисления случаев, когда умножение невозможно (base ^ exponent)
    1
    double cube = Math.pow(base, exponent);

Math.pow следует использовать ТОЛЬКО при необходимости. Например, показатель степени является дробным значением. Это потому, что метод Math.pow () обычно примерно в 300-600 раз медленнее, чем умножение.

14. Как обрабатывать исключения нулевого указателя

Исключения нулевого указателя довольно распространены в Java. Это исключение возникает, когда мы пытаемся вызвать метод для пустой ссылки на объект. Например,

1
int noOfStudents = school.listStudents().count;

Если в приведенном выше примере, если получить NullPointerException, то либо школа имеет значение null, либо listStudents () имеет значение Null. Это хорошая идея, чтобы проверить Nulls рано, чтобы они могли быть устранены.

1
2
3
4
private int getListOfStudents(File[] files) {
      if (files == null)
        throw new NullPointerException("File list cannot be null");
    }

15. Кодировать в JSON

JSON (JavaScript Object Notation) — это синтаксис для хранения и обмена данными. JSON — это более простая в использовании альтернатива XML. В наши дни Json становится очень популярным в интернете из-за его свойств и легкого веса. Нормальную структуру данных можно легко закодировать в JSON и совместно использовать на веб-страницах. Перед началом написания кода необходимо установить JSON-анализатор. В приведенных ниже примерах мы использовали json.simple (https://code.google.com/p/json-simple/).

Ниже приведен базовый пример кодирования в JSON:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
import org.json.simple.JSONObject;
import org.json.simple.JSONArray;
 
public class JsonEncodeDemo {
     
    public static void main(String[] args) {
         
        JSONObject obj = new JSONObject();
        obj.put("Novel Name", "Godaan");
        obj.put("Author", "Munshi Premchand");
  
        JSONArray novelDetails = new JSONArray();
        novelDetails.add("Language: Hindi");
        novelDetails.add("Year of Publication: 1936");
        novelDetails.add("Publisher: Lokmanya Press");
         
        obj.put("Novel Details", novelDetails);
         
        System.out.print(obj);
    }
}

Выход:

1
{"Novel Name":"Godaan","Novel Details":["Language: Hindi","Year of Publication: 1936","Publisher: Lokmanya Press"],"Author":"Munshi Premchand"}

16. Декодировать из JSON

Чтобы декодировать JSON, разработчик должен знать схему. Подробности можно найти в следующем примере:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Iterator;
 
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
 
public class JsonParseTest {
 
    private static final String filePath = "//home//user//Documents//jsonDemoFile.json";
     
    public static void main(String[] args) {
 
        try {
            // read the json file
            FileReader reader = new FileReader(filePath);
            JSONParser jsonParser = new JSONParser();
            JSONObject jsonObject = (JSONObject)jsonParser.parse(reader);
             
            // get a number from the JSON object
            Long id =  (Long) jsonObject.get("id");
            System.out.println("The id is: " + id);        
 
            // get a String from the JSON object
            String  type = (String) jsonObject.get("type");
            System.out.println("The type is: " + type);
 
            // get a String from the JSON object
            String  name = (String) jsonObject.get("name");
            System.out.println("The name is: " + name);
 
            // get a number from the JSON object
            Double ppu =  (Double) jsonObject.get("ppu");
            System.out.println("The PPU is: " + ppu);
             
            // get an array from the JSON object
            System.out.println("Batters:");
            JSONArray batterArray= (JSONArray) jsonObject.get("batters");
            Iterator i = batterArray.iterator();
            // take each value from the json array separately
            while (i.hasNext()) {
                JSONObject innerObj = (JSONObject) i.next();
                System.out.println("ID "+ innerObj.get("id") +
                        " type " + innerObj.get("type"));
            }
 
            // get an array from the JSON object
            System.out.println("Topping:");
            JSONArray toppingArray= (JSONArray) jsonObject.get("topping");
            Iterator j = toppingArray.iterator();
            // take each value from the json array separately
            while (j.hasNext()) {
                JSONObject innerObj = (JSONObject) j.next();
                System.out.println("ID "+ innerObj.get("id") +
                        " type " + innerObj.get("type"));
            }
             
 
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        } catch (ParseException ex) {
            ex.printStackTrace();
        } catch (NullPointerException ex) {
            ex.printStackTrace();
        }
 
    }
 
}

jsonDemoFile.json

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
    "id": 0001,
    "type": "donut",
    "name": "Cake",
    "ppu": 0.55,
    "batters":
        [
            { "id": 1001, "type": "Regular" },
            { "id": 1002, "type": "Chocolate" },
            { "id": 1003, "type": "Blueberry" },
            { "id": 1004, "type": "Devil's Food" }
        ],
    "topping":
        [
            { "id": 5001, "type": "None" },
            { "id": 5002, "type": "Glazed" },
            { "id": 5005, "type": "Sugar" },
            { "id": 5007, "type": "Powdered Sugar" },
            { "id": 5006, "type": "Chocolate with Sprinkles" },
            { "id": 5003, "type": "Chocolate" },
            { "id": 5004, "type": "Maple" }
        ]
}
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
The id is: 1
The type is: donut
The name is: Cake
The PPU is: 0.55
Batters:
ID 1001 type Regular
ID 1002 type Chocolate
ID 1003 type Blueberry
ID 1004 type Devil's Food
Topping:
ID 5001 type None
ID 5002 type Glazed
ID 5005 type Sugar
ID 5007 type Powdered Sugar
ID 5006 type Chocolate with Sprinkles
ID 5003 type Chocolate
ID 5004 type Maple

17. Простой поиск строк

Java предлагает метод Library с именем indexOf (). Этот метод используется с String Object и возвращает позицию индекса нужной строки. Если строка не найдена, возвращается -1.

01
02
03
04
05
06
07
08
09
10
11
12
13
public class StringSearch {
 
    public static void main(String[] args) {
        String myString = "I am a String!";
         
        if(myString.indexOf("String") == -1) {
            System.out.println("String not Found!");
        }
        else {
            System.out.println("String found at: " + myString.indexOf("String"));
        }
    }
}

18. Вывод содержимого каталога

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
import java.io.*;
 
public class ListContents {
    public static void main(String[] args) {
        File file = new File("//home//user//Documents/");
        String[] files = file.list();
 
        System.out.println("Listing contents of " + file.getPath());
        for(int i=0 ; i < files.length ; i++)
        {
            System.out.println(files[i]);
        }
    }
}

19. Простой ввод-вывод

Для чтения из файла и записи в файл Java предлагает классы FileInputStream и FileOutputStream. Конструктор FileInputStream принимает путь к файлу входного файла в качестве аргумента и создает поток ввода файла. Аналогично, конструктор FileOutputStream принимает путь к файлу выходного файла в качестве аргумента и создает поток вывода файла. После того, как обработка файла завершена, важно «закрыть» потоки.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import java.io.*;
 
public class myIODemo {
    public static void main(String args[]) throws IOException {
        FileInputStream in = null;
        FileOutputStream out = null;
         
        try {
            in = new FileInputStream("//home//user//Documents//InputFile.txt");
            out = new FileOutputStream("//home//user//Documents//OutputFile.txt");
             
            int c;
            while((c = in.read()) != -1) {
                out.write(c);
            }
        } finally {
            if(in != null) {
                in.close();
            }
            if(out != null) {
                out.close();
            }
        }
    }
}

20. Выполнение команды оболочки из Java

Java предлагает класс Runtime для выполнения команд Shell. Поскольку это внешние команды, обработка исключений действительно важна. В приведенном ниже примере мы проиллюстрируем это на простом примере. Мы пытаемся открыть файл PDF с помощью команды Shell.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
 
public class ShellCommandExec {
 
    public static void main(String[] args) {
        String gnomeOpenCommand = "gnome-open //home//user//Documents//MyDoc.pdf";
 
        try {
            Runtime rt = Runtime.getRuntime();
            Process processObj = rt.exec(gnomeOpenCommand);
 
            InputStream stdin = processObj.getErrorStream();
            InputStreamReader isr = new InputStreamReader(stdin);
            BufferedReader br = new BufferedReader(isr);
 
            String myoutput = "";
 
            while ((myoutput=br.readLine()) != null) {
                myoutput = myoutput+"\n";
            }
            System.out.println(myoutput);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}

21. Использование Regex

Сводка конструкций регулярных выражений (Источник: веб-сайт Oracle)

Персонажи
Икс Персонаж х
\\ Символ обратной косой черты
\ 0n Символ с восьмеричным значением 0n (0 <= n <= 7)
\ 0nn Символ с восьмеричным значением 0nn (0 <= n <= 7)
\ 0mnn Символ с восьмеричным значением 0mnn (0 <= m <= 3, 0 <= n <= 7)
\ xhh Символ с шестнадцатеричным значением 0xhh
\ Uhhhh Символ с шестнадцатеричным значением 0xhhhh
\ Х {ч … ч} Символ с шестнадцатеричным значением 0xh… h (Character.MIN_CODE_POINT <= 0xh… h <= Character.MAX_CODE_POINT)
\ т Символ табуляции (‘\ u0009’)
\ п Символ перевода строки (перевод строки) (‘\ u000A’)
Символ возврата каретки (‘\ u000D’)
\ е Символ перевода формы (‘\ u000C’)
\ а Символ предупреждения (звонка) (‘\ u0007’)
\ е Экранирующий символ (‘\ u001B’)
\ сх Управляющий символ, соответствующий х

Классы персонажей
[ABC] a, b или c (простой класс)
[^ А] Любой символ, кроме a, b или c (отрицание)
[A-Za-Z] от A до Z или от A до Z включительно (диапазон)
[Объявление [тр]] от a до d или от m до p: [a-dm-p] (объединение)
[Аги && [Защита]] d, e или f (пересечение)
[Аг && [^ Ьс]] от a до z, кроме b и c: [ad-z] (вычитание)
[AZ && [^ тр]] от a до z, а не от m до p: [a-lq-z] (вычитание)

Предопределенные классы символов
, Любой символ (может соответствовать или не соответствовать символу конца строки)
\ d Цифра: [0-9]
\ D Не цифра: [^ 0-9]
\ s Пробельный символ: [\ t \ n \ x0B \ f \ r]
\ S Непробельный символ: [^ \ s]
\ ш Символ слова: [a-zA-Z_0-9]
\ W Несловарный символ: [^ \ w]

Граничные сопоставители
^ Начало строки
$ Конец строки
\ б Граница слова
\ B Граница без слов
\ A Начало ввода
\ГРАММ Конец предыдущего матча
\ Z Конец ввода, кроме конечного терминатора, если есть
\ г Конец ввода
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class RegexMatches
{
    private static String pattern =  "^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
    private static Pattern mypattern = Pattern.compile(pattern);
     
    public static void main( String args[] ){
 
        String valEmail1 = "[email protected]";
        String invalEmail1 = "[email protected]";
        String invalEmail2 = ".$$%%@domain.com";
        String valEmail2 = "[email protected]";
 
        System.out.println("Is Email ID1 valid? "+validateEMailID(valEmail1));
        System.out.println("Is Email ID1 valid? "+validateEMailID(invalEmail1));
        System.out.println("Is Email ID1 valid? "+validateEMailID(invalEmail2));
        System.out.println("Is Email ID1 valid? "+validateEMailID(valEmail2));
 
    }
     
    public static boolean validateEMailID(String emailID) {
        Matcher mtch = mypattern.matcher(emailID);
        if(mtch.matches()){
            return true;
        }
        return false;
    }  
}

22. Простой пример Java Swing

С помощью Java Swing GUI может быть создан. Java предлагает Javax, который содержит «качели». Графический интерфейс с использованием Swing начинается с расширения JFrame. Добавлены поля, чтобы они могли содержать компоненты графического интерфейса, такие как кнопка, переключатель, текстовое поле и т. Д. Эти поля устанавливаются в верхней части контейнера.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import java.awt.*;
import javax.swing.*; 
 
public class SwingsDemo extends JFrame
{
    public SwingsDemo()
    {
        String path = "//home//user//Documents//images";
        Container contentPane = getContentPane();
        contentPane.setLayout(new FlowLayout());  
         
        Box myHorizontalBox = Box. createHorizontalBox(); 
        Box myVerticleBox = Box. createVerticalBox();  
         
        myHorizontalBox.add(new JButton("My Button 1"));
        myHorizontalBox.add(new JButton("My Button 2"));
        myHorizontalBox.add(new JButton("My Button 3"));  
 
        myVerticleBox.add(new JButton(new ImageIcon(path + "//Image1.jpg")));
        myVerticleBox.add(new JButton(new ImageIcon(path + "//Image2.jpg")));
        myVerticleBox.add(new JButton(new ImageIcon(path + "//Image3.jpg")));  
         
        contentPane.add(myHorizontalBox);
        contentPane.add(myVerticleBox);  
         
        pack();
        setVisible(true);
    }
     
    public static void main(String args[]) {
        new SwingsDemo();
    
}

23. Воспроизвести звук с Java

Воспроизведение звука является распространенным требованием в Java, особенно в играх.

В этой демонстрации объясняется, как воспроизводить аудиофайл вместе с кодом Java.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import java.io.*;
import java.net.URL;
import javax.sound.sampled.*;
import javax.swing.*;
 
// To play sound using Clip, the process need to be alive.
// Hence, we use a Swing application.
public class playSoundDemo extends JFrame {
 
   // Constructor
   public playSoundDemo() {
      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      this.setTitle("Play Sound Demo");
      this.setSize(300, 200);
      this.setVisible(true);
 
      try {
         URL url = this.getClass().getResource("MyAudio.wav");
         AudioInputStream audioIn = AudioSystem.getAudioInputStream(url);
         Clip clip = AudioSystem.getClip();
         clip.open(audioIn);
         clip.start();
      } catch (UnsupportedAudioFileException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      } catch (LineUnavailableException e) {
         e.printStackTrace();
      }
   }
 
   public static void main(String[] args) {
      new playSoundDemo();
   }
}

24. Экспорт в PDF

Экспорт таблицы в PDF является распространенным требованием в программах Java. Используя itextpdf, становится очень легко экспортировать PDF.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import java.io.FileOutputStream;
import com.itextpdf.text.Document;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
 
public class DrawPdf {
 
      public static void main(String[] args) throws Exception {
        Document document = new Document();
        PdfWriter.getInstance(document, new FileOutputStream("Employee.pdf"));
        document.open();
         
        Paragraph para = new Paragraph("Employee Table");
        para.setSpacingAfter(20);
        document.add(para);
         
        PdfPTable table = new PdfPTable(3);
        PdfPCell cell = new PdfPCell(new Paragraph("First Name"));
 
        table.addCell(cell);
        table.addCell("Last Name");
        table.addCell("Gender");
        table.addCell("Ram");
        table.addCell("Kumar");
        table.addCell("Male");
        table.addCell("Lakshmi");
        table.addCell("Devi");
        table.addCell("Female");
 
        document.add(table);
         
        document.close();
      }
    }

25. Отправка электронной почты из кода Java

Отправка электронной почты с Java очень проста. Нам нужно установить Java Mail Jar и установить его путь в classpath нашей программы. Основные свойства установлены в коде, и мы можем отправить электронное письмо, как указано в коде ниже:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
 
public class SendEmail
{
    public static void main(String [] args)
    {   
        String to = "[email protected]";
        String from = "[email protected]";
        String host = "localhost";
 
        Properties properties = System.getProperties();
        properties.setProperty("mail.smtp.host", host);
        Session session = Session.getDefaultInstance(properties);
 
        try{
            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(from));
 
            message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));
 
            message.setSubject("My Email Subject");
            message.setText("My Message Body");
            Transport.send(message);
            System.out.println("Sent successfully!");
        }
        catch (MessagingException ex) {
            ex.printStackTrace();
        }
    }
}

26. Измерение времени

Многие приложения требуют очень точного измерения времени. Для этого Java предоставляет статические методы в классе System:

  1. currentTimeMillis (): возвращает текущее время в миллисекундах с начала эпохи, в длинном.
    1
    2
    long startTime = System.currentTimeMillis();
    long estimatedTime = System.currentTimeMillis() - startTime;
  2. nanoTime (): возвращает текущее значение наиболее точного доступного системного таймера, в наносекундах, в течение длительного времени. nanoTime () предназначен для измерения относительного временного интервала вместо предоставления абсолютного времени.
    1
    2
    long startTime = System.nanoTime();
    long estimatedTime = System.nanoTime() - startTime;

27. Масштабировать изображение

Изображение может быть изменено с помощьюAffineTransform. Сначала создается буфер изображения входного изображения, а затем отрисовывается масштабированное изображение.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
 
public class RescaleImage {
  public static void main(String[] args) throws Exception {
    BufferedImage imgSource = ImageIO.read(new File("images//Image3.jpg"));
    BufferedImage imgDestination = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
    Graphics2D g = imgDestination.createGraphics();
    AffineTransform affinetransformation = AffineTransform.getScaleInstance(2, 2);
    g.drawRenderedImage(imgSource, affinetransformation);
    ImageIO.write(imgDestination, "JPG", new File("outImage.jpg"));
  }
}

28. Захват координат мыши

Благодаря реализации интерфейса MouseMotionListner события мыши могут быть записаны. Когда мышь вводится в определенную область, вызывается событие MouseMoved и могут быть получены координаты движения. Следующий пример объясняет это:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.awt.event.*;
import javax.swing.*;
 
public class MouseCaptureDemo extends JFrame implements MouseMotionListener
{
    public JLabel mouseHoverStatus;
 
    public static void main(String args[])
    {
        new MouseCaptureDemo();
    }
 
    MouseCaptureDemo()
    {
        setSize(500, 500);
        setTitle("Frame displaying Coordinates of Mouse Motion");
 
        mouseHoverStatus = new JLabel("No Mouse Hover Detected.", JLabel.CENTER);
        add(mouseHoverStatus);
        addMouseMotionListener(this);
        setVisible(true);
    }
 
    public void mouseMoved(MouseEvent e)
    {
        mouseHoverStatus.setText("Mouse Cursor Coordinates => X:"+e.getX()+" | Y:"+e.getY());
    }
 
    public void mouseDragged(MouseEvent e)
    {}
}

29. FileOutputStream Vs. FileWriter

Запись файлов в Java осуществляется в основном двумя способами: FileOutputStream и FileWriter. Иногда разработчики изо всех сил пытаются выбрать один из них. Этот пример помогает им выбрать, какой из них следует использовать в соответствии с заданными требованиями. Во-первых, давайте посмотрим на часть реализации:

Использование FileOutputStream:

1
2
3
4
File foutput = new File(file_location_string);
FileOutputStream fos = new FileOutputStream(foutput);
BufferedWriter output = new BufferedWriter(new OutputStreamWriter(fos));
output.write("Buffered Content");

Использование FileWriter:

1
2
3
FileWriter fstream = new FileWriter(file_location_string);
BufferedWriter output = new BufferedWriter(fstream);
output.write("Buffered Content");

Согласно спецификации Java API:

FileOutputStream предназначен для записи потоков необработанных байтов, таких как данные изображения. Для записи потоков символов рассмотрите использование FileWriter.

Это довольно ясно показывает, что для типа изображения Data FileOutputStream следует использовать, а для типа данных Text следует использовать FileWriter.

Дополнительные предложения

  1. Использовать коллекции

    Java поставляется с несколькими классами коллекций — например, Vector, Stack, Hashtable, Array. Разработчикам рекомендуется использовать коллекции как можно шире по следующим причинам:

    • Использование коллекций делает код многоразовым и совместимым.
    • Коллекции делают код более структурированным, легким для понимания и сопровождения.
    • Классы коллекции «из коробки» хорошо протестированы, поэтому качество кода хорошее.
  2. Правило 10-50-500

    В больших пакетах программного обеспечения поддержка кода становится очень сложной. Разработчики, которые присоединяются к новым текущим проектам поддержки, часто жалуются на: Монолитный Кодекс , Код Спагетти . Существует очень простое правило, позволяющее избежать этого или сохранять код чистым и обслуживаемым: 10-50-500.

    • 10: ни один пакет не может иметь более 10 классов.
    • 50: ни один метод не может иметь более 50 строк кода.
    • 500: ни один класс не может иметь более 500 строк кода.
  3. SOLID Class Design Принципы

    SOLID (http://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29) — это аббревиатура принципов проектирования, придуманная Робертом Мартином. Согласно этому правилу:

    правило Описание
    Принцип единой ответственности У класса должна быть одна и только одна задача / ответственность. Если класс выполняет более одной задачи, это приводит к путанице.
    Открытый / закрытый принцип Разработчики должны больше сосредоточиться на расширении программных объектов, а не на их модификации.
    Принцип подстановки Лискова Должна быть возможность заменить производный класс базовым классом.
    Принцип разделения интерфейса Это похоже на принцип единой ответственности, но применимо к интерфейсам. Каждый интерфейс должен отвечать за определенную задачу. Разработчики должны реализовать методы, которые ему не нужны.
    Принцип инверсии зависимостей Зависит от абстракций — но не от конкреций. Это означает, что каждый модуль должен быть отделен от другого, используя абстрактный слой, который связывает их вместе.
  4. Использование шаблонов дизайна

    Шаблоны проектирования помогают разработчикам внедрять лучшие принципы разработки программного обеспечения в свое программное обеспечение. Они также предоставляют общую платформу для разработчиков по всему миру. Они предоставляют стандартную терминологию, которая позволяет разработчикам сотрудничать и легче общаться друг с другом.

  5. Идеи документа

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

  6. Используйте равно больше ==

    == сравнивает ссылки на объекты, проверяет, указывают ли два операнда на один и тот же объект (не эквивалентные объекты, один и тот же объект). С другой стороны, «равно» выполняет фактическое сравнение двух строк.

  7. Избегайте чисел с плавающей точкой

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

Лучшие ресурсы для изучения Java

Кроме того, я хочу упомянуть, что есть много ресурсов для изучения Java .