-
Massivni ArrayList ga aylantirish .
Massivni ArrayList ga aylantirish uchun ishlab chiquvchilar ko'pincha ushbu usuldan foydalanadilar:
List<String> list = Arrays.asList(arr);
Arrays.asList()
sinfningArrayList
ichki xususiy statik klassi bo'lgan sinf ob'ektini qaytaradi va bu sinf emas Sinfda , , usullari mavjud , lekin elementlarni qo'shish uchun hech qanday usullar mavjud emas, uning o'lchami belgilangan . Haqiqiy yaratish uchun quyidagilarni bajaring:(private static class)
Arrays
java.util.ArrayList.
java.util.Arrays.ArrayList
set()
get()
contains()
java.util.ArrayList
ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arr));
Sinf konstruktori
java.util.ArrayList
interfeysni amalga oshiradigan barcha ob'ektlarni parametr sifatida qabul qilishi mumkinCollection
, ularning amalga oshirilishi sinf tomonidan meros qilib olinadi.java.util.Arrays.ArrayList
(xususiy statik sinf ArrayList<E> AbstractList kengaytiradi<E> RandomAccess, java.io.Serializable-ni qo'llaydi).
-
Muayyan qiymat uchun massivni tekshirish.
Ko'pincha ishlab chiquvchilar buni qilishadi:
Set<String> set = new HashSet<String>(Arrays.asList(arr)); return set.contains(targetValue);
List
Kod ishlaydi, lekin uni ga aylantirishning hojati yo'qSet
. OʻzgartirishSet
qoʻshimcha vaqt oladi. Aslida, hamma narsa oddiy:Arrays.asList(arr).contains(targetValue);
yoki
for(String s: arr){ if(s.equals(targetValue)) return true; } return false;
Birinchi usul ancha qisqaroq.
-
Elementni
List
tsikldan olib tashlashLoopdagi elementlarni olib tashlaydigan quyidagi kodni ko'rib chiqing:
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d")); for (int i = 0; i < list.size(); i++) { list.remove(i); } System.out.println(list);
Xulosa:
[b, d]
Bu jiddiy xato bo'lib chiqadi. Element olib tashlanganida, hajmi
List
kamayadi va element indekslari o'zgaradi.Shunday qilib, indeks yordamida tsikldagi bir nechta elementlarni olib tashlamoqchi bo'lsangiz, bu usuldan qoching.
Siz iteratordan foydalanish tsikldagi elementlarni olib tashlash uchun to'g'ri echim ekanligini bilishingiz mumkin va uslublar tsikli
for-each
iterator kabi ishlashini bilasiz, lekin unday emas.Quyidagi kodni ko'rib chiqing:
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d")); for (String s : list) { if (s.equals("a")) list.remove(s); }
Biz ConcurrentModificationException olamiz .
To'g'ri qilish kerak:
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d")); Iterator<String> iter = list.iterator(); while (iter.hasNext()) { String s = iter.next(); if (s.equals("a")) { iter.remove(); } }
Usul
Loop uslubidanext()
dan oldin chaqirilishi kerakremove()
.for-each
kompilyator usulni chaqiradiremove()
va shundan keyinginanext()
xatolik yuzaga keladiConcurrentModificationException
. Siz kodni ko'rishingiz mumkinArrayList.iterator()
. -
Hashtable
qarshiHashMap
.Tegishli amalga oshirish tufayli Hashtable ma'lumotlar strukturasining nomidir.
Lekin Java -da ma'lumotlar strukturasi nomi
HashMap
.Hashtable
va o'rtasidagi asosiy farqlardan biriHashMap
shundaki, u sinxronlashtiriladi, shuning uchun uni qaerdaHashtable
ishlatmaslik kerak .Hashtable
HashMap
HashMap va boshqalar. TreeMap va boshqalar. Hashtable vs. LinkedHashMap .
-
To'plamlardan kontent cheklovlarisiz foydalaning
В Java часто путают коллекции без ограничений по содержимому, и коллекции с маской по типу содержимого. К примеру, для множеств -
Set
это коллекция без ограничений по содержимому, аSet<?>
— коллекция у которой все-таки есть ограничения, но эти ограничения ничего на самом деле не ограничивают. Рассмотрим следующий code, гдеList
без ограничений используется в качестве параметра метода:public static void add(List list, Object o){ list.add(o); } public static void main(String[] args){ List<String> list = new ArrayList<String>(); add(list, 10); String s = list.get(0); }
Данный code выбросит исключение:
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String at …
Использование коллекций без ограничений по содержимому очень опасно, потому что вы не можете быть уверенными в том что там лежит внутри. А для того чтобы понять всю глубину разницы между
Set
,Set<?>
иSet<Object>
— почитайте вот эту и эту ссылки. -
Уровень доступа
Очень часто для полей класса разработчики используют модификатор доступа
public
. Так проще получить meaning поля напрямую. Правильнее использовать How можно более ограниченный доступ к членам класса. ArrayList
противLinkedList
Когда разработчики не знают чем отличается
ArrayList
отLinkedList
, они используют первый в силу его большей известности. Однако, есть огромная разница в производительности между ними. На самом деле, выбор между ними должен быть продиктован их внутренними особенностями —ArrayList
позволяет быстро производить доступ к произвольному элементу массива, аLinkedList
— быстро добавлять/удалять элементы в массиве. Почитайте статью по ссылке ArrayList vs. LinkedList чтобы понять причины их разной производительности.Mutable
(Изменяемый) противImmutable
(Неизменяемый)Неизменяемый an object имеет много преимуществ: простота, безопасность и т.д. Но он требует отдельного an object для каждого нового значения, и за слишком большое количество an objectов придется заплатить понижением производительности. Должен быть баланс при выборе между изменяемым и неизменяемым обьектом.
В основном чтобы избежать подготовки промежуточных an objectов используется изменяемый an object. Один из классических примеров это конкатенация большого количества строк. Если вы используете неизменяемый an object типа
String
, то вы создаете много an objectов, которые сразу попадут в сборщик мусора. Это тратит время и энергию процессора, поэтому правильное решение это использование изменяемых обьектов (напримерStringBuilder
).String result=""; for(String s: arr){ result = result + s; }
Еще один пример использования изменяемых an objectов — передача такого an object в метод. Это позволит вернуть результат в нем же, без создания лишних an objectов. При работе с an objectми большого размера, к примеру коллекциями, передача коллекции в метод для сортировки и возвращение результата в другой коллекции приводит к совершенно излишнему расходу ресурсов. (Ответ пользователя dasblinkenlight на Stack Overflow).
-
Конструкторы классов
Super
иSub
Ushbu kompilyatsiya xatosi ajdodlar sinfida standart konstruktor aniqlanmaganligi sababli yuzaga keladi. Java -da , agar siz sinf konstruktorini o'zingiz belgilamasangiz, kompilyator hech qanday argument talab qilmaydigan standart konstruktor yaratadi. Agar konstruktor sinfda
Super
sifatida tasvirlangan bo'lsaSuper(String s){}
, kompilyatorning o'zi hech narsa qo'shmaydi. Buni biz misolimizda ko'ramiz.Qaysi biri bo'lishidan qat'i nazar, sinf konstruktori
Sub
sinfning standart konstruktorini chaqiradiSuper
, chunki boshqa hech narsa belgilanmagan. Sinfda standart konstruktor yo'qligi sababliSuper
, bu kompilyatsiya xatosiga olib keladi.Ushbu muammoning birinchi yechimi sinfga standart konstruktorni qo'shishdir
Super
public Super(){ System.out.println("Super"); }
Ikkinchi variant esa biz tavsiflagan konstruktorni sinfdan olib tashlashdir,
Super
shunda kompilyator standart konstruktor yaratadi.super(value)
Va oxirgi variant - sinf konstruktorlariga qo'ng'iroqni qo'shishSub
, shunda standart konstruktor o'rniga mavjud sinf konstruktori chaqiriladi.Super
-
"" yoki konstruktormi?
String yaratishning ikki yo'li mavjud:
//1. использовать двойные кавычки String x = "abc";
//2. использовать конструктор String y = new String("abc");
Ularning orasidagi farq nima?
Buni quyidagi misollardan tushunishingiz mumkin:
String a = "abcd"; String b = "abcd"; System.out.println(a == b); // True System.out.println(a.equals(b)); // True String c = new String("abcd"); String d = new String("abcd"); System.out.println(c == d); // False System.out.println(c.equals(d)); // True
Satrlar xotirada qanday saqlanishi haqida ko'proq ma'lumot olish uchun "" yoki Konstruktor yordamida Java satrini yaratish bo'limini o'qing. .
GO TO FULL VERSION