-
Bir massiwi ArrayList -e öwürmek .
Bir massiwi ArrayList -e öwürmek üçin döredijiler köplenç bu usuly ulanýarlar:
List<String> list = Arrays.asList(arr);
Arrays.asList()
synpyňArrayList
içerki hususy statiki synpy bolan synp obýektini yzyna getirer we bu synp däl Bu synpda usullar bar , ýöne elementleri goşmak üçin hiç hili usul ýok, ululygy kesgitlenendir . Hakyky döretmek üçin muny ýerine ýetiriň:(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));
Synp konstruktory, ýerine ýetiriş synpdan miras galan
java.util.ArrayList
interfeýsi amala aşyrýan ähli obýektleri parametr hökmünde alyp bilerCollection
java.util.Arrays.ArrayList
(hususy statiki synp ArrayList <E> AbstractList <E> RandomAccess, java.io.Serializable-i amala aşyrýar).
-
Belli bir baha üçin bir massiw barlamak.
Döredijiler köplenç muny edýärler:
Set<String> set = new HashSet<String>(Arrays.asList(arr)); return set.contains(targetValue);
List
Kod işleýär, ýöne ony öwürmegiň zerurlygy ýokSet
. ÖwürmekSet
goşmaça wagt alar. Aslynda hemme zat ýönekeý:Arrays.asList(arr).contains(targetValue);
ýa-da
for(String s: arr){ if(s.equals(targetValue)) return true; } return false;
Birinji usul has gysga.
-
Bir elementi
List
aýlawdan aýyrmakAýlawdaky elementleri aýyrýan aşakdaky koda serediň:
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);
Netije:
[b, d]
Bu çynlakaý ýalňyşlyk bolup çykýar. Bir element aýrylanda ululygy
List
azalýar we elementiň görkezijileri üýtgeýär.Şonuň üçin indeks ulanyp, aýlawda birnäçe elementi aýyrmak isleseňiz, bu usuldan gaça duruň.
Iterator ulanmagyň aýlawdaky elementleri aýyrmak üçin dogry çözgütdigini bilip bilersiňiz we stil aýlawynyň
for-each
iterator ýaly işleýändigini bilýärsiňiz, ýöne beýle däl.Aşakdaky koda serediň:
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d")); for (String s : list) { if (s.equals("a")) list.remove(s); }
“ConcurrentModificationException” alarys .
Dogry etmeli zat:
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
Aýlaw stilindenext()
öňünden çagyrylmalydyrremove()
.for-each
düzüji usuly çagyrarremove()
we diňe şondan soňnext()
ýalňyşlyk dörederConcurrentModificationException
. Koda seredip bilersiňizArrayList.iterator()
. -
Hashtable
garşyHashMap
.Degişli ýerine ýetiriş sebäpli “Hashtable” maglumat gurluşynyň adydyr.
Emma Java -da maglumat gurluşynyň ady
HashMap
. Arasyndaky esasy tapawutlaryň biriHashtable
weHashMap
sinhronlaşdyrylmagydyr . Şonuň üçin ony niredeHashtable
ulanmaly däl .Hashtable
HashMap
-
Mazmuny çäklendirmesiz kolleksiýalary ulanyň
В 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
Bu ýygyndy ýalňyşlygy, ata-babalar synpynyň kesgitlenen deslapky konstruktorynyň ýoklugy bilen ýüze çykýar. Java -da , synp konstruktoryny özüňiz görkezmeseňiz, düzüji hiç hili argument talap etmeýän deslapky konstruktor döreder. Eger konstruktor synpda
Super
şeýle suratlandyrylsaSuper(String s){}
, düzüjiniň özi hiç zat goşmaz. Bu biziň mysalymyzda görýän zatlarymyz.Synpyň konstruktory
Sub
, haýsysyna garamazdan, synpyň deslapky konstruktory diýerSuper
, sebäbi başga hiç zat görkezilmedi. Synpda deslapky konstruktor ýoklugy sebäpliSuper
, bu düzüliş ýalňyşlygyna sebäp bolar.Bu meseläniň ilkinji çözgüdi synpa deslapky konstruktor goşmakdyr
Super
public Super(){ System.out.println("Super"); }
Super
Ikinji wariant, düzüjiniň deslapky konstruktor döredmegi üçin synpdan beýan eden konstruktorymyzy aýyrmak .Iň soňky wariant,
super(value)
synp konstruktorlaryna jaň goşmakSub
, deslapky konstruktoryň ýerine bar bolan synp konstruktory çagyrylarSuper
-
"" ýa-da konstruktor?
Setir döretmegiň iki usuly bar:
//1. использовать двойные кавычки String x = "abc";
//2. использовать конструктор String y = new String("abc");
Olaryň arasynda näme tapawut bar?
Muňa aşakdaky mysallardan düşünip bilersiňiz:
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
Setirleriň ýatda saklanýandygy barada has giňişleýin öwrenmek üçin "" ýa-da konstruktor ulanyp, Java setirini dörediň? .
GO TO FULL VERSION