জাভাতে বুলিয়ান ভেরিয়েবলের আকার কত?


89

কেউ কি জাভাতে বুলিয়ান এর বিট আকার বলতে পারেন ?


4
: একই এখানে আসতে বলেছি stackoverflow.com/questions/1907318/...
dma_k

উত্তর:


41

এটি ভার্চুয়াল মেশিন নির্ভর।


9
কিছু দস্তাবেজের দিকে লক্ষ্য রাখবেন? আমার বিশ্বাস করা শক্ত হয় যে বুলিয়ান আকারটি মেশিন নির্ভর। এর অর্থ হ'ল বুলিয়ানযুক্ত শ্রেণীর বাইনারি উপস্থাপনার বিভিন্ন ভিএম-তে বিভিন্ন আকার (এবং মেমরি লেআউট) থাকবে এবং এর দ্বারা বোঝানো হবে যে ভিএমগুলি সামঞ্জস্যপূর্ণ নয়।
ডেভিড রদ্রিগেজ - ড্রিবিস

14
আমি মনে করি যে এটি বোঝানো হয়েছিল যে প্রশ্নটি একটি বুলিয়ান ভেরিয়েবলের আকারটিকে মেমরির ক্ষেত্রে উল্লেখ করছে, কোনও বুলিয়ান ভেরিয়েবলের আকারটি কোনও ক্লাস ফাইলে এনকোড করা হয়নি। সান এর ডকুমেন্টেশন অনুসারে মেমরির আকার ভিএম দ্বারা পরিবর্তিত হয়। ক্লাস ফাইলে আকারটি ধ্রুবক।
উইলিয়াম ব্রেন্ডেল

4
@ ডেভিডরোড্রিগিজ-ড্রিবিয়াস - জাভা ১.১ এর সময়কার সান জেভিএম বুলিয়ানের জন্য 4 বাইট ব্যবহার করেছিল যখন উদাহরণ বা অটো ভের হিসাবে সংরক্ষণ করা হয়। এটি বাইটকোড ইন্টারপ্রেটার (যা স্টুলের উপর 4 টি বাইট দখল হিসাবে বিবেচিত bools) এর বাস্তবায়নকে সহজতর করেছিল এবং এটি ছিল সর্বনিম্ন প্রতিরোধের পথ। যখন আমরা আইসারিগুলি "ক্লাসিক" জেভিএম বাস্তবায়ন করেছি তখন আমরা উদাহরণ বর্ষ 1 বাইট করার উপায় খুঁজে পেয়েছি, কারণ এটি কিছু বস্তুর সংক্ষিপ্ততার উন্নতি করেছে (যা পারফরম্যান্সে একটি আশ্চর্যজনক প্রভাব ফেলে)। স্পষ্টতই, নীচের পোস্টগুলির উপর ভিত্তি করে, সান / ওরাকল বিকাশকারীরা পরবর্তী সংস্করণগুলিতে কীভাবে একইভাবে করতে হবে তা নির্ধারণ করেছিলেন।
হট লিক্স

তবে এটি ঠিক আছে, ২০১৫ সালের শেষের দিকে জাভাডকস বলেছেন: boolean: The boolean data type... This data type represents one bit of information, but its "size" isn't something that's precisely defined- তবে আপনার বক্তব্যটি বৈধ, এটি কিছু লিঙ্ক এবং আরও ভাল তথ্য ব্যবহার করতে পারে :)
জিমলোহসে

185

এটি ভার্চুয়াল মেশিনের উপর নির্ভর করে, তবে জাভাতে বাইট সম্পর্কে জিজ্ঞাসা করা অনুরূপ প্রশ্ন থেকে কোডটি মানিয়ে নেওয়া সহজ :

class LotsOfBooleans
{
    boolean a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, aa, ab, ac, ad, ae, af;
    boolean b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, ba, bb, bc, bd, be, bf;
    boolean c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, ca, cb, cc, cd, ce, cf;
    boolean d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, da, db, dc, dd, de, df;
    boolean e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, ea, eb, ec, ed, ee, ef;
}

class LotsOfInts
{
    int a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, aa, ab, ac, ad, ae, af;
    int b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, ba, bb, bc, bd, be, bf;
    int c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, ca, cb, cc, cd, ce, cf;
    int d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, da, db, dc, dd, de, df;
    int e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, ea, eb, ec, ed, ee, ef;
}


public class Test
{
    private static final int SIZE = 1000000;

    public static void main(String[] args) throws Exception
    {        
        LotsOfBooleans[] first = new LotsOfBooleans[SIZE];
        LotsOfInts[] second = new LotsOfInts[SIZE];

        System.gc();
        long startMem = getMemory();

        for (int i=0; i < SIZE; i++)
        {
            first[i] = new LotsOfBooleans();
        }

        System.gc();
        long endMem = getMemory();

        System.out.println ("Size for LotsOfBooleans: " + (endMem-startMem));
        System.out.println ("Average size: " + ((endMem-startMem) / ((double)SIZE)));

        System.gc();
        startMem = getMemory();
        for (int i=0; i < SIZE; i++)
        {
            second[i] = new LotsOfInts();
        }
        System.gc();
        endMem = getMemory();

        System.out.println ("Size for LotsOfInts: " + (endMem-startMem));
        System.out.println ("Average size: " + ((endMem-startMem) / ((double)SIZE)));

        // Make sure nothing gets collected
        long total = 0;
        for (int i=0; i < SIZE; i++)
        {
            total += (first[i].a0 ? 1 : 0) + second[i].a0;
        }
        System.out.println(total);
    }

    private static long getMemory()
    {
        Runtime runtime = Runtime.getRuntime();
        return runtime.totalMemory() - runtime.freeMemory();
    }
}

পুনরাবৃত্তি করার জন্য, এটি ভিএম নির্ভর,

Size for LotsOfBooleans: 87978576
Average size: 87.978576
Size for LotsOfInts: 328000000
Average size: 328.0

এটি পরামর্শ দেয় যে বুলিয়ানগুলি মূলত সান এর জেভিএম প্রতিটি বাইটে প্যাক করতে পারে।


21
@skeet - আমি সত্যিই অভিবাদন you.your উত্তর সন্ত্রস্ত
ওয়ারিয়র

4
@ ওরিয়ার: যেহেতু আমি "বাইট" এর কোডটি ইতিমধ্যে পেয়েছি, এটিকে "বুলিয়ান" এ পরিবর্তন করা বেশ সোজা ছিল :)
জন স্কিটি

4
System.gc () মেমরি পরিষ্কার করার গ্যারান্টি দেয় না। এটি জেভিএমকে কেবল আবর্জনা সংগ্রহ চালানোর জন্য একটি আদেশ দেয়, তবে এর অর্থ এই নয় যে সংগ্রাহক আসলে কিছু পরিষ্কার করেছিলেন। মনে রাখবেন সংগ্রাহক অব্যবহৃত জিনিসগুলি সাফ করে। প্রোগ্রামটির আর কোনও রেফারেন্স না থাকলে কোনও অবজেক্ট অব্যবহৃত থাকে। সুতরাং আপনার পরীক্ষায় আমি স্পষ্টতই জিসি () চালানোর আগে লটসফবুলিয়ানসকে বাতিল করতে স্থির করে রেফারেন্সটি ফেলে দেব; অথবা কেবল বুলিয়ান দিয়ে একবার মূল চালান, একবার সংখ্যার সাথে তারপর সংখ্যাগুলির সাথে তুলনা করুন।
রানদা সুবাইটি

4
@ রান্ডস্যাবিটি বা আরও ভাল: নিশ্চিত হয়ে নিন যে আপনি উভয় উল্লেখ সংরক্ষণ করেছেন এবং মেমরির পার্থক্য গণনা করেছেন। এখানে যা ঘটে ঠিক তাই।
বিজিকলপ

4
জোন স্কিটে উত্তর দিতে পারে না এমন কোন প্রশ্ন আছে কি?
আন্ড্রেস হার্টম্যান

31

জাভাতে বুলিয়ান মান দ্বারা প্রতিনিধিত্ব করা আসল তথ্যটি একটি বিট: সত্যের জন্য 1, ভুজের জন্য 0। যাইহোক, মেমরিতে বুলিয়ান ভেরিয়েবলের আসল আকারটি জাভা নির্দিষ্টকরণের দ্বারা যথাযথভাবে সংজ্ঞায়িত করা হয়নি। জাভাতে প্রাথমিক তথ্য প্রকারগুলি দেখুন ।

বুলিয়ান ডেটা টাইপের কেবল দুটি সম্ভাব্য মান রয়েছে: সত্য এবং মিথ্যা। সত্যিকারের / মিথ্যা শর্তাদি অনুসরণ করে এমন সাধারণ পতাকাগুলির জন্য এই ডেটা প্রকারটি ব্যবহার করুন। এই ডেটা টাইপ এক বিট তথ্যের প্রতিনিধিত্ব করে তবে এর "আকার" এমন কিছু নয় যা যথাযথভাবে সংজ্ঞায়িত হয়।


21

পার্শ্ব নোটে ...

আপনি যদি বুলিয়ান অবজেক্টগুলির একটি অ্যারে ব্যবহার করার কথা ভাবছেন তবে তা করবেন না। পরিবর্তে একটি বিটসেট ব্যবহার করুন - এটির কিছু কার্যকারিতা অপ্টিমাইজেশন রয়েছে (এবং কয়েকটি দুর্দান্ত অতিরিক্ত পদ্ধতি যা আপনাকে পরবর্তী সেট / আনসেট বিট পেতে দেয়)।


এটি সর্বদা সত্য নয় স্ট্যাকওভারফ্লো.com
প্রশ্নগুলি /

এই উত্তরটি বোঝায় যে বুলিয়ান ব্যবহার করার জন্য উল্লেখযোগ্য কারণ রয়েছে [] তবে সেখানে যে মন্তব্যগুলি থেকে বোঝা যাচ্ছে, এটির ব্যাক আপ করার মতো খুব বেশি কিছু নেই। এই বলে যে: আমি জাভাতে খুব বেশি প্রোগ্রাম করি না (এবং কোনও প্রমাণও দেয় নি;)
ম্যাথু শিংকেল

6

আমি পড়লাম যে জাভা একটি booleanডেটাটাইপের জন্য একটি বাইট সংরক্ষণ করে তবে এটি কেবল একটি বিট ব্যবহার করে। তবে ডকুমেন্টেশন বলে যে "এর" আকার "এমন কিছু নয় যা যথাযথভাবে সংজ্ঞায়িত হয়"এখানে দেখো.


এটি একটি টিউটোরিয়াল, 'ডকুমেন্টেশন' নয়। ডকুমেন্টেশন হ'ল জেএলএস, জেভিএম স্পেসিপেট এবং জাভাদোক।
ব্যবহারকারী 207421

2

booleanমান সংকলিত intজেভিএম ডাটা প্রকার। এখানে দেখুন ।


4
এটি অগত্যা নয় যে তারা কীভাবে স্মৃতিতে জমা হয় এবং আমি মনে করি যে প্রশ্নটি জিজ্ঞাসা করা ব্যক্তিটি এটি জানতে চেয়েছিল। সেই দস্তাবেজটি ক্লাস ফাইলের ফর্ম্যাটকে (সংকলিত বাইট কোড) বর্ণনা করে, মেমরিতে কোনও বুলিয়ান ভেরিয়েবলের উপস্থাপনা নয়, কারণ এটি বাস্তবায়ন নির্ভর।
উইলিয়াম ব্রেন্ডেল

2

জাভাতে বুলিয়ানের আকার ভার্চুয়াল মেশিন নির্ভর। তবে জাভা অবজেক্টটি 8 বাইটের গ্রানুলারিটির সাথে সংযুক্ত রয়েছে। মোট 9 টি বাইটের তথ্যের জন্য একটি বুলিয়ানের 8 টি বাইটার শিরোনাম, এবং পেওলডের 1 বাইট রয়েছে। জেভিএম তারপরে এটি পরবর্তী 8 এর এককটি করে দেয় so সুতরাং java.lang.Boolean এর একটি উদাহরণ মেমরির 16 বাইট নেয়।


আমি দ্বিমত পোষণ করব, হটস্পট জেভিএম 1.7.0_51 এ শিরোনামটিতে 12 বাইট +1 বুলিয়ানাটির জন্য বুলিয়ান + 3 রয়েছে।
ইউজিন

14
বুলিয়ানকে বুলিয়ানকে বিভ্রান্ত করবেন না।
resp ই

4
বাইট বা বিট? 16 পর্দার জন্য বাইট Booleanযেমন একটি বর্জ্য হতে পারে ... এটি এমন আকারের longযা একটি এর চেয়ে ট্রিলিয়ন গুণ বেশি তথ্য বহন করতে পারেBoolean
ডিসি

0

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.