- How to populate a static List (ArrayList, LinkedList) in Java (syntax)
- Java 9
- Prior to Java 9
- My older approach
- Complete static initialization List example
- Java Static List | Java example
- String List:
- Int List:
- Char List:
- Float List:
- Инициализация массива статических объектов в Java
- Public static list string java
How to populate a static List (ArrayList, LinkedList) in Java (syntax)
Java FAQ: How do I initialize/populate a static List ( ArrayList , LinkedList ) in Java?
Java 9
If you can use Java 9 and newer, you can use this syntax:
List strings = new ArrayList<>(List.of("Hello", "world"));
Prior to Java 9
For versions of Java prior to Java 9 I show an older approach below, but I just learned about this relatively-simple way to create and populate a Java ArrayList in one step:
List strings = new ArrayList<>( Arrays.asList("Hello", "world") );
or in this format, if you prefer:
List strings = new ArrayList<>(Arrays.asList( "Hello", "world" ));
I show my older approach below, but if you’re using Java 7 or Java 8, this seems like a good approach.
My older approach
This is the older, pre-Java 9 approach I used to use to create a static List in Java (ArrayList, LinkedList):
static final List nums = new ArrayList() >;
As you can guess, that code creates and populates a static List of integers. If your List needs to contain a different data type, just change the Integer to whatever your desired type is, and of course change the add method calls accordingly.
Complete static initialization List example
As a little summary, and for the sake of completeness, the following Java source code shows a complete working example that includes the previous static initialization example:
import java.util.ArrayList; import java.util.List; public class SumTest1 < // CREATE AND POPULATE A STATIC JAVA LIST static final Listnums = new ArrayList() >; public static void main(String[] args) < int total = sum(nums); System.out.println("Sum: " + total); >public static int sum(List ints) < int sum = 0; for (int i : ints) < sum += i; >return sum; > >
If you wanted to see the syntax required to create and populate a List ( ArrayList , LinkedList ) in Java, I hope this is helpful.
Java Static List | Java example
When we want to use multiple Strings or integers its not possible to create multiple variables everytime and store in them. Also even if you store them its very difficult to process them.
For example when we try to store 100 String’s it’s not a good practice to create 100 variables. Because it also causes a lot of memory consumption as well.
In need of a good programming practice we need to make use of Java Static List.
public static String[] list;
We define String list as String[] and object name.
initialise the list and add values as below
let’s add some data to list
Using for loop we need to fetch the values of list and print them to screen.
String List:
Declare a list of String and then print them using for loop.
Parse the list in for loop with index position ‘i’
public static String[] list; public static void main(String args[])< list = new String[] < "One", "Two", "Three", "Four", "Five" >; for(int i = 0; i < list.length; i++)< System.out.println(list[i]); >>
Int List:
Same like String array we also declare and use int array
public static int[] list; public static void main(String args[])< list = new int[] < 1, 2, 3, 4, 5 >; for(int i = 0; i < list.length; i++)< System.out.println(list[i]); >>
Char List:
Here in this list we accept only one character per position as the name itself says char list.
public static char[] list; public static void main(String args[])< list = new char[] < 'a', 'b', 'c', 'd', 'e' >; for(int i = 0; i < list.length; i++)< System.out.println(list[i]); >>
Float List:
For storing a list of float values we can create a list as below
public static float[] list; public static void main(String args[])< list = new float[] < 1.0f, 2.0f, 3.0f, 4.0f, 5.0f >; for(int i = 0; i < list.length; i++)< System.out.println(list[i]); >>
If any query on Java Static List let us know in comment section below.
For more interesting updates do like and share this tutorial.
Инициализация массива статических объектов в Java
В C++ общеизвестной и полезной практикой является использование списка инициализации для задания значений массива. При этом крайне удобно инициализировать при помощи фигурных скобок объекты в которых поля являются открытыми. Это либо структуры(struct) либо классы, у которых все поля открыты(перед ними указан access specifier как public).
Рассмотрим обычную структуру :
struct my_unary_function string name; string detect_name; double (*handler) (double); >;
Объекты можно создавать и инициализировать на лету(конструктор нам не нужен!) :
my_unary_function sin_func = "Синус", "sin", sin>;
Обратите внимание на синтаксис — во-первых, наличие фигурных скобок. Во-вторых — строгий порядок перечисления значений , соответствующий порядку определения переменных в структуре. У нового объекта — name=”Синус”, detec_name=”sin”, handler=”&sin”.
Теперь, собственно массивы, которые удобно инициализировать также как объекты :
my_unary_function math_functions[] = "Синус", "sin", sin>, "Косинус", "cos", cos>, "Тангенс", "tan", tan> >;
Добавив всего-лишь одну строчку расширится функционал программы. Если пишется калькулятор с поддержкой простейших математических вычислений — то все функции можно определять по полю detect_name в этом массиве, а обработчик определяется полем handler.
Java — встроенная инициализация статических массивов из объектов. В Java — немного другая история. Чаще всего используются статические массивы, тип элементов которых объявлен рядом с ними.
Пример такого определения :
public class InnerClassTest static class Employee private String name; private double salary; public Employee(String n, double s) name = n; salary = s; > public void print() System.out.println(name + " " + salary); > > static Employee[] staff = new Employee[] new Employee("Harry Hacker", 3500), new Employee("Carl Cracker", 7500), new Employee("Tony Tester", 3800), >; public static void main(String[] args) for (Employee e: staff) e.print(); > > >
А можно было бы разделить инициализацию и поместить её в специальный static-блок :
public class Main static Integer[] integerArray; static integerArray = new Integer[] new Integer(1), new Integer(2) >; > public static void main(String args[]) for (int i = 0; i integerArray.length; i++) System.out.println(integerArray[i]); > > >
Такой static-блок является функциональным блоком и в нём также можно выполнять любые действия :
static ArrayListString> list = new ArrayListString>(); static list.add("Bart"); list.add("Lisa"); list.add("Marge"); list.add("Barney"); list.add("Homer"); list.add("Maggie"); System.out.print("Hello!"); >
На самом деле для инициализации ArrayList можно использовать метод java.util.Arrays.asList :
public static final ListString> favorites = Arrays.asList("EJB", "JPA", "Glassfish", "NetBeans");
Public static list string java
В этом примере невозможно инициализировать объект List всеми начальными значениями вместе с объявлением, поэтому используется статический блок.
Код ниже демонстрирует особенность статических блоков — они выполняются раньше конструкторов и при создании нескольких объектов класса, статический блок выполняется только один раз.
public class Test < static < System.out.println("Вызов статического блока"); >Test() < System.out.println("Вызов конструктора"); >> class Main < public static void main(String[] args) < Test t1 = new Test(); Test t2 = new Test(); >>
- Если для инициализации статических переменных требуется дополнительная логика, за исключением операции присваивания
- Если инициализация статических переменных подвержена ошибкам и требует обработки исключений
- У класса может быть несколько статических блоков
- Статические поля и статические блоки выполняются в том же порядке, в котором они присутствуют в классе
- Из статического блока нельзя получить доступ к не статическим членам класса
- Статический блок не может пробросить дальше перехваченные исключения, но может их выбросить. При этом всегда будет выкидываться только java.lang.ExceptionInInitializerError
- Статические поля или переменные инициализируются после загрузки класса в память в том же порядке, в каком они описаны в классе
Язык программирования Java позволяет создавать классы внутри другого класса. Такой класс называется вложенным (nested). Вложенный класс группирует элементы, которые будут использоваться в одном месте, сделав тем сам код более организованным и читабельным.
- вложенные классы, объявленные статическими, называются статическими вложенными классами (static nested classes)
- вложенные классы, объявленные без static, называются внутренними классами (inner classes)
Основное различие между этими понятиями состоит в том, что внутренние классы имеют доступ ко всем членам включающего их класса (включая приватные) верхнего уровня, тогда как статические вложенные классы имеют доступ только к статическим членам внешнего класса.
Наиболее широко используемый подход для создания объектов «одиночка» (singleton) — это статический вложенный класс, поскольку он не требует никакой синхронизации, его легко изучить и реализовать:
public class Singleton < private Singleton() <>private static class SingletonHolder < private static final Singleton INSTANCE = new Singleton(); >public static Singleton getInstance() < return SingletonHolder.instance; >>
- Если какой-то класс используются только в одном другом классе, то их можно сгруппировать, поместив в один общий класс. Это усиливает инкапсуляцию
- Если вложенный класс не требует какого-либо доступа к членам экземпляра его класса, то лучше объявить его как статический, потому, что таким образом он не будет связан с внешним классом и, следовательно, будет более оптимальным, поскольку ему не потребуется память в куче или в стеке
- Статические вложенные классы не имеют доступа к какому-либо члену экземпляра внешнего класса — он может получить к ним доступ только через ссылку на объект
- Статические вложенные классы могут получить доступ ко всем статическим членам внешнего класса, включая приватные
- Спецификация Java не позволяет объявлять класс верхнего уровня статическим. Только классы внутри других классов могут быть статическими
- Опять же, этот класс привязан к внешнему классу и если внешний наследуется другим классом, то этот не будет унаследован. При этом данный класс можно наследовать, как и он может наследоваться от любого другого класса и имплементировать интерфейс
- По сути статический вложенный класс ничем не отличается от любого другого внутреннего класса за исключением того, что его объект не содержит ссылку на создавший его объект внешнего класса
- Для использования статических методов/переменных/классов нам не нужно создавать объект данного класса
- Яркий пример вложенного статического класса — HashMap.Entry, который предоставляет структуру данных внутри HashMap. Стоит заметить, также как и любой другой внутренний класс, вложенные классы находятся в отдельном файле .class. Таким образом, если вы объявили пять вложенных классов в вашем главном классе, у вас будет 6 файлов с расширением .class
Говоря о ключевом слове static, нельзя не упомянуть о его применении в определении констант — переменных, которые никогда не изменяются.
В языке Java существует зарезервированное слово «const», но оно не используется, и Java не поддерживает константы на уровне языка. Выход из ситуации имеется: для определения константы необходимо добавить модификаторы «static final» к полю класса.
Константы — это статические финальные поля, содержимое которых неизменно. Это относится к примитивам, String, неизменяемым типам и неизменяемым коллекциям неизменяемых типов. Если состояние объекта может измениться, он не является константой.
Модификатор static делает переменную доступной без создания экземпляра класса, а final делает ее неизменяемой. При этом нужно помнить, что если мы сделаем переменную только static, то ее легко можно будет изменить, обратившись к ней через имя класса. Если переменная будет иметь только модификатор final, то при создании каждого экземпляра класса она может быть проинициализирована своим значением. Соответственно, используя совместно модификаторы static и final, переменная остается статической и может быть проинициализирована только один раз. В Java константой считается не та переменная, которую нельзя изменить в рамках одного объекта, а та, которую не могут изменить ни один экземпляр класса в котором она находится (такая переменная создается и инициализируется один раз для всех экземпляров, сколько бы их не было).