Заполнение коллекций( джава 9 )

194
11 мая 2018, 15:29
public class MainClass {
public static void main(String[] args)throws Exception {
    List<Integer> list = List.of(1, 3, 54, 54,5, 4,43);
    System.out.println(list);
    // Строка ниже не компилируется 
    //ArrayList<Integer> list1 = List.of(1, 3, 54, 54,5, 4,43);
    Set<Integer> set = Set.of(1, 3, 54,5, 4,43);
    System.out.println(set);
    Map<String, String> map = Map.ofEntries(Map.entry("11", "111"), Map.entry("htfg", "222"));
    System.out.println(map);
}

}

Насколько я знаю List, Set и Map - это интерфейсы , сами по себе не представляющие реализации, отсюда вопрос какой будет реализация например листа (список(если да , то какой) массив ?????)

Answer 1

The collections created using the factory methods are not commonly used implementations.

For example, the List is not an ArrayList and the Map is not a HashMap. Those are different implementations which are introduced in Java 9. These implementations are internal and their constructors have restricted access.

Конкретно в вашем случае это будет java.util.ImmutableCollections$ListN

Answer 2

метод of возвращает приватные реализации, в примере с List.of(...), это не ArrayList, но это list основанный на массиве. Там же есть тонкости с вызовом например of с одним аргументом, тогда возвращается коллекция вообще не из массива, коллекция которая хранит в себе значение которое вы передали как приватное поле. Тоже самое с сетами. Вот реализация of для List

/**
 * Returns an unmodifiable list containing zero elements.
 *
 * See <a href="#unmodifiable">Unmodifiable Lists</a> for details.
 *
 * @param <E> the {@code List}'s element type
 * @return an empty {@code List}
 *
 * @since 9
 */
static <E> List<E> of() {
    return ImmutableCollections.List0.instance();
}

Как видите, возвращает она List0.

Такая же реализация и для Set и для Map, Set кстати возвращается не hash, а основанный на простом массиве

Вот метод который ищет эллемент в Set который возвращает Set.of(...)

    // returns index at which element is present; or if absent,
    // (-i - 1) where i is location where element should be inserted.
    // Callers are relying on this method to perform an implicit nullcheck
    // of pe
    private int probe(Object pe) {
        int idx = Math.floorMod(pe.hashCode() ^ SALT, elements.length);
        while (true) {
            E ee = elements[idx];
            if (ee == null) {
                return -idx - 1;
            } else if (pe.equals(ee)) {
                return idx;
            } else if (++idx == elements.length) {
                idx = 0;
            }
        }
    }
READ ALSO
Вопрос про front-end. [Java] [требует правки]

Вопрос про front-end. [Java] [требует правки]

Если Java используется в основном для back-end, то что использовать для front-end?

224
Java цикл foreach

Java цикл foreach

Есть функция foo, которая возвращает массив barБудет ли одинакова последовательность работы у цикла foreach, если в качестве иттерируемого объекта...

195
Проблемы с созданием адаптера для RecyclerView

Проблемы с созданием адаптера для RecyclerView

При попытке создать адаптер для RecyclerView возникают проблемы:

180
XML from URL XmlPullParser

XML from URL XmlPullParser

Просьба не ругать сильно, с XML не работал, только учусьПока иду от простого XmlPullParser что бы понять принцип работы

216