Buffer এবং Queue Collection Classes

Java Technologies - অ্যাপাচি কমন্স কালেকশনস (Apache Common Collection)
161
161

Apache Commons Collections লাইব্রেরি Java Collections Framework (JCF)-এর উপরে অতিরিক্ত ডেটা স্ট্রাকচার এবং ইউটিলিটি ক্লাস সরবরাহ করে। এর মধ্যে Buffer এবং Queue ডেটা স্ট্রাকচার গুরুত্বপূর্ণ ভূমিকা পালন করে। এগুলি এমন ধরনের ডেটা স্ট্রাকচার যা ডেটা ইনপুট এবং আউটপুট প্রক্রিয়া নির্দিষ্টভাবে পরিচালনা করে।

Buffer এবং Queue দুটি সাধারণভাবে ব্যবহৃত FIFO (First In First Out) বা LIFO (Last In First Out) স্ট্রাকচার হতে পারে এবং তারা ডেটা প্রবাহ নিয়ন্ত্রণের জন্য ব্যবহৃত হয়। এই গাইডে আমরা Buffer এবং Queue কিভাবে ব্যবহার করা হয় এবং তাদের বৈশিষ্ট্য সম্পর্কে আলোচনা করবো।


১. Buffer Collection Class

Buffer কোলেকশন ক্লাসগুলি মূলত ডেটা স্টোরেজের একটি স্থায়ী স্থান প্রদান করে যেখানে ডেটা ইনপুট এবং আউটপুট নিয়ন্ত্রণ করা হয়। এটি সাধারণত একটি ক্যাশ বা স্থায়ী স্টোরেজ হিসেবে কাজ করে যেখানে ডেটা সিকোয়েন্সিয়ালি ইনপুট এবং আউটপুট হয়।

Apache Commons CollectionsBuffer ডেটা স্ট্রাকচারের জন্য BlockingBuffer, CircularBuffer এবং Buffer কোলেকশন ক্লাস সরবরাহ করা হয়।

Buffer Example (CircularBuffer)

CircularBuffer হল একটি রিং-বাফার যা নির্দিষ্ট আকারের একটি সার্কুলার বাফারে ডেটা সংরক্ষণ করে। যখন বাফার পূর্ণ হয়ে যায় এবং নতুন আইটেম যোগ করা হয়, তখন পুরানো আইটেমগুলো রিপ্লেস করা হয়। এটি সিস্টেমের মধ্যে সীমিত সম্পদ ব্যবহার করে কার্যকরভাবে ডেটা ম্যানেজ করে।

import org.apache.commons.collections4.buffer.CircularFifoBuffer;

public class BufferExample {
    public static void main(String[] args) {
        // Create a CircularBuffer with a capacity of 3
        CircularFifoBuffer<String> buffer = new CircularFifoBuffer<>(3);

        // Adding elements to the buffer
        buffer.add("apple");
        buffer.add("banana");
        buffer.add("cherry");

        // Buffer is full now, so adding another element will remove the first element
        buffer.add("date");

        // Display the buffer contents
        System.out.println(buffer);  // Output: [banana, cherry, date]
    }
}

এখানে:

  • CircularFifoBuffer একটি CircularBuffer এর উদাহরণ, যা ৩টি আইটেম ধারণ করতে পারে।
  • যখন একটি নতুন আইটেম add() মেথডের মাধ্যমে যোগ করা হয়, তখন পুরানো আইটেমটি স্বয়ংক্রিয়ভাবে রিপ্লেস হয়।

আউটপুট:

[banana, cherry, date]

এটি একটি রিং-বাফার হিসাবে কাজ করে, যেখানে নতুন ডেটা যোগ করার সাথে পুরোনো ডেটা রিপ্লেস হয়।


২. Queue Collection Class

Queue হল একটি ডেটা স্ট্রাকচার যা FIFO (First In First Out) বা LIFO (Last In First Out) প্রক্রিয়া অনুসরণ করে ডেটা ম্যানেজমেন্ট করে। এটি সাধারণত ডেটা ইনপুট এবং আউটপুট করার জন্য ব্যবহৃত হয় যেখানে প্রথমে আসা আইটেম প্রথমে বের হয়ে যায়। এটি বেশিরভাগ ক্ষেত্রে producer-consumer প্যাটার্নে ব্যবহৃত হয়।

Apache Commons Collections লাইব্রেরিতে বিভিন্ন ধরনের Queue ক্লাস সরবরাহ করা হয়, যেমন PriorityQueue, QueueUtils, CircularQueue, ইত্যাদি।

Queue Example (CircularQueue)

CircularQueue হল একটি রিং-স্টাইলের কিউ যা একটি নির্দিষ্ট আকারের কিউতে ডেটা সংরক্ষণ করে। যখন কিউ পূর্ণ হয়ে যায় এবং নতুন আইটেম যোগ করা হয়, তখন পুরানো আইটেমগুলি রিপ্লেস হয়।

import org.apache.commons.collections4.queue.CircularFifoQueue;

public class QueueExample {
    public static void main(String[] args) {
        // Create a CircularQueue with a capacity of 3
        CircularFifoQueue<String> queue = new CircularFifoQueue<>(3);

        // Adding elements to the queue
        queue.add("apple");
        queue.add("banana");
        queue.add("cherry");

        // Queue is full now, so adding another element will remove the first element
        queue.add("date");

        // Display the queue contents
        System.out.println(queue);  // Output: [banana, cherry, date]
    }
}

এখানে:

  • CircularFifoQueue একটি Queue যা FIFO (First In First Out) প্রক্রিয়া অনুসরণ করে ডেটা ধারণ এবং ম্যানেজ করে।
  • যখন কিউ পূর্ণ হয়ে যায় এবং নতুন আইটেম যোগ করা হয়, তখন পুরানো আইটেম রিপ্লেস হয়ে যায়।

আউটপুট:

[banana, cherry, date]

এটি দেখায় কিভাবে Queue ব্যবহার করে ডেটা ইনপুট এবং আউটপুট প্রক্রিয়া পরিচালনা করা যায়।

Queue Example (PriorityQueue)

PriorityQueue হল একটি কিউ যেখানে আইটেমগুলি একটি নির্দিষ্ট অর্ডারে (যেমন, প্রাধান্য বা মানের উপর ভিত্তি করে) সাজানো হয়। এটি একটি natural ordering বা Comparator এর মাধ্যমে কাজ করতে পারে।

import java.util.PriorityQueue;

public class PriorityQueueExample {
    public static void main(String[] args) {
        // Create a PriorityQueue of integers
        PriorityQueue<Integer> pq = new PriorityQueue<>();

        // Adding elements to the priority queue
        pq.add(10);
        pq.add(5);
        pq.add(20);
        pq.add(15);

        // Display the elements in the priority queue
        while (!pq.isEmpty()) {
            System.out.println(pq.poll());  // Output: 5, 10, 15, 20
        }
    }
}

এখানে:

  • PriorityQueue ব্যবহার করে একটি কিউ তৈরি করা হয়েছে যেখানে আইটেমগুলি ছোট থেকে বড় অর্ডারে সাজানো হয়।
  • poll() মেথডের মাধ্যমে কিউ থেকে আইটেমগুলো বের করা হচ্ছে।

আউটপুট:

5
10
15
20

এটি একটি প্রাধান্য ভিত্তিক কিউ, যেখানে আইটেমগুলো তাদের প্রাধান্য অনুযায়ী সাজানো হয়।


৩. Buffer এবং Queue এর মধ্যে পার্থক্য

  • Buffer সাধারণত সিকোয়েন্সিয়াল ডেটা প্রবাহে ব্যবহৃত হয় (যেমন, ডেটা প্রক্রিয়া করার জন্য একটি ত্রুটিহীন এবং সীমিত স্টোরেজ ধারণা)।
  • Queue ডেটা ইনপুট এবং আউটপুট প্রক্রিয়া নিয়ন্ত্রণ করার জন্য ব্যবহৃত হয়, যেখানে FIFO (First In First Out) বা LIFO (Last In First Out) প্যাটার্ন অনুসরণ করা হয়।

সারাংশ

Apache Commons Collections এর Buffer এবং Queue ডেটা স্ট্রাকচারগুলি ডেটা ম্যানেজমেন্টের জন্য অত্যন্ত কার্যকরী এবং জনপ্রিয়। Buffer সাধারণত সিকোয়েন্সিয়াল ডেটা প্রবাহ নিয়ন্ত্রণের জন্য ব্যবহৃত হয় এবং Queue ডেটা ইনপুট ও আউটপুট প্রক্রিয়া পরিচালনা করে, যেমন FIFO বা LIFO প্যাটার্নে। CircularFifoQueue, CircularFifoBuffer, PriorityQueue এগুলি এই লাইব্রেরির মধ্যে প্রচলিত ক্লাস যা ডেটা প্রবাহ নিয়ন্ত্রণে সাহায্য করে এবং প্রোগ্রামিংয়ে আরো কার্যকরী ফিচার সরবরাহ করে।

common.content_added_by

Buffer কি এবং এর প্রকারভেদ

178
178

Apache Commons Collections লাইব্রেরি Buffer ডাটা স্ট্রাকচার সরবরাহ করে, যা সাধারণত ফার্স্ট ইন ফার্স্ট আউট (FIFO) টাইপের কিউ হিসাবে ব্যবহৃত হয়। Buffer হলো একটি ডাটা স্টোরেজ, যেখানে উপাদানগুলি ধারাবাহিকভাবে অ্যাড করা হয় এবং সেগুলি ধারাবাহিকভাবে বের করা হয়। Queue বা Stack এর মতো ডাটা স্ট্রাকচারগুলোতে Buffer একইভাবে কাজ করে, তবে এটির মধ্যে বিশেষ কিছু বৈশিষ্ট্য এবং ব্যবহার রয়েছে, যা এটি আরও শক্তিশালী ও নমনীয় করে তোলে।

Buffer এর প্রধান বৈশিষ্ট্য হলো এটি একটি অস্থায়ী স্টোরেজ (temporary storage) হিসেবে কাজ করে এবং এর মাধ্যমে ডাটা আউটপুট এবং ইনপুট প্রক্রিয়া খুব সহজে পরিচালিত হয়।


Buffer কি?

Buffer হল একটি ডাটা স্ট্রাকচার যেখানে ডাটা আপলোড এবং ডাউনলোড করার সময় FIFO (First In First Out) পদ্ধতি অনুসরণ করা হয়। এটি মূলত ডাটা স্টোরেজ, যা প্রক্রিয়াজাতকরণ বা ট্রান্সফার হওয়া ডাটাকে সাময়িকভাবে সংরক্ষণ করে রাখে।

উদাহরণস্বরূপ, আপনি যখন কোনো প্রোগ্রামে ব্রডকাস্ট সিস্টেম বা ডাটা পাম্পিং করতে চান, তখন Buffer ব্যবহার করা যেতে পারে যাতে একের পর এক ডাটা পাঠানো বা গ্রহণ করা যায়।

এছাড়া, Apache Commons Collections লাইব্রেরি Buffer এর জন্য আরও কিছু ইন্টারফেস এবং ক্লাস প্রদান করে, যা বিশেষ কিছু ডাটা ম্যানেজমেন্ট এবং পারফরম্যান্স উন্নত করতে সাহায্য করে।


Buffer এর প্রকারভেদ:

  1. CircularBuffer (Circular Queue)
  2. LinkedBuffer (Linked List Buffer)
  3. FixedBuffer

1. CircularBuffer (Circular Queue):

CircularBuffer একটি বিশেষ ধরনের FIFO Queue যেখানে স্টোরেজ এর সীমা শেষ হলে এটি আবার প্রথম থেকে ডাটা সংরক্ষণ করতে শুরু করে। অর্থাৎ, এর মধ্যে যত ডাটা থাকবে, তা চক্রাকারভাবে প্রবাহিত হবে। এটি এমন একটি ডাটা স্ট্রাকচার যেখানে Buffer overflow সমস্যা হবেনা এবং যে ডাটা প্রয়োজন হবে, তা overwrite হতে থাকবে।

CircularBuffer Example:

import org.apache.commons.collections4.buffer.CircularFifoBuffer;

public class CircularBufferExample {
    public static void main(String[] args) {
        // CircularBuffer with capacity of 3
        CircularFifoBuffer<Integer> buffer = new CircularFifoBuffer<>(3);

        buffer.add(1);
        buffer.add(2);
        buffer.add(3);
        System.out.println(buffer);  // Output: [1, 2, 3]

        buffer.add(4);  // Adds 4, causing 1 to be removed
        System.out.println(buffer);  // Output: [2, 3, 4]

        buffer.add(5);  // Adds 5, causing 2 to be removed
        System.out.println(buffer);  // Output: [3, 4, 5]
    }
}

এখানে:

  • CircularFifoBuffer একটি Circular Buffer তৈরি করেছে যার ক্যাপাসিটি ৩।
  • যখন ৪ নম্বর উপাদানটি অ্যাড করা হয়, তখন পুরানো ১ নম্বর উপাদানটি সরিয়ে ফেলা হয় এবং নতুন উপাদানটি (৪) অন্তর্ভুক্ত হয়।

2. LinkedBuffer (Linked List Buffer):

LinkedBuffer হল এমন একটি buffer যা linked list এর উপরে তৈরি হয়। এখানে ডাটা একেকটি নোড হিসেবে linked list-এ স্টোর করা হয়, এবং আপনি প্রতিটি নোড থেকে দ্রুত ডাটা অ্যাক্সেস করতে পারেন।

এই ধরনের বাফার খুবই উপকারী যখন আপনার প্রোজেক্টে দ্রুত ইনপুট এবং আউটপুট প্রক্রিয়া করতে হয় এবং তালিকা সাইজ পরিবর্তনশীল হয়।

LinkedBuffer Example:

import org.apache.commons.collections4.buffer.LinkedBuffer;

public class LinkedBufferExample {
    public static void main(String[] args) {
        // LinkedBuffer
        LinkedBuffer<String> buffer = new LinkedBuffer<>();
        
        buffer.add("apple");
        buffer.add("banana");
        buffer.add("cherry");
        
        System.out.println(buffer);  // Output: [apple, banana, cherry]

        buffer.remove();  // Removes "apple"
        System.out.println(buffer);  // Output: [banana, cherry]
    }
}

এখানে:

  • LinkedBuffer ব্যবহারের মাধ্যমে linked list টাইপের ডাটা স্টোরেজ তৈরি করা হয়েছে।
  • এই ডাটা স্ট্রাকচারেও ডাটা FIFO পদ্ধতিতে যুক্ত এবং মুছে ফেলা হয়।

3. FixedBuffer:

FixedBuffer একটি স্থির সাইজের buffer যা পূর্বনির্ধারিত সীমার মধ্যে ডাটা সংরক্ষণ করে। এটি সাধারণত এমন পরিস্থিতিতে ব্যবহৃত হয় যেখানে ডাটার আকার বা ক্যাপাসিটি প্রেডিক্টেবল এবং পরিবর্তনশীল নয়।

FixedBuffer Example:

import org.apache.commons.collections4.buffer.FixedFifoBuffer;

public class FixedBufferExample {
    public static void main(String[] args) {
        // FixedBuffer with fixed capacity of 3
        FixedFifoBuffer<String> buffer = new FixedFifoBuffer<>(3);
        
        buffer.add("item1");
        buffer.add("item2");
        buffer.add("item3");
        System.out.println(buffer);  // Output: [item1, item2, item3]

        buffer.add("item4");  // Causes the buffer to overflow
        System.out.println(buffer);  // Output: [item2, item3, item4]
    }
}

এখানে:

  • FixedFifoBuffer এর মধ্যে একসাথে সর্বোচ্চ ৩টি উপাদান রাখা যেতে পারে।
  • যখন ৪ নম্বর উপাদানটি যুক্ত করা হয়, তখন ১ নম্বর উপাদানটি মুছে ফেলা হয়, কারণ এটি FIFO পদ্ধতি অনুসরণ করে।

Buffer এর সঠিক ব্যবহার:

  • SynchronizedBuffer: যদি আপনি একাধিক থ্রেডের মাধ্যমে বাফার পরিচালনা করতে চান, তবে আপনাকে Thread-safe সিঙ্ক্রোনাইজড বাফার ব্যবহার করতে হবে।
  • CircularBuffer: যদি আপনি এমন পরিস্থিতিতে কাজ করছেন যেখানে পুরনো ডাটা overwrite করা প্রয়োজন এবং ডাটা স্টোরেজের সীমা রয়েছে, তবে এটি ব্যবহার করা উপযুক্ত।
  • FixedBuffer: যদি আপনার বাফারটির সাইজ এবং সীমা নির্দিষ্ট থাকে, তবে এটি ব্যবহার করা যেতে পারে।

Buffer এর প্রকারভেদের সুবিধা এবং ব্যবহার ক্ষেত্র:

Buffer TypeDescriptionUse Case
CircularBufferFixed size, overwrites old data with new entries (FIFO).For scenarios where data is cyclic or needs overwriting (e.g., ring buffers).
LinkedBufferBased on linked list; allows dynamic size management.For scenarios where the data size varies or needs to grow dynamically.
FixedBufferA buffer with fixed capacity; no resizing is allowed.For fixed-size collections where capacity is predictable and limited.

সারাংশ

Buffer এমন একটি ডাটা স্ট্রাকচার যা ডাটা প্রক্রিয়াকরণে ব্যবহৃত হয় এবং FIFO (First In First Out) পদ্ধতি অনুসরণ করে। Apache Commons CollectionsCircularBuffer, LinkedBuffer, এবং FixedBuffer এর মতো বিভিন্ন ধরনের বাফার সরবরাহ করা হয়েছে। আপনি thread-safe ডাটা স্টোরেজ, cyclic data handling, এবং fixed capacity buffers ব্যবহারের জন্য এই ক্লাসগুলো ব্যবহার করতে পারেন। Buffer এর সঠিক ব্যবহার আপনার ডাটা স্টোরেজ এবং ব্যবস্থাপনা পদ্ধতিকে আরও কার্যকরী এবং সুরক্ষিত করে তোলে।

common.content_added_by

BoundedBuffer, CircularFifoBuffer এবং UnboundedFifoBuffer

138
138

Apache Commons Collections লাইব্রেরি একাধিক বিশেষ ধরনের ডেটা স্ট্রাকচার সরবরাহ করে, যেগুলি বিশেষ পরিস্থিতিতে কাজ করার জন্য তৈরি করা হয়। এই ডেটা স্ট্রাকচারগুলির মধ্যে BoundedBuffer, CircularFifoBuffer, এবং UnboundedFifoBuffer উল্লেখযোগ্য। এগুলি মূলত FIFO (First-In, First-Out) পদ্ধতিতে কাজ করে এবং এগুলোর ব্যবহারের ক্ষেত্রে আপনার নির্দিষ্ট প্রয়োজন অনুযায়ী বাউন্ডেড (সীমাবদ্ধ) অথবা আনবাউন্ডেড (সীমাহীন) বাফার প্রয়োজন হতে পারে।

1. BoundedBuffer

BoundedBuffer একটি বাফার যা একটি নির্দিষ্ট আকারে সীমাবদ্ধ। এর মানে হল যে এটি একটি নির্দিষ্ট সীমা নির্ধারণ করে এবং যখন বাফার পূর্ণ হয়ে যায়, তখন নতুন উপাদান প্রবেশ করতে গেলে পুরনো উপাদানগুলো সরিয়ে ফেলা হয়। এটি সাধারণত producer-consumer প্যাটার্নে ব্যবহৃত হয় যেখানে একটি প্রোডিউসার (producer) উপাদান প্রদান করে এবং কনজিউমার (consumer) সেগুলি গ্রহণ করে।

BoundedBuffer এর বৈশিষ্ট্য:

  • Synchronized: এটি থ্রেড-সেফ এবং একাধিক থ্রেডের মধ্যে নিরাপদভাবে কাজ করতে পারে।
  • Fixed Size: এটি একটি নির্দিষ্ট আকারের বাফার তৈরি করে, যখন আকার পূর্ণ হয়, তখন পুরনো উপাদানগুলিকে সরিয়ে নতুন উপাদান গ্রহণ করে।
  • Producer-Consumer Model: এটি প্রোডিউসার এবং কনজিউমার মডেলে ব্যবহৃত হয় যেখানে উপাদানগুলো একে অপরকে প্রদান বা গ্রহণ করতে থাকে।

BoundedBuffer উদাহরণ:

import org.apache.commons.collections4.buffer.BoundedBuffer;
import org.apache.commons.collections4.buffer.CircularFifoBuffer;

public class BoundedBufferExample {
    public static void main(String[] args) {
        // Create a BoundedBuffer of size 3
        BoundedBuffer<String> buffer = new CircularFifoBuffer<>(3);

        // Add elements
        buffer.add("apple");
        buffer.add("banana");
        buffer.add("orange");

        // At this point, the buffer is full. Adding a new element will remove the oldest element
        buffer.add("grape");

        // Print the buffer contents
        System.out.println("Buffer Contents: " + buffer);
    }
}

Output:

Buffer Contents: [banana, orange, grape]

ব্যাখ্যা:

  • এখানে, BoundedBuffer এর আকার ৩ নির্ধারণ করা হয়েছে, এবং এর মধ্যে সর্বোচ্চ ৩টি উপাদান থাকতে পারে।
  • যখন grape যোগ করা হয়, তখন apple সরিয়ে ফেলা হয়, কারণ বাফার পূর্ণ হয়ে গেছে।

2. CircularFifoBuffer

CircularFifoBuffer একটি বিশেষ ধরনের বাফার যা একটি সীমিত আকারে উপাদান ধারণ করে এবং FIFO (First-In, First-Out) পদ্ধতিতে কাজ করে। যখন বাফার পূর্ণ হয় এবং নতুন উপাদান যোগ করা হয়, তখন প্রথম যোগ করা উপাদানটি (oldest element) সরিয়ে ফেলা হয়। এটি একটি বাউন্ডেড বাফার, যেখানে ডেটা একটি circular queue এর মতো সঞ্চালিত হয়।

CircularFifoBuffer এর বৈশিষ্ট্য:

  • Fixed Size: এটি একটি নির্দিষ্ট আকারের বাফার ব্যবহার করে।
  • FIFO: পুরনো উপাদানকে সরিয়ে নতুন উপাদান গ্রহণ করে।
  • Efficient: এটি দ্রুতভাবে নতুন উপাদানগুলিকে যোগ এবং পুরনো উপাদানগুলিকে সরিয়ে দেয়।

CircularFifoBuffer উদাহরণ:

import org.apache.commons.collections4.buffer.CircularFifoBuffer;

public class CircularFifoBufferExample {
    public static void main(String[] args) {
        // Create a CircularFifoBuffer of size 3
        CircularFifoBuffer<String> buffer = new CircularFifoBuffer<>(3);

        // Add elements
        buffer.add("apple");
        buffer.add("banana");
        buffer.add("orange");

        // At this point, the buffer is full. Adding a new element will remove the oldest element
        buffer.add("grape");

        // Print the buffer contents
        System.out.println("CircularFifoBuffer Contents: " + buffer);
    }
}

Output:

CircularFifoBuffer Contents: [banana, orange, grape]

ব্যাখ্যা:

  • CircularFifoBuffer এর আকার ৩ নির্ধারণ করা হয়েছে এবং এতে সর্বোচ্চ ৩টি উপাদান থাকতে পারে।
  • যখন grape যোগ করা হয়, তখন apple সরিয়ে ফেলা হয়, কারণ এটি বাফারের সবচেয়ে পুরনো উপাদান।

3. UnboundedFifoBuffer

UnboundedFifoBuffer একটি FIFO (First-In, First-Out) বাফার যা কোনও আকারের সীমা ছাড়াই উপাদান ধারণ করতে পারে। এর মানে হল যে এটি কোনও নির্দিষ্ট সীমার মধ্যে সীমাবদ্ধ নয় এবং ইনপুট হিসাবে যতটুকু ডেটা আসে তা সরাসরি গ্রহণ করে।

UnboundedFifoBuffer এর বৈশিষ্ট্য:

  • Unbounded: এটি আকারের সীমা ছাড়াই ডেটা ধারণ করতে পারে।
  • FIFO: এটি FIFO পদ্ধতিতে কাজ করে, অর্থাৎ প্রথমে যোগ করা উপাদানটি প্রথমে বের হয়ে আসে।
  • Dynamic Size: এটি ডেটার আকারের উপর নির্ভর করে আকার বাড়াতে বা কমাতে পারে।

UnboundedFifoBuffer উদাহরণ:

import org.apache.commons.collections4.buffer.UnboundedFifoBuffer;

public class UnboundedFifoBufferExample {
    public static void main(String[] args) {
        // Create an UnboundedFifoBuffer
        UnboundedFifoBuffer<String> buffer = new UnboundedFifoBuffer<>();

        // Add elements
        buffer.add("apple");
        buffer.add("banana");
        buffer.add("orange");

        // Adding more elements, no size limit
        buffer.add("grape");
        buffer.add("kiwi");

        // Print the buffer contents
        System.out.println("UnboundedFifoBuffer Contents: " + buffer);
    }
}

Output:

UnboundedFifoBuffer Contents: [apple, banana, orange, grape, kiwi]

ব্যাখ্যা:

  • UnboundedFifoBuffer আকারের কোনও সীমা ছাড়াই উপাদান ধারণ করতে পারে, এবং এটি FIFO পদ্ধতিতে কাজ করে।
  • এখানে, কোন উপাদান সরানো হয় না কারণ এটি একটি আনবাউন্ডেড বাফার এবং এতে যতটুকু উপাদান আসে, ততটুকু সঞ্চিত থাকে।

BoundedBuffer, CircularFifoBuffer, এবং UnboundedFifoBuffer এর মধ্যে পার্থক্য:

FeatureBoundedBufferCircularFifoBufferUnboundedFifoBuffer
Size LimitFixed size (bounded)Fixed size (bounded)No size limit (unbounded)
Data RemovalRemoves the oldest element when fullRemoves the oldest element when fullNo removal needed, grows dynamically
FIFOYes, maintains first-in, first-out orderYes, maintains first-in, first-out orderYes, maintains first-in, first-out order
UsageUseful for fixed-size data buffer in producer-consumer modelsUseful for scenarios where data is cyclic and old data is replacedUseful for scenarios where the data buffer is unlimited
MemoryLimited memory usage based on fixed sizeFixed memory usage based on buffer sizeDynamic memory usage based on data volume

Conclusion

BoundedBuffer, CircularFifoBuffer, এবং UnboundedFifoBuffer হল FIFO (First-In, First-Out) বাফারগুলির বিভিন্ন ধরনের বাস্তবায়ন যা Apache Commons Collections লাইব্রেরি সরবরাহ করে।

  • BoundedBuffer একটি নির্দিষ্ট আকারে সীমাবদ্ধ বাফার, যা পুরনো উপাদানগুলি সরিয়ে নতুন উপাদান গ্রহণ করে।
  • CircularFifoBuffer একটি নির্দিষ্ট আকারের সাইক্লিক বাফার, যা FIFO পদ্ধতিতে কাজ করে এবং যখন এটি পূর্ণ হয় তখন পুরনো উপাদানগুলি সরিয়ে ফেলে।
  • UnboundedFifoBuffer আকারের সীমা ছাড়াই উপাদান ধারণ করে এবং FIFO পদ্ধতিতে চলতে থাকে।

এই বাফারগুলির মধ্যে পার্থক্য বুঝে আপনি আপনার প্রজেক্টের প্রয়োজন অনুযায়ী উপযুক্ত বাফার নির্বাচন করতে পারবেন।

common.content_added_by

Queue এবং Deque এর মধ্যে পার্থক্য

119
119

Queue এবং Deque উভয়ই Java Collections Framework এর অংশ এবং তারা ডেটা স্ট্রাকচার হিসেবে ব্যবহার হয় যেখানে ডেটা প্রক্রিয়া করার জন্য একটি নির্দিষ্ট আদর্শ (order) অনুসরণ করা হয়। তবে, তাদের মধ্যে কিছু মৌলিক পার্থক্য রয়েছে যা তাদের ব্যবহারের ক্ষেত্রে প্রভাব ফেলে। এখানে আমরা Queue এবং Deque এর মধ্যে পার্থক্য এবং ব্যবহার আলোচনা করব।


1. Queue (Queue Interface)


Queue একটি ডেটা স্ট্রাকচার যা FIFO (First-In-First-Out) নিয়মে কাজ করে, অর্থাৎ প্রথমে যে উপাদানটি যুক্ত হয়, সেটি প্রথমে বের হয়। এটি একটি সাধারণ লাইন বা কিউ-এর মতো কাজ করে, যেমন লাইনে দাঁড়িয়ে থাকা। যখন একটি উপাদান কিউ থেকে বের করা হয়, তখন নতুন উপাদান সেটির স্থানে যোগ করা হয়।

Queue এর বৈশিষ্ট্য:

  • FIFO পদ্ধতি অনুযায়ী উপাদান বের করা হয়।
  • সাধারণত, enqueue (যোগ করা) এবং dequeue (বের করা) অপারেশন থাকে।
  • এটি সাধারণত Queue বা PriorityQueue এর মতো বাস্তবায়ন ব্যবহার করে।

Queue Interface এর উদাহরণ:

import java.util.LinkedList;
import java.util.Queue;

public class QueueExample {
    public static void main(String[] args) {
        // Create a Queue using LinkedList
        Queue<String> queue = new LinkedList<>();
        
        // Add elements to the queue
        queue.add("apple");
        queue.add("banana");
        queue.add("orange");
        
        // Remove elements from the queue (FIFO)
        System.out.println(queue.poll());  // Output: apple
        System.out.println(queue.poll());  // Output: banana
    }
}

এখানে, প্রথমে "apple" যোগ করা হয়েছে এবং সেটি প্রথমে বের করা হয়েছে, এটি FIFO আদর্শ অনুসরণ করে।


2. Deque (Deque Interface)


Deque (যা "Double-Ended Queue" এর সংক্ষেপ) একটি ডেটা স্ট্রাকচার যা queue এর মতো কাজ করে তবে এতে দুটি শেষ (front এবং rear) থাকে। এটি উপাদান যুক্ত এবং সরানোর জন্য দুটি দিক থেকে কাজ করতে সক্ষম (যেমন, সামনে এবং পেছনে)। এর মানে হলো, আপনি FIFO বা LIFO (Last-In-First-Out) যে কোনো পদ্ধতি অনুসরণ করে উপাদান বের করতে পারেন, যা Queue থেকে আরও উন্নত।

Deque এর বৈশিষ্ট্য:

  • FIFO এবং LIFO উভয় পদ্ধতিতে উপাদান প্রক্রিয়া করা যায়।
  • ডাবল এন্ডেড কিউ হওয়ায়, এটি উভয় দিক থেকে উপাদান যোগ বা সরানোর সুবিধা দেয়।
  • addFirst(), addLast(), removeFirst(), এবং removeLast() এর মতো পদ্ধতি থাকে।

Deque Interface এর উদাহরণ:

import java.util.ArrayDeque;
import java.util.Deque;

public class DequeExample {
    public static void main(String[] args) {
        // Create a Deque using ArrayDeque
        Deque<String> deque = new ArrayDeque<>();
        
        // Add elements to the front and rear
        deque.addFirst("apple");
        deque.addLast("banana");
        deque.addFirst("orange");
        
        // Remove elements from the front and rear
        System.out.println(deque.pollFirst());  // Output: orange (FIFO)
        System.out.println(deque.pollLast());   // Output: banana (LIFO)
    }
}

এখানে, Deque ব্যবহার করে উপাদান দুটি দিক থেকে যোগ এবং সরানো হয়েছে। addFirst() এবং addLast() এর মাধ্যমে উপাদান যুক্ত করা হয়েছে, এবং pollFirst() এবং pollLast() এর মাধ্যমে উপাদান সরানো হয়েছে।


Queue এবং Deque এর মধ্যে পার্থক্য

পয়েন্টQueueDeque
অর্থQueue একটি সাধারণ একমুখী (FIFO) ডেটা স্ট্রাকচার।Deque একটি ডাবল এন্ডেড কিউ, যা উভয় দিক থেকে উপাদান প্রক্রিয়া করতে সক্ষম।
ডেটা প্রবাহFIFO পদ্ধতিতে উপাদান প্রবাহিত হয়।FIFO বা LIFO উভয় পদ্ধতি অনুসরণ করতে পারে।
অপারেশনadd(), remove(), peek()addFirst(), addLast(), removeFirst(), removeLast()
দিকশুধুমাত্র একটি দিক থেকে উপাদান অ্যাক্সেস করা যায়।উভয় দিক থেকে উপাদান অ্যাক্সেস এবং প্রক্রিয়া করা যায়।
ব্যবহারসাধারণ কিউ সিস্টেম (যেমন প্রিন্টার কিউ বা লাইনে দাঁড়ানো)।কিউ এবং স্ট্যাক উভয়ের সুবিধা, যেমন ক্যাশে সিস্টেম বা Undo operations
প্রকারসাধারণত Queue, PriorityQueue ব্যবহার হয়।সাধারণত ArrayDeque, LinkedList ব্যবহার হয়।

কখন Queue ব্যবহার করবেন?

  • যখন আপনি একটি সাধারণ FIFO সিস্টেম তৈরি করতে চান, যেমন প্রিন্টার কিউ, লাইনে দাঁড়ানো, বা বিজ্ঞানী গবেষণার জন্য ডেটা প্রক্রিয়া
  • যখন আপনাকে উপাদানগুলো নির্দিষ্ট ক্রমে প্রক্রিয়া করতে হবে (যেমন প্রথমে আসা উপাদানকে আগে প্রক্রিয়া করা)।

কখন Deque ব্যবহার করবেন?

  • যখন আপনি এমন কিউ তৈরি করতে চান যা FIFO (প্রথমে আসা, প্রথমে বের হওয়া) এবং LIFO (শেষে আসা, প্রথমে বের হওয়া) উভয় পদ্ধতিতে কাজ করতে পারে।
  • যখন আপনি ডাবল এন্ডেড কিউ ব্যবহার করতে চান, যেমন Undo/Redo অপারেশন, LRU Cache, বা অন্যান্য কার্যকরী অপারেশন যেখানে উভয় দিক থেকে উপাদান বের করা দরকার।

সারাংশ


Queue এবং Deque উভয়ই জাভাতে ডেটা স্ট্রাকচার হিসেবে ব্যবহৃত হয়, তবে তাদের মধ্যে পার্থক্য হলো Queue একটি একমুখী ডেটা স্ট্রাকচার যা FIFO অনুসরণ করে, যেখানে উপাদানগুলো এক দিক থেকে প্রবাহিত হয়। অন্যদিকে, Deque একটি ডাবল এন্ডেড কিউ যা FIFO বা LIFO উভয় পদ্ধতিতে কাজ করতে সক্ষম এবং এটি উপাদানগুলোকে উভয় দিক থেকে অ্যাক্সেস এবং ম্যানিপুলেট করতে পারে।

Queue সাধারণত এমন কেসে ব্যবহার হয় যেখানে শুধুমাত্র একটি দিক থেকে উপাদান প্রবাহিত হয়, যেমন প্রিন্টার কিউ, যখন Deque ব্যবহার হয় যখন আপনাকে উভয় দিক থেকে উপাদান যুক্ত এবং সরাতে হয়, যেমন LRU Cache বা Undo/Redo operations

common.content_added_by

BufferUtils এর বিভিন্ন ইউটিলিটি ফাংশন

125
125

Apache Commons Collections একটি শক্তিশালী লাইব্রেরি যা Java-তে বিভিন্ন ধরনের ডেটা স্ট্রাকচার এবং ইউটিলিটি ক্লাস প্রদান করে। এর মধ্যে একটি গুরুত্বপূর্ণ ক্লাস হল BufferUtils, যা বিভিন্ন ধরনের buffer সংক্রান্ত কার্যকলাপ সহজতর করে।

BufferUtils হল একটি ইউটিলিটি ক্লাস যা ByteBuffer, CharBuffer, IntBuffer, ইত্যাদি NIO Buffers এর সাথে কাজ করার জন্য বিভিন্ন helper methods সরবরাহ করে। এই ক্লাসটি ফাইল বা নেটওয়ার্ক I/O অপারেশন চালানোর সময় buffers ব্যবহার করার সময় প্রচলিত কিছু সাধারণ কার্যকলাপ সহজ করে দেয়।

1. BufferUtils এর ভূমিকা

BufferUtils মূলত Apache Commons Collections লাইব্রেরির একটি ক্লাস যা Java NIO Buffers এর উপর কাজ করে। এটি Buffer সংক্রান্ত বিভিন্ন ইউটিলিটি মেথড সরবরাহ করে, যেমন Buffer তৈরি করা, clear করা, flip করা, read/write অপারেশন করা ইত্যাদি।

2. BufferUtils ইউটিলিটি ফাংশন

BufferUtils ক্লাসের মাধ্যমে আপনি নিচের ধরনের কার্যকলাপ খুব সহজে করতে পারবেন:

2.1 toByteArray() – Buffer কে ByteArray তে রূপান্তর করা

এটি একটি Buffer কে byte array এ রূপান্তর করতে ব্যবহৃত হয়।

import org.apache.commons.collections4.buffer.BufferUtils;
import java.nio.ByteBuffer;

public class BufferUtilsExample {
    public static void main(String[] args) {
        ByteBuffer buffer = ByteBuffer.allocate(10);
        buffer.put((byte) 1);
        buffer.put((byte) 2);

        // Buffer কে byte array তে রূপান্তর করা
        byte[] byteArray = BufferUtils.toByteArray(buffer);

        // byte array প্রিন্ট করা
        System.out.println("Byte Array: ");
        for (byte b : byteArray) {
            System.out.print(b + " ");
        }
    }
}

আউটপুট:

Byte Array: 1 2 0 0 0 0 0 0 0 0

এখানে:

  • toByteArray(buffer) মেথডটি ByteBuffer কে byte array তে রূপান্তর করেছে।

2.2 toByteBuffer() – ByteArray কে ByteBuffer তে রূপান্তর করা

এই মেথডটি byte array কে ByteBuffer তে রূপান্তর করতে ব্যবহৃত হয়।

import org.apache.commons.collections4.buffer.BufferUtils;
import java.nio.ByteBuffer;

public class BufferUtilsExample {
    public static void main(String[] args) {
        byte[] byteArray = {1, 2, 3, 4};

        // byte array কে ByteBuffer তে রূপান্তর করা
        ByteBuffer buffer = BufferUtils.toByteBuffer(byteArray);

        // ByteBuffer প্রিন্ট করা
        while (buffer.hasRemaining()) {
            System.out.print(buffer.get() + " ");
        }
    }
}

আউটপুট:

1 2 3 4 

এখানে:

  • toByteBuffer(byteArray) মেথডটি byte array কে ByteBuffer তে রূপান্তর করেছে।

2.3 getBytes() – ByteBuffer থেকে byte array বের করা

এই ফাংশনটি ByteBuffer থেকে byte array বের করতে ব্যবহৃত হয়।

import org.apache.commons.collections4.buffer.BufferUtils;
import java.nio.ByteBuffer;

public class BufferUtilsExample {
    public static void main(String[] args) {
        ByteBuffer buffer = ByteBuffer.allocate(10);
        buffer.put((byte) 10);
        buffer.put((byte) 20);
        
        // ByteBuffer থেকে byte array বের করা
        byte[] byteArray = BufferUtils.getBytes(buffer);

        // byte array প্রিন্ট করা
        for (byte b : byteArray) {
            System.out.print(b + " ");
        }
    }
}

আউটপুট:

10 20 0 0 0 0 0 0 0 0 

এখানে:

  • getBytes(buffer) মেথডটি ByteBuffer থেকে byte array বের করে নিয়ে এসেছে।

2.4 isEmpty() – Buffer খালি কিনা তা যাচাই করা

এই ফাংশনটি একটি Buffer খালি কিনা তা চেক করে। যদি Buffer তে কোনো উপাদান না থাকে, তবে এটি true রিটার্ন করবে।

import org.apache.commons.collections4.buffer.BufferUtils;
import java.nio.ByteBuffer;

public class BufferUtilsExample {
    public static void main(String[] args) {
        ByteBuffer buffer = ByteBuffer.allocate(10);

        // Buffer খালি কিনা তা যাচাই করা
        boolean isEmpty = BufferUtils.isEmpty(buffer);
        System.out.println("Is buffer empty? " + isEmpty);
    }
}

আউটপুট:

Is buffer empty? true

এখানে:

  • isEmpty(buffer) মেথডটি চেক করেছে যে buffer খালি কিনা।

2.5 clear() – Buffer কে ক্লিয়ার করা

এই ফাংশনটি Buffer কে ক্লিয়ার করে, অর্থাৎ সেটির পজিশনকে শূন্যে সেট করে এবং তা নতুন ডেটা গ্রহণ করতে প্রস্তুত করে।

import org.apache.commons.collections4.buffer.BufferUtils;
import java.nio.ByteBuffer;

public class BufferUtilsExample {
    public static void main(String[] args) {
        ByteBuffer buffer = ByteBuffer.allocate(10);
        buffer.put((byte) 50);
        
        // Buffer ক্লিয়ার করা
        BufferUtils.clear(buffer);
        System.out.println("Buffer after clear: " + buffer);
    }
}

আউটপুট:

Buffer after clear: java.nio.HeapByteBuffer[pos=0 lim=10 cap=10]

এখানে:

  • clear(buffer) মেথডটি ByteBuffer কে ক্লিয়ার করেছে, এবং পজিশন শূন্যে সেট করেছে।

3. BufferUtils এর অন্যান্য সুবিধা

Apache Commons Collections এর BufferUtils ক্লাস আরও কিছু ইউটিলিটি ফাংশন সরবরাহ করে যেমন:

  • flip(): এটি Buffer কে "flip" করে, যাতে আপনি write অপারেশন থেকে read অপারেশনে পরিবর্তন করতে পারেন।
  • wrap(): এটি একটি byte array বা char array থেকে Buffer তৈরি করতে ব্যবহৃত হয়।

সারাংশ

  • BufferUtils একটি ইউটিলিটি ক্লাস যা Java NIO Buffers এর সাথে কাজ করার জন্য বিভিন্ন সহায়ক মেথড সরবরাহ করে।
  • এর মধ্যে কিছু গুরুত্বপূর্ণ ফাংশন যেমন toByteArray(), toByteBuffer(), getBytes(), clear() ইত্যাদি রয়েছে, যা Buffer সম্পর্কিত বিভিন্ন কাজ যেমন রূপান্তর, ক্লিয়ারিং, অ্যাক্সেস সহজ করে তোলে।
  • BufferUtils Java NIO-র জন্য অতিরিক্ত সুবিধা প্রদান করে, যা I/O অপারেশনগুলোকে আরও সহজ এবং কার্যকরী করে তোলে।
common.content_added_by
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion