-
ایک صف کو ایک 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> توسیع کرتا ہے 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
.متعلقہ نفاذ کی وجہ سے، ہیش ٹیبل ڈیٹا ڈھانچے کا نام ہے۔
لیکن جاوا میں ڈیٹا ڈھانچے کا نام ہے
HashMap
۔Hashtable
اور کے درمیان ایک اہم فرقHashMap
یہ ہے کہ یہ مطابقت پذیر ہے ۔ اس لیے اسے کہاںHashtable
استعمال نہیں کیا جانا چاہیے ۔Hashtable
HashMap
HashMap بمقابلہ TreeMap بمقابلہ ہیش ٹیبل بمقابلہ لنکڈ ہیش میپ
-
مواد کی پابندیوں کے بغیر مجموعوں کا استعمال کریں۔
В 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
اس بارے میں مزید جاننے کے لیے کہ سٹرنگز کو میموری میں کیسے اسٹور کیا جاتا ہے، "" یا کنسٹرکٹر کا استعمال کرتے ہوئے جاوا سٹرنگ بنائیں؟ .
GO TO FULL VERSION