Java Collections (Part I)

ამ პოსტში განვიხილავთ 5 ყველაზე გავრცელებულ კითხვას Java Collection თემიდან. ამ კითხვებს ძირითადად დამსაქმებლები უსვამენ ხოლმე გასაუბრებაზე აპლიკანტებს. კითხვებზეც პასუხები შესაბამისად არის მოკლე და მარტივი.

1) როგორ გავფილტროთ Java Collection ?

ყველაზე კარგი გზა Java Collection-ის გასაფილტრად არის ის, რომ გამოვიყენოთ Java 8. Java streams და lambdas შეიძლება გამოყენებული იქნას Java Collection-ის გასაფილტრად.

განვიხილოთ მაგალითი. ვთქვათ გვაქვს Person-ების ლისტი და სტუდენტების ლისტი. გვინდა რომ Person-ების ლისტში საბოლოოდ გვყავდეს ისეთი სტუდენტები, რომლებმაც მიიღეს 50 ქულაზე მეტი. კოდს ექნება შემდეგი სახე :

List<Person> passedStudents = students.stream().filter(p -> p.getMark() > 50).collect(Collectors.toList());

2) როგორ დავალაგოთ Java Collection ?

Java Collection-ის დასალაგებლად გამოვიყენოთ Comparator-ი. ვთქვათ გვაქვს Animal-ების ლისტი. დავწეროთ ამ კლასის შესაბამისი Comparator-ი:

List<Animal> animals = new ArrayList<Animal>();

Comparator<Animal> comparator = new Comparator<Animal>() {

public int compare(Animal c1, Animal c2) {

//sort logic here

return c2.getHeight() c1.getHeight();

}

};

Collections.sort(animals, comparator);

თუ Animal ლასი იმპლემენტაციას უკეთებს Comparable ინტერფეისს, მაშინ შეგვიძლია დავწეროთ :

Collections.sort(animals);

3) საუკეთესო გზა List-ის Set-ში გადასაყვანად ?

Set-ის იმპლემენტაციად გამოვიყენოთ HashSet-ი. მაშინ კოდს ექნება შემდეგი სახე :

Set<Animal> animals = new HashSet<>(animalsList);

4) როდის გამოვიყენოთ LinkedList და როდის ArrayList ?

Java-ს LinkedList-ის იმპლემენტაცია არის ორად ბმული სია (doubled linked list). ArrayList არის ზომაში დინამიურად გაზრდადი მასივის იმპლემენტაცია. ამიტომ, LinkedList რომ შევადაროთ ArrayList-ს იგივეა შევადაროდ ორად ბმული სია დინამიურად გაზრდად მასივს.

LinkedList-ის გავლა (თავიდან ბოლომდე ან ნებისმიერ ელემენტამდე მისვლა) შესაძლებელია მხოლოდ თითო-თიდო ელემენტის გავლით, ანუ არ გვაქვს ელემენტებზე random access, რაც იმას ნიშნავს რომ ნებისმიერ ელემენტს რომ მივწვდეთ ამისი “ფასი” არის LinkedList-ის ზომის პროპორციული, მაშინ როცა ArrayList-ზე გვაქვს random access და ნებისმიერ ელემენტთან წვდომა შეგვიძლია ერთი ოპერაციით.

LinkedList-ი კარგი არის ელემენტის ჩასამატებლად და წასაშლელად კონტეინერში, მაშინ როცა ArrayList-ის შუაში ელემენტის ჩასმა ან შუიდან ელემენტის წაშლა არის შედარებით ძვირი ოპერაცია, რადგან ორივე შემთხვევაში გვიწევს ელემენტების გადაწევა (shift).

რაც შეეხება მეხსიერების მხრივ მათ შედარებას, LinkedList-ს სჭირდება მეტი მეხსიერება, რადგან ის ინახავს მიმთითებლებს მის მეზობლემზე, რაც არ არის საჭირო ArrayList-ის შემთხვევაში.

ეს არის ძირითადი განსხვავებები ArrayList-სა და LinkedList-ს შორის. გაითვალისწინეთ ეს ფაქტორები და თქვენი საჭიროებებიდან და ამოცანებიდან გამომდინარე გადაწყვიტეთ რომელი უფრო მოსახერხებელია თქვენთვის კონკრეტულ შემთხვევაში.

5) რა განსხვავებაა HashMap-სა და HashTable-ს შორის ?

  • HashMap არის synchronized HashTable კი არა.
  • HashMap-ში შესაძლებელია რომ Key და Value-ს მნიშვნელობები იყოს null. რადგან Key უნდა იყოს უნიკალური, შესაძლებელია მხოლოდ ერთი null-ის ქონა Key-დ. HashTable-ში null-ი არ შეიძლება იყოს არც Key და არც Value.
  • LinkedHashMap extends HashMap,რაც იმას ნიშნავს რომ ერთიდან მეორეში კონვერტაცია შესაძლებელია, რაც დაგვეხმარება იმაში რომ გვქონდეს ფიქსირებული იტერაციების მიმდევრობა. ეს არ არის შესაძლებელი HashTable-ში.
To be continued . . . 


One thought on “Java Collections (Part I)

Leave a Reply / უპასუხე

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / შეცვლა )

Twitter picture

You are commenting using your Twitter account. Log Out / შეცვლა )

Facebook photo

You are commenting using your Facebook account. Log Out / შეცვლა )

Google+ photo

You are commenting using your Google+ account. Log Out / შეცვლა )

Connecting to %s