-
Pag-convert ng isang array sa isang ArrayList .
Upang i-convert ang isang array sa isang ArrayList , kadalasang ginagamit ng mga developer ang paraang ito:
List<String> list = Arrays.asList(arr);
Arrays.asList()
ay magbabalik ng class objectArrayList
na isang panloob na pribadong static na klase(private static class)
ng klaseArrays
, at ito ay hindi isang klasejava.util.ArrayList.
Ang klasejava.util.Arrays.ArrayList
ay naglalaman ng mga pamamaraanset()
,get()
,contains()
, ngunit hindi naglalaman ng anumang mga pamamaraan para sa pagdaragdag ng mga elemento, ang laki nito ay naayos na . Upang lumikha ng isang tunayjava.util.ArrayList
, gawin ito:ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arr));
Maaaring kunin ng isang tagabuo ng klase
java.util.ArrayList
bilang isang parameter ang lahat ng mga bagay na nagpapatupad ng isang interfaceCollection
, ang pagpapatupad nito ay minana ng klasejava.util.Arrays.ArrayList
(Ang pribadong static na klase na ArrayList<E> ay nagpapalawak ng AbstractList<E> na nagpapatupad ng RandomAccess, java.io.Serializable).
-
Sinusuri ang isang array para sa isang partikular na halaga.
Madalas itong ginagawa ng mga developer:
Set<String> set = new HashSet<String>(Arrays.asList(arr)); return set.contains(targetValue);
Gumagana ang code, ngunit hindi na kailangang i-convert ito
List
saSet
. Ang pag-convert saSet
ay magtatagal ng karagdagang oras. Sa katunayan, ang lahat ay simple:Arrays.asList(arr).contains(targetValue);
o
for(String s: arr){ if(s.equals(targetValue)) return true; } return false;
Ang unang paraan ay mas maikli.
-
Pag-alis ng isang elemento mula
List
sa isang loopIsaalang-alang ang sumusunod na code na nag-aalis ng mga elemento sa isang loop:
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);
Konklusyon:
[b, d]
Ito ay lumalabas na isang malubhang pagkakamali. Kapag inalis ang isang elemento,
List
mababawasan ang laki at nagbabago ang mga indeks ng elemento.Kaya iwasan ang pamamaraang ito kung gusto mong mag-alis ng maraming elemento sa isang loop gamit ang isang index.
Maaaring alam mo na ang paggamit ng isang iterator ay ang tamang solusyon para sa pag-alis ng mga elemento sa isang loop, at alam mo na ang isang style loop
for-each
ay gumagana tulad ng isang iterator, ngunit ito ay hindi.Isaalang-alang ang sumusunod na code:
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d")); for (String s : list) { if (s.equals("a")) list.remove(s); }
Makakatanggap kami ng ConcurrentModificationException .
Ang tamang gawin ay:
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(); } }
Ang pamamaraan
Sa isang loop stylenext()
ay dapat na tawagan bago angremove()
.for-each
, ang tagatala ay tatawag sa pamamaraanremove()
, at pagkatapos lamangnext()
, na kung saan ay magtataas ng isang errorConcurrentModificationException
. Maaari mong tingnan ang codeArrayList.iterator()
. -
Hashtable
laban saHashMap
.Dahil sa kaukulang pagpapatupad, Hashtable ang pangalan ng istraktura ng data.
Ngunit sa Java ang pangalan para sa isang istraktura ng data ay
HashMap
. Isa sa mga pangunahing pagkakaiba sa pagitanHashtable
ng atHashMap
ay na ito ayHashtable
naka-synchronize. Kaya hindi ito dapat gamitinHashtable
kung saanHashMap
. -
Gumamit ng mga koleksyon nang walang mga paghihigpit sa nilalaman
В 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
Ang error sa compilation na ito ay sanhi ng katotohanan na ang ancestor class ay walang default na constructor na tinukoy. Sa Java , maliban kung ikaw mismo ang tumukoy ng class constructor, gagawa ang compiler ng default na constructor na hindi nangangailangan ng mga argumento. Kung ang constructor ay inilarawan sa klase
Super
bilangSuper(String s){}
, ang compiler mismo ay hindi magdadagdag ng kahit ano. Ito ang nakikita natin sa ating halimbawa.Ang constructor ng class
Sub
, kahit alin, ay tatawag sa default na constructor ng classSuper
, dahil wala nang iba pang tinukoy. Dahil walang default na constructor sa classSuper
, hahantong ito sa isang error sa compilation.Ang unang solusyon sa problemang ito ay ang magdagdag ng default na tagabuo sa klase
Super
public Super(){ System.out.println("Super"); }
Ang pangalawang opsyon ay alisin ang constructor na inilarawan namin mula sa klase
Super
upang ang compiler ay lumikha ng default na constructor.At ang huling pagpipilian ay magdagdag ng isang tawag
super(value)
sa mga konstruktor ng klaseSub
upang ang umiiral na tagabuo ng klase ay tinawag sa halip na ang default na tagabuoSuper
-
" " o tagabuo?
Mayroong dalawang paraan upang lumikha ng isang string:
//1. использовать двойные кавычки String x = "abc";
//2. использовать конструктор String y = new String("abc");
Ano ang pagkakaiba sa pagitan nila?
Maiintindihan mo ito mula sa mga sumusunod na halimbawa:
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
Upang matuto nang higit pa tungkol sa kung paano iniimbak ang mga string sa memorya, basahin ang Lumikha ng Java String Gamit ang "" o Constructor? .
GO TO FULL VERSION