JavaRush /جاوا بلاگ /Random-SD /سطح 26. ليول جي موضوع تي انٽرويو سوالن جا جواب. حصو 1. سو...
zor07
سطح
Санкт-Петербург

سطح 26. ليول جي موضوع تي انٽرويو سوالن جا جواب. حصو 1. سوال 1-5، 10.

گروپ ۾ شايع ٿيل
سطح 26. ليول جي موضوع تي انٽرويو سوالن جا جواب.  حصو 1. سوال 1-5، 10. - 1خلاصو ڪافي مشڪل نڪتو، سو مون ان کي ٻن حصن ۾ ورهايو. ٻئي ڀاڱي ۾ ڪنڪرنسي ۽ ملٽي ٿريڊنگ بابت سوالن جا جواب آهن. پهرين حصي ۾ باقي شامل آهن. لکڻ ڏاڍو ڏکيو هو. مان اڃا تائين گهڻو نه ٿو سمجهان، تنهنڪري هميشه وانگر، تبصرا، تبصرا، اضافو ڀلي ڪري آيا)

1. Comparable انٽرفيس ڪيئن استعمال ڪجي؟

انٽرفيس Comparableصرف ھڪڙي طريقي جو اعلان ڪري ٿو compareTo(Object obj)، ڪلاس جي شين جي ترتيب کي لاڳو ڪرڻ لاء ٺهيل آھي. اهو استعمال ڪرڻ آسان آهي جڏهن ترتيب ڏنل فهرستن يا شين جي صفن کي ترتيب ڏيو. اهو طريقو سڏيو ويندو اعتراض سان گڏ اعتراض طريقي جي ابتڙ equals، جيڪو موٽائي ٿو صحيح يا غلط ، compareToموٽائي ٿو:
  • 0 جيڪڏھن قدر برابر آھن؛
  • هڪ منفي قدر جيڪڏهن ڪالي پيٽرولر کان گهٽ آهي؛
  • مثبت جيڪڏھن ڪالي پيرا ميٽر کان وڏو آھي.
اهو بنيادي طور تي ترتيب ڏنل فهرستن ( java.util.List) ۽ شين جي صفن کي ترتيب ڏيڻ لاء مفيد آهي. جيڪڏهن فهرست/ صف ۾ عناصر شامل آهن جيڪي هن انٽرفيس کي لاڳو ڪن ٿا، پوء اهي خودڪار طريقي سان ترتيب ڏئي سگھجن ٿيون java.util.Collections.sort(List)/Arrays.sort(Object[]). قدرتي ترتيب جو تصور انٽرفيس سان جڙيل آهي Comparable، ڇاڪاڻ ته اهو ڪنهن به طبقي جي مثالن لاءِ هڪ قدرتي ترتيب قائم ڪري ٿو جيڪو هن انٽرفيس کي لاڳو ڪري ٿو. ٻين لفظن ۾، حڪم (x، y) شرط جي پورو ٿيڻ سان ملندو آهي x.compareTo(y) <= 0. لاڳو ڪرڻ جا ضابطا Comparable، يا بلڪه، ان جو طريقو، compareTo(Object)هن ريت آهن (x ۽ y ڪلاس جا مثال آهن جيڪي لاڳو ٿين ٿا Comparable):
  • x.compareTo(y)واپسي -1 يا 1 جيڪڏھن x ھجڻ گھرجي يا y کان پوءِ، ترتيب سان. جيڪڏهن طريقو 0 موٽائي ٿو، پوء آرڊر (x، y) ۽ (y، x) برابر آهن.
  • جيڪڏهن sign(a)هڪ فنڪشن آهي جيڪو واپسي -1,0,1 لاءِ، ترتيب سان، 0 کان گهٽ، 0 جي برابر ۽ 0 کان وڌيڪ، پوءِ برابري کي مطمئن ٿيڻ گهرجي sign(x.compareTo(y))==-sign(y.compareTo(x)). جيڪو منطقي آهي: جيڪڏهن x y کان اڳ اچي، ته پوءِ y کي x کان پوءِ اچڻ گهرجي، ۽ ان جي برعڪس.
  • جيڪڏهن x.compareTo(y) > 0۽ y.compareTo(z) > 0، پوء x.compareTo(z) > 0- عدم مساوات جي منتقلي جو تعلق.
  • جيڪڏهن x.compareTo(y) == 0، پوء sign(x.compare(z)) == sign(y.compareTo(z))، ڪنهن به z لاءِ.
  • ڪال کي x.compareTo(null)هڪ استثنا ڏيڻ گهرجي NullPointerException. اهو عمل جي منطق سان هڪ تڪرار آهي equals(مون کي توهان کي ياد ڏيارڻ ڏيو، x.equals(null)اهو واپس اچي ٿو غلط ).
  • جيڪڏهن y جو قسم x سان مقابلو نه ٿو ڪري سگهجي، ته ڪال کي x.compareTo(y)هڪ استثنا ڏيڻ گهرجي ClassCastException.
  • (x.compareTo(y) == 0) == x.equals(y)، i.e. ڪال x.compareTo(y)موٽڻ لازمي آھي 0 جيڪڏھن ۽ صرف جيڪڏھن اھو سچوx.equals(y) موٽائي . هي تسلسل جو هڪ قاعدو آهي ۽ غور ڪرڻ تمام ضروري آهي.
ذريعن:

2. Comparator انٽرفيس ڪيئن استعمال ڪجي؟

انٽرفيس Comparatorٻن طريقن جو اعلان ڪري ٿو compare(Object obj1, Object obj2)۽ equals(Object obj). انٽرفيس کي استعمال ڪرڻ وقت Comparator، هڪ جوڙيل شين جي مقابلي لاءِ منطق ڪلاس/آبجڪٽ جي اندر لڪيل نه آهي، پر هڪ الڳ ڪلاس ۾ لاڳو ٿئي ٿي. طريقو compare(x,y)بلڪل ساڳيو آهي جيئن ڪال x.compareTo(y). compareTo(Object)سڀني قاعدن کي بلڪل ساڳئي طريقي سان عمل ڪرڻ گهرجي جيئن هڪ انٽرفيس طريقي کي لاڳو ڪرڻ لاء قاعدن Comparable. Comparatorڪٿي به استعمال ڪري سگهجي ٿو جتي ترتيب ڏيڻ جي ضرورت آهي. هن معاملي ۾، سڀ کان پهريان، ضروري لچڪدار ظاهر ٿئي ٿو - ڪيترن ئي ترتيبن جي ضابطن کي لاڳو ڪرڻ جي صلاحيت. ۽ ٻيو، شيون جيڪي ترتيب ڏئي رهيا آهن انهن کي لاڳو نٿو ڪري سگھي Comparable. جيڪڏهن اهي ان تي عمل ڪن ٿا، Comparatorاها ترجيح آهي. انٽرفيس Comparatorپڻ هڪ طريقو بيان ڪري ٿو equals(Object)، متضاد طور تي جيئن اهو لڳي سگهي ٿو. اهو طريقو پاڻ کي انٽرفيس مثالن جو مقابلو ڪري ٿو Comparator۽ صرف ان صورت ۾ صحيح موٽڻ گهرجي جيڪڏهن شيون مقابلي ۾ ساڳيو ترتيب ڏيو. بهرحال، اهو هميشه محفوظ آهي اصل عمل کي Object.equals(Object)برقرار رکڻ لاءِ ماخذ:

3. ڪليڪشن ڪلاس جا ڪهڙا طريقا آهن؟

public static <T> boolean addAll(Collection<? super T> c, T... elements) طريقو شامل ڪري ٿو صف عناصر elementsکي گڏ ڪرڻ ۾ Collection<? super T> c. عناصر انفرادي طور تي يا صف جي طور تي بيان ڪري سگھجن ٿيون. جڏهن عناصر انفرادي طور تي بيان ڪيا ويا آهن، اهو طريقو سڀني عناصر کي آسانيء سان شامل ڪرڻ جي صلاحيت مهيا ڪري ٿو موجوده مجموعي ۾: Collections.addAll(flavors, "Peaches 'n Plutonium", "Rocky Racoon"); public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key) public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c) ٻئي طريقا بائنري سرچ الگورٿم استعمال ڪندي پيٽرولر ۾ پاس ڪيل اعتراض جي پيراميٽر ۾ پاس ڪيل لسٽ کي ڳوليندا آهن. عنصر جي انڊيڪس کي واپس ڏئي ٿو جيڪڏهن فهرست ۾ اهڙو عنصر آهي، ٻي صورت ۾ فهرست جي پهرين عنصر جي انڊيڪس کان وڌيڪ key، جيڪڏهن سڀئي عناصر کان گهٽ آهن key، واپسي list.size(). انهن طريقن کي استعمال ڪرڻ کان پهريان، فهرستن کي ترتيب ڏيڻ گهرجي. پهرين صورت ۾، اهي ترتيب ڏنل آهن ترتيب ڏنل ترتيب ۾ "قدرتي" ترتيب جي فهرست جي ترتيب ۾ (جيئن ئي استعمال ڪندي Collections.sort(list)). ٻي صورت ۾، لسٽ کي لازمي طور تي ترتيب ڏنل ترتيب سان ترتيب ڏنل ترتيب ۾ ترتيب ڏني وئي آهي (ساڳي ترتيب جڏهن استعمال ڪندي Collections.sort(list, c)[هتي "سان" بيان ڪيل طريقي جي پيرا ميٽرن مان هڪ موازنہ آهي]) public static <E> Collection<E> checkedCollection(Collection<E> c, Class<E> type) Preamble: generics mechanism ٻولي ۾ compile-time ٽائپ چيڪنگ مهيا ڪري ٿي. عام طور تي اهو ڪافي آهي، پر ڪڏهن ڪڏهن اهو نه آهي. مثال طور، اسان پنھنجي ڪليڪشن کي لائبريري ڪوڊ ڏانھن منتقل ڪريون ٿا، ڪنھن جاءِ تي اسان لاءِ اڻڄاتل آھي، ۽ اسان واقعي چاھيون ٿا ته ھن ”ٽين پارٽي لائبريري“ جو ڪوڊ غلط قسم جو عنصر اسان جي ڪليڪشن ۾ داخل نه ڪري. اهو ممڪن آهي مسئلو نمبر 1. ممڪن مسئلو نمبر 2 هيٺ ڏنل آهي. اچو ته اسان جو پروگرام اسان کي هڪ پيغام ڏئي ٿو ClassCastException جيڪو اسان کي اطلاع ڏئي ٿو ته غلط قسم جو هڪ عنصر مجموعي ۾ داخل ڪيو ويو آهي. بدقسمتي سان، هي استثنا ڪنهن به وقت اڇلائي سگهجي ٿو جڏهن غلط عنصر داخل ڪيو ويو آهي، ۽ عام طور تي اسان کي مسئلي جي ماخذ بابت ٿورو يا ڪا ڄاڻ نه ڏيندو آهي. طريقه ڪار طريقي کي استعمال ڪندي checkedCollectionاسان پاڻ کي هڪ ۽ ٻه مسئلن کان بچائي سگهون ٿا، ڇاڪاڻ ته اهو طريقو هڪ مجموعو ٺاهي ٿو جيڪو رن ٽائم تي تصديق ٿيل آهي. ھن طريقي کي استعمال ڪندي مسئلو نمبر ٻه حل ڪرڻ: مثال طور، اسان وٽ ھي آھي، ۽ اھو نڪرندو آھي ClassCastException.
Collection<String> c = new HashSet<String>();
مٿي ڏنل ڪوڊ کي عارضي طور تي تبديل ڪري سگھجي ٿو:
Collection<String> c = Collections.checkedCollection(
         new HashSet<String>(), String.class);
جڏهن اسان پروگرام کي ٻيهر هلون ٿا، اسان ڪوڊ جي لائن کي مقامي ڪريون ٿا جيڪو اسان جي مجموعي ۾ غلط قسم جو عنصر داخل ڪري ٿو. منهنجي خيال ۾ لاڳاپيل طريقا: public static <E> List<E> checkedList(List<E> list,Class<E> type) public static <K,V> Map<K,V> checkedMap(Map<K,V> m, Class<K> keyType,Class<V> valueType) public static <E> Set<E> checkedSet(Set<E> s,Class<E> type) public static <K,V> SortedMap<K,V> checkedSortedMap(SortedMap<K,V> m,Class<K> keyType,Class<V> valueType) public static <E> SortedSet<E> checkedSortedSet(SortedSet<E> s,Class<E> type) public static <T> void copy(List<? super T> dest,List<? extends T> src) طريقو نقل ڪري ٿو src عناصر کي منزل ڏانهن. نقل ڪيل عناصر جا انڊيڪس ساڳيا هوندا. public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll) public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) public static <T> T min(Collection<? extends T> coll,Comparator<? super T> comp) public static <T> T max(Collection<? extends T> coll,Comparator<? super T> comp) طريقا "قدرتي ترتيب" (مقابلي واري انٽرفيس) يا پاس ڪيل موازنہ جي ترتيب جي لحاظ سان گڏ ڪرڻ ۾ گھٽ ۾ گھٽ / وڌ ۾ وڌ عنصر کي واپس ڪن ٿا. public static boolean disjoint(Collection<?> c1,Collection<?> c2) واپسي صحيح آهي جيڪڏهن مجموعن ۾ هڪجهڙا عنصر نه هجن. <T> List <T> emptyList(), <K,V> Map <K,V> emptyMap(), <T> Set <T> emptySet()- هڪ خالي لسٽ واپس ڪريو، نقشو ۽ سيٽ، ترتيب سان؛ <T> void fill(List<? super T> list, T obj)- ڏنل عنصر سان لسٽ ڀري ٿو؛ int frequency(Collection<?> c, Object o)- جمع ۾ ڏنل عنصر جي واقعن جو تعداد موٽائي ٿو؛ - n <T> List <T> nCopies(int n, T o) مخصوص عناصر جي ھڪڙي فهرست موٽائي ٿو ؛ - سڀني مخصوص عناصر کي نئين سان تبديل ڪري ٿو؛ - فهرست کي "ريورس"؛ - عنصرن جي مخصوص تعداد جي حساب سان لسٽ کي ڦيرائي ٿو؛ - فهرست عناصر کي ڦيرايو؛ - ھڪڙي عنصر تي مشتمل ھڪڙي سيٽ، لسٽ ۽ ڊسپلي نقشو ٺاھيو؛ - فهرست کي ترتيب ڏيڻ، قدرتي ترتيب ۾ ۽ مطابق استعمال ڪندي؛ - تبديل ٿيل فهرست عناصر کي مخصوص پوزيشن تي. ذريعن: <T> boolean replaceAll(List<T> list, T oldVal, T newVal) void reverse(List<?> list) void rotate(List<?> list, int distance) void shuffle(List<?> list) <T> Set <T> singleton(T o), singletonList(T o), singletonMap(K key, V value) <T extends Comparable<? super T>> void sort(List<T> list), <T> void sort(List<T> list, Comparator<? super T> c) Comparator void swap(List<?> list, int i, int j)

4. Arrays ڪلاس جا ڪهڙا طريقا آهن؟

Arrays ڪلاس جي طريقن جي مڪمل فهرست دستاويزن ۾ ڏسي سگھجي ٿي . هن تت ۾ مان صرف انهن مان چند جو ذڪر ڪندس. [ترجمو ڪيل طريقا دستاويزن مان، ۽ بدقسمتي سان منهنجي ترجمي جو گهڻو حصو گم ٿي ويو. اها شرم جي ڳالهه آهي، ۽ مان ساڳئي شيءِ تي وقت ضايع ڪرڻ نه ٿو چاهيان، تنهنڪري مان پيسٽ ڪندس جيڪو مون گوگل ڪيو] public static <T> List<T> asList(T... a) هڪ فهرست ٺاهي هڪ صف جي بنياد تي. فهرست جي اندروني نمائندگي لاءِ صف استعمال ڪئي ويندي آھي. هي فهرست ۽ اصل صف جي وچ ۾ ڪنيڪشن کي محفوظ ڪري ٿو: صف ۾ تبديليون لسٽ ۾ ظاهر ٿينديون:
String[] a = { "foo", "bar", "baz"};
List<String> list = Arrays.asList(a);
System.out.println(list); // [foo, bar, baz]

a[0] = "aaa";
System.out.println(list); // [aaa, bar, baz]
فهرست ۾ تبديليون صفن ۾ ظاهر ٿينديون:
String[] a = { "foo", "bar", "baz"};
List<String> list = Arrays.asList(a);
System.out.println(list); // [foo, bar, baz]

list.set(0, "bbb");
System.out.println(Arrays.toString(a)); // [bbb, bar, baz]
جيڪڏهن صف ۾ شيون شامل آهن، ظاهر آهي ته صف ۽ فهرست ٻئي ساڳئي مثالن ڏانهن اشارو ڪندا:
Object[] a = { new Object(), new Object(), new Object()};
List<Object> list = Arrays.asList(a);
System.out.println(a[0] == list.get(0)); // true
int binarySearch(параметры)- بنيادي ۽ اعتراض جي قسمن جي صفن ۾ قدر لاءِ بائنري ڳولا کي منظم ڪرڻ لاءِ هڪ اوور لوڊ ٿيل طريقو. پهرين ميچ جي پوزيشن کي واپس آڻيندي؛ void fill(параметры)- هڪ اوورلوڊ ٿيل طريقو مختلف قسمن جي قدرن سان گڏ صفن کي ڀرڻ لاءِ. void sort(parameters) - هڪ اوور لوڊ ٿيل طريقو ڪنهن صف کي ترتيب ڏيڻ لاءِ يا ان جو حصو Comparator انٽرفيس استعمال ڪندي ۽ ان کان سواءِ؛ static <T> T[] copyOf(T[] original, int newLength)- ھڪڙي خاص ڊگھائي جي ھڪڙي صف کي ڀريندو آھي، عناصر کي رد ڪرڻ يا جيڪڏھن ضروري ھجي ته null سان ڀرڻ؛ static <T> T[] copyOfRange(T[] original, int from, int to)- صف جي مخصوص علائقي کي نئين صف ۾ نقل ڪري ٿو؛ <T> List<T> asList(T… a)- ھڪڙو طريقو جيڪو نقل ڪري ٿو صفن جي عناصر کي ھڪڙي اعتراض جي قسم جي List<T> ۾. ذريعو:

5. Collections.sort() سڏڻ وقت استعمال ٿيل ترتيب جو نالو ڇا آهي؟

دستاويزن مان : عمل درآمد ٽم پيٽرس جي پٿون لسٽ ترتيب (TimSort) جي موافقت آهي. هي عمل درآمد لسٽ کي هڪ صف ۾ ڊمپ ڪري ٿو، صف کي ترتيب ڏئي ٿو، پوء فهرست جي ذريعي ٻيهر ورجائي ٿو ۽ هر لسٽ عنصر کي لاڳاپيل صف جي عنصر مان ٻيهر لوڊ ڪري ٿو. هي n*n log(n) پيچيدگيءَ کان پاسو ڪري ٿو جيڪا سڌي طرح ڳنڍيل لسٽ کي ترتيب ڏيڻ جي ڪوشش ڪرڻ سان پيدا ٿئي ٿي وڪي تان : ٽمسورٽ هڪ هائبرڊ ترتيب ڏيڻ وارو الگورٿم آهي جنهن کي شامل ڪرڻ واري ترتيب ۽ مرج جي ترتيب کي گڏ ڪري ٿو، جيڪو 2002 ۾ ٽم پيٽرس پاران شايع ڪيو ويو. Timsort في الحال Python، OpenJDK 7 ۾ معياري ترتيب ڏيڻ وارو الگورتھم آھي ۽ Android JDK 1.5 ۾ لاڳو ٿيل آھي. الورورٿم جو بنيادي خيال اهو آهي ته حقيقي دنيا ۾، ترتيب ڏيڻ واري ڊيٽا جي صفن ۾ اڪثر ترتيب ڏنل ذيلي ذخيرو شامل آهن. اهڙي ڊيٽا تي، Timsort ڪيترن ئي ترتيب ڏيڻ واري الگورتھم کان گهڻو تيز آهي.

10. هڪ تکرار ڪندڙ ڇا آهي؟

جاوا ٻولي جي JDK 1.2 رليز ۾ متعارف ڪرايو ويو انٽرفيس java.util.Iteratorڪنٽينر ڪلاس جي ورهاڱي جي اجازت ڏئي ٿو. هر Iterator طريقن کي لاڳو ڪري ٿو next()۽ hasNext()اختياري طور تي سپورٽ ڪري سگھي ٿو remove(). Iterators ٺاهيا ويندا آهن لاڳاپيل ڪنٽينر طبقن طرفان، عام طور تي iterator(). اهو طريقو next()آئٽرٽر کي ايندڙ قيمت ڏانهن وڌائي ٿو ۽ مخصوص قيمت کي واپسي ڪندڙ ڏانهن موٽائي ٿو. جڏهن شروعاتي طور تي ٺاهي وئي، آئٽرٽر پهرين عنصر کان اڳ هڪ خاص قدر ڏانهن اشارو ڪري ٿو، تنهنڪري پهريون عنصر صرف پهرين ڪال کان پوء حاصل ڪري سگهجي ٿو next(). ان لمحي کي طئي ڪرڻ لاءِ جڏهن ڪنٽينر ۾ سڀني عنصرن کي ورجايو ويو آهي، ٽيسٽ جو طريقو استعمال ڪيو ويندو آهي hasNext(). هيٺ ڏنل مثال بيان ڪري ٿو سادو استعمال ڪرڻ وارن جو:
Iterator iter = list.iterator();
//Iterator<MyType> iter = list.iterator(); в J2SE 5.0
while (iter.hasNext())
    System.out.println(iter.next());
ھڪڙي قسم جي مجموعن لاءِ جيڪو ھن کي سپورٽ ڪري ٿو، آئٽرٽر جو طريقو remove()ڪنٽينر مان آخري 'وزٽ ڪيل' عنصر کي ختم ڪري ٿو. تقريباً ٻين سڀني قسمن جي ڪنٽينر جي تبديليءَ دوران ترميم غير محفوظ آهي. اضافي طور تي، ساڳئي API سان java.util.Listموجود آهي java.util.ListIterator، پر اڳتي وڌڻ ۽ پوئتي موٽڻ جي اجازت ڏئي ٿي، لسٽ ۾ موجوده انڊيڪس جي تعريف مهيا ڪندي ۽ عنصر ڏانهن ان جي پوزيشن طرفان منتقل ڪندي. ذريعو: حصو 2
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION