-
هڪ صف کي ArrayList ۾ تبديل ڪرڻ .
هڪ صف کي ArrayList ۾ تبديل ڪرڻ لاءِ ، ڊولپر اڪثر ڪري هي طريقو استعمال ڪندا آهن:
List<String> list = Arrays.asList(arr);
Arrays.asList()
هڪ ڪلاس اعتراض واپس ڪندو جيڪو ڪلاس جوArrayList
اندروني پرائيويٽ جامد ڪلاس آهي ، ۽ هي ڪلاس نه آهي، ڪلاس ۾ طريقا شامل آهن ، ,، پر عناصر شامل ڪرڻ لاءِ ڪي به طريقا شامل نه آهن، ان جي سائيز مقرر ٿيل آهي . هڪ حقيقي ٺاهڻ لاء ، هي ڪريو:(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));
ھڪڙو ڪلاس ٺاھيندڙ
java.util.ArrayList
ھڪڙي پيراميٽر جي طور تي وٺي سگھي ٿو سڀ شيون جيڪي ھڪڙي انٽرفيس کي لاڳو ڪن ٿيونCollection
، جنھن تي عمل درآمد ڪلاس کان وراثت ۾ آھي.java.util.Arrays.ArrayList
(نجي جامد ڪلاس ArrayList<E> Extracts AbstractList<E> RandomAccess، java.io.Serializable کي لاڳو ڪري ٿو.
-
هڪ مخصوص قدر لاءِ صف جي جانچ ڪندي.
ڊولپر اڪثر ڪري ڪندا آهن:
Set<String> set = new HashSet<String>(Arrays.asList(arr)); return set.contains(targetValue);
List
ڪوڊ ڪم ڪري ٿو، پر ان کي تبديل ڪرڻ جي ڪا ضرورت ناهيSet
. ۾ تبديل ڪرڻ ۾Set
اضافي وقت لڳندو. حقيقت ۾، هر شيء سادو آهي:Arrays.asList(arr).contains(targetValue);
يا
for(String s: arr){ if(s.equals(targetValue)) return true; } return false;
پهريون طريقو تمام ننڍو آهي.
-
List
لوپ مان هڪ عنصر کي هٽائڻھيٺ ڏنل ڪوڊ تي غور ڪريو جيڪو عناصر کي لوپ ۾ ختم ڪري ٿو:
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);
نتيجو:
[b, d]
اهو هڪ سنگين غلطي ٿي سگهي ٿو. جڏهن هڪ عنصر هٽايو ويندو آهي، سائيز
List
گھٽجي ويندي آهي ۽ عنصر انڊيڪس تبديل ڪندا آهن.تنهن ڪري هن طريقي کان پاسو ڪريو جيڪڏهن توهان انڊيڪس استعمال ڪندي ڪيترن ئي عناصر کي لوپ ۾ هٽائڻ چاهيو ٿا.
توهان شايد ڄاڻو ٿا ته هڪ آئٽرٽر استعمال ڪندي لوپ ۾ عناصر کي هٽائڻ لاء صحيح حل آهي، ۽ توهان کي خبر آهي ته هڪ طرز لوپ
for-each
هڪ آئٽرٽر وانگر ڪم ڪري ٿو، پر اهو ناهي.هيٺ ڏنل ڪوڊ تي غور ڪريو:
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d")); for (String s : list) { if (s.equals("a")) list.remove(s); }
اسان حاصل ڪنداسين ConcurrentModificationException .
ڪرڻ جو صحيح ڪم آهي:
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(); } }
طريقيڪار
لوپ جي طرز ۾next()
کان اڳ سڏيو وڃيremove()
.for-each
، ڪمپلر طريقو سڏيندوremove()
، ۽ صرف پوءnext()
، جيڪو غلطي کي وڌائيندوConcurrentModificationException
. توهان ڪوڊ ڏسي سگهو ٿاArrayList.iterator()
. -
Hashtable
خلافHashMap
.لاڳاپيل عمل جي ڪري، Hashtable ڊيٽا جي جوڙجڪ جو نالو آهي.
پر جاوا ۾ ڊيٽا جي جوڙجڪ جو نالو آهي
HashMap
.Hashtable
۽ جي وچ ۾ هڪ اهم فرقHashMap
اهو آهي ته اهو هم وقت سازي آهي ، تنهنڪري اهو ڪٿيHashtable
استعمال نه ڪيو وڃي .Hashtable
HashMap
HashMap بمقابلہ. TreeMap vs. هيش ٽيبل بمقابلہ LinkedHashMap _
-
مواد جي پابندين کان سواءِ مجموعا استعمال ڪريو
В 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
هي تاليف جي غلطي هن حقيقت جي ڪري ٿي آهي ته ابن ڏاڏن طبقي ۾ ڊفالٽ تعمير ڪندڙ نه آهي. جاوا ۾ ، جيستائين توهان هڪ ڪلاس تعمير ڪندڙ پاڻ کي بيان نه ڪندا، مرتب ڪندڙ هڪ ڊفالٽ تعمير ڪندڙ ٺاهيندو جنهن کي ڪنهن به دليل جي ضرورت ناهي. جيڪڏهن تعمير ڪندڙ طبقي ۾ بيان ڪيو ويو آهي
Super
جيئن تهSuper(String s){}
، مرتب ڪندڙ پاڻ کي ڪجهه به شامل نه ڪندو. اھو اھو آھي جيڪو اسان پنھنجي مثال ۾ ڏسون ٿا.ڪلاس جو ٺاھڻ وارو
Sub
، ڪوئي به فرق نٿو پوي، ڪلاس جي ڊفالٽ ٺاھيندڙ کي سڏيندوSuper
، ڇو ته ٻيو ڪجھ به بيان نه ڪيو ويو آھي. جيئن ته ڪلاس ۾ ڪو به ڊفالٽ تعمير ڪندڙ نه آهيSuper
، اهو هڪ تاليف جي غلطي کي ڏسندو.هن مسئلي جو پهريون حل ڪلاس ۾ هڪ ڊفالٽ تعمير ڪندڙ شامل ڪرڻ آهي
Super
public Super(){ System.out.println("Super"); }
ٻيو اختيار اهو آهي ته تعمير ڪندڙ کي هٽايو وڃي جنهن کي اسان ڪلاس مان بيان ڪيو آهي
Super
ته جيئن مرتب ڪندڙ هڪ ڊفالٽ ڪنسٽرڪٽر ٺاهي.super(value)
۽ آخري آپشن اهو آهي ته ڪلاس ڪنسٽرڪٽرز کي ڪال شامل ڪجيSub
ته جيئن ڊفالٽ ڪنسٽرڪٽر جي بدران موجوده ڪلاس ڪنسٽرڪٽر کي سڏيو وڃيSuper
-
"" يا تعمير ڪندڙ؟
تار ٺاهڻ جا ٻه طريقا آهن:
//1. использовать двойные кавычки String x = "abc";
//2. использовать конструктор String y = new String("abc");
انهن جي وچ ۾ ڪهڙو فرق آهي؟
ان کي توهان هيٺين مثالن مان سمجهي سگهو ٿا:
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
وڌيڪ سکڻ لاءِ ته تارون ڪيئن ميموري ۾ محفوظ ڪيون وڃن ٿيون، پڙهو Create Java String Using "" or Constructor؟ .
GO TO FULL VERSION