লোকেরা এখনও জাভাতে আদিম ধরণের ব্যবহার করে কেন?


163

জাভা 5 এর পর থেকে, আমাদের কাছে আদিম ধরণের বক্সিং / আনবক্সিং ছিল যাতে এটি intমোড়ানো থাকে java.lang.Integerএবং তাই এবং আরও অনেক কিছু।

আমি ইদানীং নতুন জাভা প্রকল্পের দেখতে অনেকটা (যে স্পষ্টভাবে , অন্তত সংস্করণ 5 JRE প্রয়োজন হয় না 6 যদি) যে ব্যবহার করছেন intবদলে java.lang.Integer, যদিও এটা আধুনিক ব্যবহার করতে আরো অনেক কিছু সুবিধাজনক যেমন রূপান্তরের জন্য কয়েক সাহায্যকারী পদ্ধতি আছে থেকে longমান এট অল।

কিছু এখনও জাভাতে আদিম ধরণের ব্যবহার করে কেন ? কোন স্থির সুবিধা আছে কি?


49
মেমরি খরচ এবং কর্মক্ষমতা সম্পর্কে কখনও ভেবেছিলেন?
টেডিল

76
আমি অটোবক্সিং ট্যাগ যুক্ত করেছি ... এবং জানতে পেরেছি যে তিনজন মানুষ এটি অনুসরণ করে। সত্যি? লোকেরা অটোবক্সিং ট্যাগটি অনুসরণ করে?
কর্সিকা

4
@glowcoder তারা প্রকৃত লোক নয়, তারা কেবল বিমূর্ত ধারণা যা এসওকে উত্তর দেওয়ার জন্য একটি মানব রূপ ধারণ করে। :)
বিজিকলপ ২

9
@ টি কে কোচরান বেশিরভাগ new IntegeR(5) == new Integer(5)ক্ষেত্রে নিয়ম অনুসারে ভুয়া মূল্যায়ন করা উচিত।
বাইজিক্লোপ

10
আদিম ধরণের সংগ্রহের সমাধানের জন্য জিএনইউ ট্রভ বা মাহাউট সংগ্রহ বা এইচপিপিসি বা ... দেখুন। আমরা যারা গতি সম্পর্কে চিন্তা করি তারা আমাদের আধ্যাত্মিক প্রকারগুলি ব্যবহার করে বেশি সময় ব্যয় করি , কম নয়।
bmargulies

উত্তর:


395

জোশুয়া ব্লচের কার্যকর জাভাতে , আইটেম 5: "অপ্রয়োজনীয় জিনিস তৈরি করা থেকে বিরত থাকুন", তিনি নিম্নলিখিত কোড উদাহরণ পোস্ট করেছেন:

public static void main(String[] args) {
    Long sum = 0L; // uses Long, not long
    for (long i = 0; i <= Integer.MAX_VALUE; i++) {
        sum += i;
    }
    System.out.println(sum);
}

এবং এটি চালাতে 43 সেকেন্ড সময় নেয়। আদিম অঞ্চলে লম্বা সময় নিলে তা 6.8 সেকেন্ডে নেমে আসে ... যদি এটি কোনও ইঙ্গিত থাকে তবে কেন আমরা আদিম ব্যবহার করি।

দেশীয় মান সমতার অভাবও একটি উদ্বেগের বিষয় ( .equals()তুলনায় মোটামুটি ভার্জোজ ==)

বিসিকলপের জন্য:

class Biziclop {

    public static void main(String[] args) {
        System.out.println(new Integer(5) == new Integer(5));
        System.out.println(new Integer(500) == new Integer(500));

        System.out.println(Integer.valueOf(5) == Integer.valueOf(5));
        System.out.println(Integer.valueOf(500) == Integer.valueOf(500));
    }
}

ফলাফল স্বরূপ:

false
false
true
false

সম্পাদনা কেন (3) trueএবং (4) ফিরে আসে false?

কারণ এগুলি দুটি ভিন্ন বস্তু। 256 পূর্ণসংখ্যার শূন্যের নিকটতম [-128; 127] কে জেভিএম দ্বারা ক্যাশে করা হয়, সুতরাং তারা তাদের জন্য একই জিনিসটি ফেরত দেয়। এই ব্যাপ্তির বাইরে, যদিও এগুলি ক্যাশে করা হয় না, তাই একটি নতুন অবজেক্ট তৈরি হয়। জিনিসগুলিকে আরও জটিল করার জন্য, জেএলএস কমপক্ষে 256 ফ্লাইটওয়েট ক্যাশে করার দাবি করেছে। জেভিএম বাস্তবায়নকারীরা যদি তারা চান তবে আরও যোগ করতে পারে, যার অর্থ এটি এমন একটি সিস্টেমে চলতে পারে যেখানে নিকটতম 1024 ক্যাশে করা হয়েছে এবং সমস্তগুলি সত্য ফিরে আসে ... # অগওয়ার্ড


54
এবার ভাবুন তো পাশাপাশি iঘোষণা করা Longহয় কি!
কলিনডি

14
@ ট্রাই - অনুমানটির জন্য নির্দিষ্ট সীমার মধ্যে ফ্লাইওয়েট তৈরি করতে আসলে ভিএমগুলির প্রয়োজন । তবে দুঃখের বিষয় এটি তাদের এ পরিধিটি বাড়ানোর অনুমতি দেয় , এর অর্থ হ'ল প্রোগ্রামগুলি বিভিন্ন ভিএমগুলিতে আলাদাভাবে আচরণ করতে পারে। ক্রস প্ল্যাটফর্মের জন্য এত কিছু ...
ড্যানিয়েল আর্উইকার

12
জাভা আরও বেশি খারাপ ডিজাইনের পছন্দ সহ ড্রেনে নেমে গেছে। অটোবক্সিং একটি সম্পূর্ণ ব্যর্থতা, এটি শক্তিশালী, অনুমানযোগ্য বা বহনযোগ্য নয় able আমি সত্যিই আশ্চর্য হয়েছি তারা কী ভাবছিল ... ভয়ঙ্কর আদিম-বস্তুর দ্বৈততা ঠিক করার পরিবর্তে তারা এটিকে প্রথম স্থানের চেয়ে আরও খারাপ করতে পেরেছিল।
পপ ক্যাটালিন

34
@ ক্যাটালিন আমি আপনার সাথে একমত নই যে অটোবক্সিং সম্পূর্ণ ব্যর্থতা। এর কিছু ত্রুটি রয়েছে, যা ব্যবহার করা যেতে পারে এমন কোনও অন্যান্য ডিজাইনের চেয়ে আলাদা নয় (তারা কিছুই না including designs ডিজাইনের।
কর্সিকা

9
@ নাফতুলিzviKay এটি "ব্যর্থতা" নয়। তারা এটিকে খুব পরিষ্কার করে দেয় যে ==অপারেটর রেফারেন্স আইডেন্টিটি Integerএবং এক্সপ্রেশনগুলিতে মান সমতার তুলনা তুলনায় তুলনা সম্পাদন intকরে। Integer.equals()এই কারণেই বিদ্যমান। আপনার কোনও অ-আদিম ধরণের মান তুলনা করতে ব্যবহার করা উচিত নয়== । এই জাভা 101. হয়
NullUserException

86

স্বতঃবাক্সিং এনপিইগুলিকে স্পট করতে শক্ত হতে পারে

Integer in = null;
...
...
int i = in; // NPE at runtime

বেশিরভাগ পরিস্থিতিতে নাল নিয়োগটি inউপরের তুলনায় অনেক কম সুস্পষ্ট।


43

বক্সযুক্ত ধরণের গরিব কর্মক্ষমতা থাকে এবং আরও মেমরির প্রয়োজন হয়।


40

আদিম ধরণের:

int x = 1000;
int y = 1000;

এখন মূল্যায়ন করুন:

x == y

এটা true। এতে বিস্মিত হবার কিছু নেই. এখন বাক্সযুক্ত প্রকার চেষ্টা করুন:

Integer x = 1000;
Integer y = 1000;

এখন মূল্যায়ন করুন:

x == y

এটা false। সম্ভবত। রানটাইমের উপর নির্ভর করে। সে কারণ কি যথেষ্ট?


36

পারফরম্যান্স এবং মেমরির সমস্যাগুলি ছাড়াও, আমি আরও একটি সমস্যা নিয়ে আসতে চাই: Listইন্টারফেসটি বিনা ভাঙা int
সমস্যাটি হ'ল ওভারলোডেড remove()পদ্ধতি ( remove(int)বনাম remove(Object))। remove(Integer)সর্বদা পরবর্তীকে কল করার সংকল্প করবে, সুতরাং আপনি সূচী দ্বারা কোনও উপাদান সরাতে পারবেন না।

অন্যদিকে, একটি যুক্ত এবং মুছে ফেলার চেষ্টা করার সময় একটি সমস্যা রয়েছে int:

final int i = 42;
final List<Integer> list = new ArrayList<Integer>();
list.add(i); // add(Object)
list.remove(i); // remove(int) - Ouch!

7
এটি ভেঙে যাবে, হ্যাঁ। তবে মুছে ফেলুন (ইনট) হ'ল একটি ডিজাইনের ত্রুটি আইএমও। কোনও মিশ্রণের সামান্যতম সুযোগ থাকলে পদ্ধতির নামগুলি কখনই ওভারলোড করা উচিত নয়।
মিঃব্যাকেন্ডে

4
@ এমআরব্যাকএন্ড ফেয়ার যথেষ্ট। মজার ব্যাপার হচ্ছে, Vectorছিল removeElementAt(int)প্রথম থেকেই। remove(int)জাভা 1.2 সালে সংগ্রহের কাঠামোর সাথে চালু হয়েছিল।
xehpuk

6
@ মিআরব্যাকএন্ড: যখন Listএপিআই ডিজাইন করা হয়েছিল, জেনারিকস বা অটোবক্সিংয়ের অস্তিত্বই ছিল না, তাই মেশার কোনও সুযোগই ছিল না remove(int)এবং remove(Object)
হোলার

@ ফ্র্যাঙ্কলিন ইউ: অবশ্যই, তবে সামঞ্জস্যতার সীমাবদ্ধতা ছাড়াই কোনও নতুন ভাষা / সংস্করণ ডিজাইন করার সময় আপনি সেই দুর্ভাগ্যজনক ওভারলোডটি পরিবর্তন করতে থামবেন না। আপনি পুরোপুরি আদিম এবং বাক্সযুক্ত মানগুলির পার্থক্য থেকে সম্পূর্ণ মুক্তি পাবেন, যাতে কোন প্রশ্নটি ব্যবহার করা উচিত তা কখনই উপস্থিত না হয়।
হলগার

27

আপনি কি সত্যিই কল্পনা করতে পারেন

  for (int i=0; i<10000; i++) {
      do something
  }

এর পরিবর্তে java.lang.Integer দিয়ে লুপ? একটি java.lang.Integer অপরিবর্তনীয়, সুতরাং লুপ বৃত্তাকার প্রতিটি বৃদ্ধি বৃদ্ধি একক জেভিএম নির্দেশাবলীর সাহায্যে স্ট্যাকের কেবলমাত্র ইনট্রি বাড়ানোর চেয়ে theগলে একটি নতুন জাভা অবজেক্ট তৈরি করবে। অভিনয়টি ডায়াবেজিকাল হবে।

আমি সত্যিই দ্বিমত পোষণ করব যে এটি জাভা.এলং.ইনটার্জারের চেয়ে আরও বেশি মোড সুবিধাজনক convenient বিপরীতে. অটোবক্সিং এর অর্থ হল আপনি ইতিবাচক ব্যবহার করতে পারবেন যেখানে আপনি অন্যথায় পূর্ণসংখ্যার ব্যবহার করতে বাধ্য হবেন এবং জাভা সংকলক আপনার জন্য নতুন পূর্ণসংখ্যার অবজেক্ট তৈরি করার জন্য কোডটি সন্নিবেশ করানোর যত্ন নেয়। সংযুক্তকারী প্রাসঙ্গিক অবজেক্ট নির্মাণ সন্নিবেশ করানোর সাথে সাথে কোনও পূর্ণসংখ্যার প্রত্যাশিত একটি আন্ত ব্যবহার করার অনুমতি দেওয়ার জন্য অটোবক্সিং all এটি কোনওভাবেই প্রথম স্থানে থাকা ইন্টের প্রয়োজনটিকে সরিয়ে দেয় বা হ্রাস করে না। অটোবক্সিংয়ের মাধ্যমে আপনি উভয় বিশ্বের সেরা পাবেন। যখন আপনার একটি হিপ ভিত্তিক জাভা বস্তুর প্রয়োজন হয় তখন আপনি স্বয়ংক্রিয়ভাবে আপনার জন্য তৈরি একটি পূর্ণসংখ্যার পেতে পারেন এবং যখন আপনি কেবল গাণিতিক এবং স্থানীয় গণনা করছেন তখন আপনি কোনও ইন্টির গতি এবং দক্ষতা পাবেন।


19

আদিম ধরণেরগুলি আরও দ্রুত:

int i;
i++;

পূর্ণসংখ্যা (সমস্ত সংখ্যা এবং একটি স্ট্রিং) একটি অপরিবর্তনীয় প্রকার: একবার তৈরি হয়ে গেলে এটি পরিবর্তন করা যায় না। যদি iপূর্ণসংখ্যা হয়, তার চেয়ে i++নতুন ইন্টিজার অবজেক্ট তৈরি করা হত - মেমরি এবং প্রসেসরের দিক থেকে আরও ব্যয়বহুল।


আপনি যদি i++অন্য ভেরিয়েবলটি করেন তবে আপনি একটি ভেরিয়েবল পরিবর্তন করতে চান না , সুতরাং এটি করতে সক্ষম হওয়ার জন্য পূর্ণসংখ্যার বেশিরভাগ ক্ষেত্রে অপরিবর্তনীয় হওয়া প্রয়োজন (বা কমপক্ষে এটি i++কোনও নতুন পূর্ণসংখ্যার বস্তু তৈরি করতে হবে)। (এবং আদিম
মানগুলিও

4
@ পাওলো: আদিম মানগুলি অপরিবর্তনীয় বলে এক ধরণের অর্থহীন। আপনি যখন কোনও নতুন মানকে একটি আদিম পরিবর্তনশীলটিকে পুনরায় সাইন করেন, আপনি নতুন কিছু তৈরি করছেন না। কোনও স্মৃতি বরাদ্দ জড়িত হয় না। পিটারের বক্তব্য দাঁড়ায়: আদিমতার জন্য আমি ++ কোনও মেমরি বরাদ্দ করে না, তবে কোনও বস্তুর জন্য এটি প্রয়োজনীয়ভাবে করে।
এডি

@ এডি: (এটি অগত্যা মেমরি বরাদ্দের প্রয়োজন হয় না, এটি একটি ক্যাশেড মানও ফিরিয়ে দিতে পারে I আমি মনে করি কিছু ছোট মূল্যবোধের জন্য এটি মনে হয়) এখানে আমার পূর্ণসংখ্যার অপরিবর্তনীয়তা সিদ্ধান্ত নেওয়ার পয়েন্ট নয়, আপনি যেভাবেই চান অপরিবর্তনীয়তা নির্বিশেষে অন্য একটি বস্তু আছে।
পাওলো ইবারম্যান

@ পাওলো: আমার একমাত্র বক্তব্যটি হ'ল পূর্ণসংখ্যার ক্রমটি ধীরে ধীরে আদিমতার ক্রম। এবং এটি বাক্সযুক্ত প্রকারগুলি অপরিবর্তনীয় এবং আপনি যখনই কোনও মান পরিবর্তন করেন তখনই একটি নতুন অবজেক্ট তৈরি করা হয় to আমি দাবি করি নি যে তাদের সাথে কিছু ভুল আছে বা এগুলি সত্য যে তারা অপরিবর্তনীয়। কেবল এগুলি যে তারা ধীরে ধীরে এবং কোনও কোডারকে এটি জানা উচিত। গ্রোভি কীভাবে আদিম প্রকারের jroller.com/rants/entry/why_is_groovy_so_slow
পিটার কেঙ্গো

1
অপরিচ্ছন্নতা এবং ++এটি একটি লাল রঙের হেরিং। কল্পনা করুন জাভা একটি সত্যিই সহজ ভাবে ওভারলোডিং সমর্থন অপারেটরের উন্নত হয়েছে, এই ধরনের একটি বর্গ (যেমন যে Integerএকটি পদ্ধতি রয়েছে plus, তাহলে আপনি লিখতে পারে i + 1পরিবর্তে i.plus(1)। এবং এছাড়াও অনুমান কম্পাইলার স্মার্ট যথেষ্ট প্রসারিত হয় i++মধ্যে i = i + 1। এখন আপনি বলতে পারে i++এবং কার্যকরভাবে পরিবর্তনশীল না Integerহয়ে "পরিবর্তনশীল আই" বৃদ্ধি করুন
ড্যানিয়েল আরউইকার 22:25

16

প্রথম এবং সর্বাগ্রে, অভ্যাস। আপনি যদি জাভাতে আট বছরের জন্য কোড করে থাকেন তবে আপনি যথেষ্ট পরিমাণে জড়তা জমে। এরকম করার কোন বাধ্যতামূলক কারণ না থাকলে কেন পরিবর্তন হবে? এটি এমন নয় যে বক্সযুক্ত আদিম ব্যবহারগুলি কোনও অতিরিক্ত সুবিধা নিয়ে আসে।

অন্য কারণ হ'ল nullএটি একটি বৈধ বিকল্প নয় as দুটি সংখ্যার যোগফল বা লুপ ভেরিয়েবল হিসাবে ঘোষণা করা অর্থহীন এবং বিভ্রান্তিকর হবে Integer

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


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

7
@ এডি এটি হতে পারে তবে এটি খুব কমই হয়। আমাকে বিশ্বাস করুন, বেশিরভাগ লোকের জন্য পারফর্মেন্স যুক্তি কেবল একটি বাহানা।
বাইজিক্লোপ

3
আমিও পারফরম্যান্স যুক্তি রক্ষা করতে চাই। অ্যান্ড্রয়েডে ডালভিকের সাথে আপনার তৈরি প্রতিটি বস্তু জিসির কল হওয়ার "ঝুঁকি" বাড়িয়ে তুলবে এবং আপনার আরও বিরতি দেওয়া অবজেক্টগুলি আরও দীর্ঘ হবে। সুতরাং কোনও লুপের পরিবর্তে ইন্টিজারগুলি তৈরি করা আপনার সম্ভবত কিছু ড্রপ ফ্রেমের জন্য ব্যয় করবে।
ইগোর Čordaš

1
@ পিপ্সিকো এটি একটি ন্যায্য বিষয়, আমি পুরোপুরি সার্ভার-সাইড জাভা মাথায় রেখে এটি লিখেছি। মোবাইল ডিভাইসগুলি সম্পূর্ণ ভিন্ন প্রাণী। তবে আমার বক্তব্যটি ছিল যে এমনকি বিকাশকারীরা যারা অন্যথায় পারফরম্যান্সের কোনও কারণ ছাড়াই ভয়ানক কোড লেখেন তারা এটিকে একটি কারণ হিসাবে উদ্ধৃত করবেন, তাদের কাছ থেকে এটি খুব অজুহাত হিসাবে শোনায়।
বিজিকলপ

12

যাইহোক, স্মলটকের কেবলমাত্র অবজেক্টস রয়েছে (কোনও আদিম নেই) এবং তবুও তারা তাদের ছোট ছোট পূর্ণসংখ্যাগুলি (সমস্ত 32 বিট নয়, কেবল 27 বা এই জাতীয়) ব্যবহার করে কোনও গাদা স্থান বরাদ্দ না করে কেবল একটি বিশেষ বিট প্যাটার্ন ব্যবহার করে। এছাড়াও অন্যান্য সাধারণ বস্তুর (সত্য, মিথ্যা, নাল) এখানে বিশেষ বিট নিদর্শন ছিল।

সুতরাং, কমপক্ষে -৪-বিট জেভিএম-তে (একটি 64৪ বিট পয়েন্টার নেমস্পেসের সাথে) পূর্ণসংখ্যা, চরিত্র, বাইট, সংক্ষিপ্ত, বুলিয়ান, ভাসমান (এবং ছোট দীর্ঘ) কোনও বস্তু না থাকা সম্ভব (এইগুলি তৈরি করে বাদে) স্পষ্ট করে new ...()), কেবলমাত্র বিশেষ বিট নিদর্শন, যা সাধারণ অপারেটররা বেশ দক্ষতার সাথে ম্যানিপুলেট করতে পারে।


আমার "কিছু বাস্তবায়ন" বলা উচিত ছিল, কারণ এটি ভাষার নির্দিষ্টকরণ দ্বারা পরিচালিত হয় না, আমার ধারণা। (এবং দুঃখের সাথে আমি এখানে কোনও উত্স উদ্ধৃত করতে পারি না, এটি কোথাও যা শুনেছি কেবল তা থেকে is)
পাওলো ইবারম্যান

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

3
আমি কয়েক বছর ধরে স্মলটালক করেছি। অপ্টিমাইজেশনটি এখনও বেশ ব্যয়বহুল ছিল, কারণ প্রতিটি ক্রিয়াকলাপের জন্য তাদের অপম্যাস্ক করে পুনরায় প্রয়োগ করতে হয়েছিল। আদিম সংখ্যাগুলিতে হেরফের করার সময় বর্তমানে জাভা সি এর সাথে সমান। আনমাস্ক + মাস্ক সহ এটি সম্ভবত> 30% ধীর হয়ে যাবে।
আর.মোয়েলার

9

আমি বিশ্বাস করতে পারি না যে আমি মনে করি সবচেয়ে গুরুত্বপূর্ণ কারণটি কেউ উল্লেখ করেনি: "ইনট "টি এতটাই," পূর্ণসংখ্যার "চেয়ে টাইপ করা এত সহজ। আমি মনে করি লোকেরা সংক্ষিপ্ত বাক্য গঠনটির গুরুত্বকে অবমূল্যায়ন করে। পারফরম্যান্স এগুলি এড়াতে আসলেই কারণ নয় কারণ বেশিরভাগ সময় যখন কেউ সংখ্যা ব্যবহার করে লুপ ইনডেক্সে থাকে এবং সেই ব্যয়গুলিকে বৃদ্ধি করে এবং তুলনা করে কোন তুচ্ছ লুপে কিছুই হয় না (আপনি ইনট বা পূর্ণসংখ্যা ব্যবহার করছেন)।

অন্য প্রদত্ত কারণ হ'ল আপনি এনপিই পেতে পারেন তবে বাক্সযুক্ত ধরণের সাথে এড়ানো চূড়ান্ত সহজ (এবং যতক্ষণ আপনি এগুলি সর্বদা নালাগুলির সাথে শুরু করেন ততক্ষণ এড়াতে হবে তার নিশ্চয়তা)।

অন্য কারণটি হ'ল (নতুন লং (1000)) == (নতুন লং (1000)) মিথ্যা, তবে এটি কেবল বলার অন্য একটি উপায় যে ".equals" এর বাক্সযুক্ত ধরণের (অপারেটরদের বিপরীতে <,> , =, ইত্যাদি), তাই আমরা "সরল সিনট্যাক্স" কারণে ফিরে আসি।

আমি মনে করি স্টিভ ইয়েজের অ-আদিম লুপ উদাহরণটি আমার পয়েন্টটি খুব ভালভাবে ফুটিয়ে তুলেছে: http://sites.google.com/site/steveyegge2/language-trickery-and-ejb

এটি সম্পর্কে ভাবুন: জাভা তুলনায় আপনি যে ভাষাগুলির জন্য ভাল সিনট্যাক্সযুক্ত (যেমন কোনও কার্যকরী ভাষা, পাইথন, রুবি এবং এমনকি সি) তে ফাংশন প্রকারগুলি আপনি কতক্ষণ ব্যবহার করেন যেখানে রান্নেবল এবং কলযোগ্য এবং এর মতো ইন্টারফেস ব্যবহার করে সেগুলি সিমুলেট করতে হয় যেখানে নামহীন ক্লাস


8

আদিম থেকে মুক্তি না পাওয়ার কয়েকটি কারণ:

  • পিছনে সামঞ্জস্যতা।

এটি যদি মুছে ফেলা হয় তবে কোনও পুরানো প্রোগ্রাম এমনকি চলবে না।

  • জেভিএম পুনর্লিখন।

এই নতুন জিনিসটিকে সমর্থন করার জন্য পুরো জেভিএমকে আবারও লিখতে হবে।

  • আরও বড় মেমরি পদচিহ্ন।

আপনার মান এবং রেফারেন্স সঞ্চয় করতে হবে যা আরও মেমরি ব্যবহার করে। আপনার কাছে যদি বাইটের বিশাল অ্যারে থাকে তবে এর ব্যবহারটি ব্যবহারের byteচেয়ে উল্লেখযোগ্যভাবে ছোট Byte

  • নাল পয়েন্টার ইস্যু।

এর int iসাথে স্টাফ করে কাজ করার iফলে কোনও সমস্যা হয় না, তবে ঘোষণা করে Integer iএবং পরে এটি করার ফলে এনপিই হয়।

  • সমতা বিষয়।

এই কোডটি বিবেচনা করুন:

Integer i1 = 5;
Integer i2 = 5;

i1 == i2; // Currently would be false.

মিথ্যা হবে। অপারেটরদের ওভারলোড হতে হবে, এবং এটি স্টাফের একটি বড় পুনর্লিখনের ফলস্বরূপ।

  • ধীরে

অবজেক্টের মোড়কগুলি তাদের আদিম অংশগুলির তুলনায় উল্লেখযোগ্যভাবে ধীর।


i1 == i2; কেবলমাত্র i1> = 128 হলেই মিথ্যা হবে So সুতরাং, বর্তমান উদাহরণটি ভুল
জেনি

7

আদিমগুলি আদিম ধরণেরগুলির চেয়ে অনেক বেশি ভারী ওজনযুক্ত, তাই আড়ম্বরপূর্ণ ক্লাসগুলির উদাহরণগুলির চেয়ে আদিম প্রকারগুলি আরও বেশি দক্ষ।

আদিম ধরণেরগুলি খুব সহজ: উদাহরণস্বরূপ একটি ইন্টি 32 বিট এবং মেমরিতে ঠিক 32 বিট নেয় এবং সরাসরি ম্যানিপুলেট করা যায়। একটি পূর্ণসংখ্যা অবজেক্ট একটি সম্পূর্ণ অবজেক্ট, যা (যে কোনও বস্তুর মতো) গাদাতে সংরক্ষণ করতে হয় এবং কেবলমাত্র এটিতে একটি রেফারেন্স (পয়েন্টার) এর মাধ্যমে অ্যাক্সেস করা যায়। এটি সম্ভবত 32 টি বিট (4 বাইট) মেমরিরও গ্রহণ করে।

এটি বলেছিল যে জাভা আদিম এবং অ-আদিম ধরণের মধ্যে পার্থক্য রাখে তা জাভা প্রোগ্রামিং ভাষার বয়সের একটি চিহ্নও। নতুন প্রোগ্রামিং ভাষার এই পার্থক্য নেই; আপনি যদি সাধারণ মূল্যবোধ বা আরও জটিল বিষয় ব্যবহার করেন তবে এই জাতীয় ভাষার সংকলক নিজেই এটি নির্ধারণ করতে যথেষ্ট স্মার্ট।

উদাহরণস্বরূপ, স্কালায় কোনও প্রকারভেদ নেই; পূর্ণসংখ্যার জন্য একটি বর্গ রয়েছে, এবং কোনও আন্ত একটি আসল অবজেক্ট (যা আপনি এগুলি পদ্ধতিতে ব্যবহার করতে পারেন)। সংকলকটি যখন আপনার কোডটি সংকলন করে, তখন এটি পর্দার আড়ালে আদিম কৌতুকগুলি ব্যবহার করে, সুতরাং কোনও ইন্টার ব্যবহার জাভাতে কোনও আদিম অভ্যন্তরীণ ব্যবহারের মতোই দক্ষ।


1
আমি ধরে নিয়েছিলাম যে জেআরই জাভা মোড়ানো আদিমদের সাথে এটি করার জন্য যথেষ্ট "স্মার্ট" হবে। ব্যর্থ হয়।
নাফতুলি কে ২

7

অন্যেরা যা বলেছে তা ছাড়াও আদিম স্থানীয় ভেরিয়েবলগুলি গাদা থেকে বরাদ্দ করা হয় না, বরং স্ট্যাকের পরিবর্তে। তবে বস্তুগুলি গাদা থেকে বরাদ্দ করা হয় এবং এভাবে আবর্জনা সংগ্রহ করতে হয়।


3
দুঃখিত, এটি ভুল। একটি স্মার্ট জেভিএম যেকোন অবজেক্টের বরাদ্দ নিয়ে পালাতে বিশ্লেষণ করতে পারে এবং যদি তারা পালাতে না পারে তবে এগুলি স্ট্যাকের মধ্যে বরাদ্দ করে।
rlibby

2
হ্যাঁ, এটি আধুনিক জেভিএমগুলির বৈশিষ্ট্য হতে শুরু করেছে । পাঁচ বছরে, আপনি যা বলছেন তা বেশিরভাগ জেভিএম-এর জন্য তখন ব্যবহারের ক্ষেত্রে সত্য হবে। আজ তা নয়। আমি প্রায় এ সম্পর্কে মন্তব্য, কিন্তু এটি সম্পর্কে মন্তব্য না করার সিদ্ধান্ত নিয়েছে। আমার কিছু বলা উচিত ছিল।
এডি

6

আদিম ধরণের অনেক সুবিধা রয়েছে:

  • সহজ কোড লিখতে
  • পারফরম্যান্স আরও ভাল যেহেতু আপনি ভেরিয়েবলের জন্য কোনও অবজেক্ট ইনস্ট্যান্ট করছেন না
  • যেহেতু তারা কোনও জিনিসের রেফারেন্স উপস্থাপন করে না সেখানে নাল পরীক্ষা করার দরকার নেই
  • বক্সিং বৈশিষ্ট্যগুলির সুবিধা নেওয়ার প্রয়োজন না হলে আদিম প্রকারগুলি ব্যবহার করুন।

5

প্রচ্ছদের অধীনে কী ধরণের অপ্টিমাইজেশন চলছে তা জানা শক্ত।

স্থানীয় ব্যবহারের জন্য, যখন সংকলকটির নাল মানটির সম্ভাবনা বাদ দিয়ে অপ্টিমাইজেশন করার জন্য পর্যাপ্ত তথ্য রয়েছে, আমি আশা করি পারফরম্যান্সটি একই বা অনুরূপ হবে

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

তদ্ব্যতীত, তুলনায় তুলনায় Integerঅনেক উচ্চতর লজিক্যাল ওভারহেড রয়েছে int: এখন আপনাকে int a = b + c;ব্যতিক্রম ছোঁড়া বা না দেওয়া সম্পর্কে চিন্তা করতে হবে ।

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


5
int loops = 100000000;

long start = System.currentTimeMillis();
for (Long l = new Long(0); l<loops;l++) {
    //System.out.println("Long: "+l);
}
System.out.println("Milliseconds taken to loop '"+loops+"' times around Long: "+ (System.currentTimeMillis()- start));

start = System.currentTimeMillis();
for (long l = 0; l<loops;l++) {
    //System.out.println("long: "+l);
}
System.out.println("Milliseconds taken to loop '"+loops+"' times around long: "+ (System.currentTimeMillis()- start));

মিলিসেকেন্ডগুলি লং: 468 এর কাছাকাছি সময়ে '100000000' লুপে নেওয়া হয়েছে

মিলিসেকেন্ডগুলি প্রায় '100000000' লুপে নেওয়া হয়েছে: 31

পাশের নোটে, জাভাতে যাওয়ার মতো এটির মতো কিছু দেখে আমার আপত্তি হবে না।

Integer loop1 = new Integer(0);
for (loop1.lessThan(1000)) {
   ...
}

যেখানে লুপের জন্য স্বয়ংক্রিয়ভাবে লুপ 1 থেকে 0 থেকে 1000 বা বৃদ্ধি হয়

Integer loop1 = new Integer(1000);
for (loop1.greaterThan(0)) {
   ...
}

যেখানে লুপের জন্য স্বয়ংক্রিয়ভাবে লুপ 1 1000 থেকে 0 হ্রাস পায়।


2
  1. গাণিতিক ক্রিয়াকলাপ করার জন্য আপনার আদিম প্রয়োজন
  2. উপরের উত্তর হিসাবে এবং আরও ভাল পারফরম্যান্স অনুসারে পুরষ্মীরা কম স্মৃতি গ্রহণ করে

আপনার জিজ্ঞাসা করা উচিত কেন শ্রেণি / অবজেক্টের ধরণের প্রয়োজন

অবজেক্ট টাইপ থাকার কারণ হ'ল আমরা যখন সংগ্রহগুলি নিয়ে কাজ করি তখন আমাদের জীবনকে আরও সহজ করে তোলা। প্রিমিটিভগুলি সরাসরি তালিকা / মানচিত্রে যুক্ত করা যায় না বরং আপনার একটি মোড়কের ক্লাস লেখার প্রয়োজন। রেডিমেড ইন্টিজার ধরণের ক্লাস আপনাকে এখানে সহায়তা করে প্লাস এর অনেকগুলি ইউটিলিটি পদ্ধতি রয়েছে যেমন ইন্টিজার.প্যারেসইন্ট (স্ট্র)


2

আমি পূর্ববর্তী উত্তরগুলির সাথে একমত, আদিমতার মোড়কের জিনিসগুলি ব্যবহার ব্যয়বহুল। তবে, যদি আপনার অ্যাপ্লিকেশনটিতে পারফরম্যান্স সমালোচনা না করে তবে অবজেক্ট ব্যবহার করার সময় আপনি ওভারফ্লো এড়াতে পারেন। উদাহরণ স্বরূপ:

long bigNumber = Integer.MAX_VALUE + 2;

এর মান bigNumber-2147483647, এবং আপনি এটি 2147483649 হিসাবে প্রত্যাশা করবেন It's এটি কোডে একটি বাগ রয়েছে যা এটি করে স্থির করা হবে:

long bigNumber = Integer.MAX_VALUE + 2l; // note that '2' is a long now (it is '2L').

এবং bigNumberএটি 2147483649 হবে

আপনি যদি মোড়কের জিনিস ব্যবহার করেন তবে সমমানের কোডটি সংকলন করবে না।

Long bigNumber = Integer.MAX_VALUE + 2; // Not compiling

সুতরাং আদিম মোড়ক বস্তু ব্যবহার করে এই ধরণের সমস্যা বন্ধ করা সহজ।

আপনার প্রশ্নের ইতিমধ্যে ইতিমধ্যে উত্তর দেওয়া হয়েছে, যে আমি আগে উল্লিখিত না হয় সামান্য বিট আরও তথ্য যোগ করতে উত্তর।


1

কারণ জাভা আদিম ধরণের সমস্ত গাণিতিক ক্রিয়াকলাপ সম্পাদন করে। এই উদাহরণ বিবেচনা করুন:

public static int sumEven(List<Integer> li) {
    int sum = 0;
    for (Integer i: li)
        if (i % 2 == 0)
            sum += i;
        return sum;
}

এখানে, অনুস্মারক এবং unary প্লাস অপারেশনগুলি পূর্ণসংখ্যার (রেফারেন্স) প্রকারে প্রয়োগ করা যাবে না, সংকলক আনবক্সিং সম্পাদন করে এবং অপারেশনগুলি করে do

সুতরাং, জাভা প্রোগ্রামে কতটি অটোবক্সিং এবং আনবক্সিং অপারেশন হয় তা নিশ্চিত করুন। যেহেতু, এই ক্রিয়াকলাপগুলি সম্পাদন করতে সময় লাগে।

সাধারণত, টাইপ রেফারেন্স এবং আদিম ধরণের ফলাফলের যুক্তি রাখা ভাল is


1

আদিম ধরনের হয় অনেক দ্রুত এবং আরো অনেক প্রয়োজন, কম মেমরি । অতএব, আমরা সেগুলি ব্যবহার করতে পছন্দ করতে পারি।

অন্যদিকে, বর্তমান জাভা ভাষার স্পেসিফিকেশন জাভা সংগ্রহ বা প্রতিবিম্ব এপিআইতে প্যারামিটারাইজড ধরণের (জেনেরিক্স) আদিম ধরণের ব্যবহারের অনুমতি দেয় না।

যখন আমাদের অ্যাপ্লিকেশনটিতে প্রচুর পরিমাণে উপাদান সহ সংগ্রহের প্রয়োজন হয় তখন আমাদের যতটা সম্ভব "অর্থনৈতিক" প্রকারের অ্যারেগুলি ব্যবহার করা উচিত।

* বিস্তারিত তথ্যের জন্য উত্সটি দেখুন: https://www.baeldung.com/java-primitives-vs-objects


0

সংক্ষেপে বলতে গেলে: আদিম ধরণেরগুলি দ্রুত হয় এবং বক্সযুক্তগুলির চেয়ে কম মেমরির প্রয়োজন হয়

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