জাভাতে পার্সিয়ান্ট () এবং মান ওফ () এর মধ্যে আলাদা?


443

এর parseInt()থেকে আলাদা কীভাবে valueOf()?

তারা ঠিক আমার কাছে একই জিনিস করে আছে বলে মনে হচ্ছে (এছাড়াও জন্য যায় parseFloat(), parseDouble(), parseLong()ইত্যাদি, তারা কিভাবে থেকে ভিন্ন Long.valueOf(string)?

এছাড়াও, এর মধ্যে কোনটি অধিবেশন দ্বারা পছন্দনীয় এবং বেশি ব্যবহৃত হয়?

উত্তর:


411

ওয়েল, এপিআই Integer.valueOf(String)সত্যই বলে যে এটি Stringব্যাখ্যা করা হয়েছে ঠিক যেমন এটি দেওয়া হয়েছিল Integer.parseInt(String)। যাইহোক, valueOf(String)কোনও বস্তু প্রদান করে যেখানে আদিম ফেরত দেয় ।new Integer()parseInt(String)int

আপনি যদি এর সম্ভাব্য ক্যাচিং সুবিধাগুলি উপভোগ করতে চান তবে আপনি Integer.valueOf(int)এই চোখের পাত্রটিও ব্যবহার করতে পারেন:

Integer k = Integer.valueOf(Integer.parseInt("123"))

এখন, তুমি কি চাও বস্তু এবং না হলে আদিম, তারপর ব্যবহার valueOf(String)থেকে একটি নতুন অবজেক্ট উপার্জন চেয়ে আরো আকর্ষণীয় হতে পারে parseInt(String)কারণ সাবেক জুড়ে অনবরত উপস্থিত Integer, Long, Double, ইত্যাদি


8
দুটি পদ্ধতির মধ্যে কোনও পারফরম্যান্স বা স্মৃতির পার্থক্য রয়েছে কি?
লোগান

90
Integer.valueOf(Integer.parseInt("123"))চক্র এবং আপনার প্রোগ্রামের আকার নষ্ট করা Integer.valueOf("123")বা Integer.valueOf(123)বাদ দিয়ে কোনও লাভ নেই ।
থমাস এডিং

9
একটি পার্থক্য রয়েছে - নতুন অবজেক্ট (সম্ভাব্যভাবে) ভ্যালুওএফ দ্বারা বরাদ্দ করা একটি ওভারহেড (অবজেক্টটির জন্য মেমরি, হ্যান্ডলিং, জিসি) নিয়ে আসে, যখন প্লেইন ইনট অত্যন্ত "হালকা" light (সর্বাধিক সাধারণ মানগুলির জন্য, আপনি প্রাক-বিদ্যমান অবজেক্টগুলির রেফারেন্স পাবেন, যা একটি সামান্য কিছুটা সহায়তা করে))
ফু

14
Integer.valueOf(String)ঠিক একই ক্যাচিং করে Integer.valueOf(int)। আসলে, এটি হিসাবে প্রয়োগ করা হয়েছে Integer.valueOf(Integer.parseInt(…))...
হোলগার

11
@ চেজ এর পক্ষে কোনও আদিম ফিরে আসা অসম্ভব int। স্বাক্ষরটি বলে যে এটি একটি ফেরত দেয় Integerএবং এটি ঠিক তা করে। এই উত্তরটি আংশিকভাবেও ভুল যখন এটি বলে যে এটি একটি 'নতুন' ফেরত দেয় Integer। এটি জাভাদোকতে যা বলে তা নয়। এটি একটি ক্যাশেড ফিরতে বিনামূল্যে Integer
মারকুইস লার্নের

73

এই ফোরাম থেকে :

parseInt()ফেরৎ আদিম পূর্ণসংখ্যা প্রকার ( int- এ ), যেখানে valueOfরিটার্ন java.lang.Integer , যা পূর্ণসংখ্যা বস্তুর প্রতিনিধি। এমন পরিস্থিতিতে রয়েছে যেখানে আপনি আদিম ধরণের পরিবর্তে কোনও পূর্ণসংখ্যার অবজেক্ট চান।

অবশ্যই, আরেকটি সুস্পষ্ট পার্থক্য হ'ল ইনটাল্যু হ'ল একটি উদাহরণ পদ্ধতি যার মাধ্যমে পার্সিয়ান্ট একটি স্থির পদ্ধতি।


9
উল্লেখযোগ্য: মান ও সংস্করণগুলি একই অভ্যন্তরীণ মান সহ অন্য কোনও উদাহরণ নয়, প্রদত্ত মানের জন্য একই আইবাম ফেরত দিতে অভ্যন্তরীণ রেফারেন্স পুল ব্যবহার করবে। এর অর্থ হল যে প্রদত্ত দুটি লং এইভাবে ফিরে এসেছিল, a.equals (b) == সত্য এবং a == খ সত্য
বাসসারো

আরও প্রমাণিত হিসাবে, আপনি স্ট্রিং সংস্করণগুলির জন্য সঠিক, আমি আদিম সংস্করণগুলির কথা ভাবছিলাম। Long.valueOf (5) সর্বদা একই বস্তুটি ফিরিয়ে দেবে। স্ট্রিং সংস্করণগুলি নতুন অবজেক্টগুলি ফিরিয়ে দেয়, আদিম সংস্করণগুলি একই বস্তুগুলি ফেরত দেয়
বাসেরো

1
@bassezero। এছাড়াও, এই পুলের একটি সীমা রয়েছে। আমার মনে হয় এটি -127 থেকে 127 ছিল
অস্কার রাইজ

1
রেফারেন্স পুলের আকারটি বাস্তবায়নের বিশদটির সত্য উদাহরণ; এমনকি এটি কোনও প্যাচ রিলিজ আকারে বাড়ানো যেতে পারে এবং কোনও কিছুর জন্য আপনার কখনই এটির উপর নির্ভর করা উচিত নয় ।
ডোনাল ফেলো

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

36
Integer.valueOf(s)

অনুরূপ

new Integer(Integer.parseInt(s))

পার্থক্যটি হ'ল valueOf()একটি Integer, এবং parseInt()একটি int(একটি আদিম প্রকার) প্রদান করে। এছাড়াও নোট করুন যে valueOf()কোনও ক্যাশেড Integerউদাহরণটি ফিরিয়ে আনতে পারে, যা বিভ্রান্তিকর ফলাফলের কারণ হতে পারে যেখানে ==পরীক্ষার ফলাফল মাঝে মাঝে যথাযথ বলে মনে হয়। অটোবক্সিংয়ের আগে সুবিধার মধ্যে একটি পার্থক্য থাকতে পারে, জাভা 1.5 পরে এটি আসলে কোনও ব্যাপার নয়।

অধিকন্তু, Integer.parseInt(s)আদিম ডাটাটাইপ হিসাবে ভাল লাগতে পারে।


4
মানOf () একই আর্গুমেন্টের সাথে ক্রমাগত কলগুলির জন্য একই বস্তুটি ফেরত দিতে পারে (এবং -128 এবং 127 সমেত অন্তর্ভূক্তির জন্য প্রয়োজন)। নতুন পূর্ণসংখ্যা () সর্বদা একটি নতুন অবজেক্ট তৈরি করে।
অ্যাডাম রোজেনফিল্ড

কোনটি বেশি ব্যবহৃত হয়? কোনটি আমার সবচেয়ে বেশি ব্যবহার করা উচিত?
ক্লিক করুন

3
আপনার যদি প্রয়োজন হয়, পার্সেন্ট () ব্যবহার করুন, যদি আপনার একটি পূর্ণসংখ্যার প্রয়োজন হয়, মানফল () ব্যবহার করুন
ম্যাট বি

আপনার শেষ লাইন থেকে জোয়ান ডি সিলভা, আমি মনে করি Integer.parseInt (গুলি) কেবল একটি স্ট্রিং হিসাবে নিতে পারে যেখানে Integer.ValueOf (গুলি) ইনপুট আর্গুমেন্ট হিসাবে অন্তর্ এবং স্ট্রিং উভয় গ্রহণ করতে পারে
প্রতীক

14

জাভা উত্স দেখুন: valueOfব্যবহার করছে parseInt:

/**
 * Parses the specified string as a signed decimal integer value.
 *
 * @param string
 *            the string representation of an integer value.
 * @return an {@code Integer} instance containing the integer value
 *         represented by {@code string}.
 * @throws NumberFormatException
 *             if {@code string} cannot be parsed as an integer value.
 * @see #parseInt(String)
 */
public static Integer valueOf(String string) throws NumberFormatException {
    return valueOf(parseInt(string));
}

parseInt আয় int

/**
 * Parses the specified string as a signed decimal integer value. The ASCII
 * character \u002d ('-') is recognized as the minus sign.
 *
 * @param string
 *            the string representation of an integer value.
 * @return the primitive integer value represented by {@code string}.
 * @throws NumberFormatException
 *             if {@code string} cannot be parsed as an integer value.
 */
public static int parseInt(String string) throws NumberFormatException {
    return parseInt(string, 10);
}

6

Integer.parseInt কেবল নেটিভ টাইপ হিসাবে int ফিরে আসতে পারে।

Integer.valueOf আসলে একটি পূর্ণসংখ্যার অবজেক্ট বরাদ্দ করতে পারে, যদি না যে পূর্ণসংখ্যা পূর্বনির্ধারিতগুলির মধ্যে একটি হয়। এর জন্য আরও ব্যয় হয়।

আপনার যদি কেবল দেশীয় প্রকারের প্রয়োজন হয় তবে পার্সেন্ট ব্যবহার করুন। আপনার যদি কোনও অবজেক্টের প্রয়োজন হয়, মান মান ব্যবহার করুন use

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


1

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


আসলে, বেশ সত্য নয়। আমি প্রথমে আমার নিজের মতো করে ভেবেছিলাম, তবে জাভাডোকসটি ইন্টিজার.ভালিউওফ (স্ট্রিং) এর জন্য পরিষ্কারভাবে জানিয়েছে যে এটি নতুন পূর্ণসংখ্যার (ইন্টিজার.পার্সইন্ট (স্ট্রিং)) সমতুল্য। পূর্ণসংখ্যা.ভালিউওফ (ইনট্রি) প্রকৃতপক্ষে ক্যাশে করে।
মাইকেল ম্যাইইয়ার্স

আপনি স্ট্রিং সংস্করণগুলির জন্য সঠিক, আমি আদিম সংস্করণগুলির কথা ভাবছিলাম। Long.valueOf (5) সর্বদা একই বস্তুটি ফিরিয়ে দেবে।
বাসেরো

1

কারণ আপনি সম্ভবত jdk1.5 + ব্যবহার করছেন এবং সেখানে এটি স্বয়ংক্রিয়ভাবে ইনটে রূপান্তর করে। সুতরাং আপনার কোডে এটির প্রথমটি পূর্ণসংখ্যা এবং তারপরে স্বয়ংক্রিয়ভাবে ইনটে রূপান্তরিত হয়।

আপনার কোড যেমন হয়

int abc = new Integer(123);

0

আপনি যদি পূর্ণসংখ্যার ক্লাসটি পরীক্ষা করে থাকেন তবে আপনি সেই মানটি কল পার্সইন্ট পদ্ধতিটি দেখতে পাবেন। আপনি যখন API কে ভ্যালুফ কল করেন তখন বড় পার্থক্যটি ক্যাশে হচ্ছে is মানটি -128 থেকে 127 এর মধ্যে থাকলে এটি ক্যাশে করে দয়া করে আরও তথ্যের জন্য লিঙ্কের নীচে সন্ধান করুন

http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html


0

সর্বজনীন স্ট্যাটিক পূর্ণসংখ্যা মান (স্ট্রিং)

  1. যুক্তিটি একটি স্বাক্ষরিত দশমিক পূর্ণসংখ্যার প্রতিনিধিত্বকারী হিসাবে ব্যাখ্যা করা হয়, ঠিক যেমনটি যুক্তিটি পার্সেন্ট (জাভা.লং.স্ট্রিং) পদ্ধতিতে দেওয়া হয়েছিল।
  2. ফলাফলটি একটি পূর্ণসংখ্যা অবজেক্ট যা স্ট্রিং দ্বারা নির্দিষ্ট পূর্ণসংখ্যার মান উপস্থাপন করে।

  3. অন্য কথায়, এই পদ্ধতিটি নতুন পূর্ণসংখ্যার (পূর্ণসংখ্যা


0
  • valueOf - র্যাপার ক্লাসে রূপান্তরিত হয়
  • parseInt - আদিম ধরণের রূপান্তর করে

Integer.parseInt কেবল স্ট্রিং গ্রহণ করুন এবং আদিম পূর্ণসংখ্যার প্রকার (ইনট) প্রদান করুন।

   public static int parseInt(String s) throws NumberFormatException {
        return parseInt(s,10);
    }

Iteger.valueO যদি int এবং স্ট্রিং গ্রহণ করে। মান যদি স্ট্রিং হয় তবে মানটি যদি এটিকে পার্সেন্ট ব্যবহার করে সরল আইটে রূপান্তর করে এবং ইনপুট -128 এর চেয়ে কম বা 127 এর চেয়ে বেশি হয় তবে নতুন পূর্ণসংখ্যা ফেরত দেয় input যদি ইনপুটটি পরিসীমা থাকে (-128 - 127) এটি সর্বদা একটি থেকে পূর্ণসংখ্যার বস্তু ফেরত দেয় অভ্যন্তরীণ পূর্ণসংখ্যা পূর্ণসংখ্যা শ্রেণি একটি অভ্যন্তরীণ স্থিতিশীল ইন্টিজার ক্যাশে বর্গ বজায় রাখে যা ক্যাশে হিসাবে কাজ করে এবং -128 থেকে 127 পর্যন্ত পূর্ণসংখ্যার অবজেক্টগুলিকে ধারণ করে এবং এজন্য যখন আমরা 127 (উদাহরণস্বরূপ) এর জন্য পূর্ণসংখ্যার বস্তু পাওয়ার চেষ্টা করি আমরা সর্বদা একই বস্তুটি পাই।

Iteger.valueOf(200)200 থেকে নতুন পূর্ণসংখ্যা দেবে It's এটির new Integer(200) Iteger.valueOf(127)মতোই Integer = 127;

আপনি যদি স্ট্রিংকে পূর্ণসংখ্যার ব্যবহারে রূপান্তর করতে চান না Iteger.valueOf

আপনি যদি স্ট্রিংকে সাধারণ ইনট ব্যবহারে রূপান্তর করতে চান না Integer.parseInt। এটি দ্রুত কাজ করে।

  public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

  public static Integer valueOf(String s) throws NumberFormatException {
        return Integer.valueOf(parseInt(s, 10));
  }

  private static class IntegerCache {
      static final int low = -128;
      static final int high;
      static final Integer cache[];

    static {
        // high value may be configured by property
        int h = 127;
        String integerCacheHighPropValue =
            sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
        if (integerCacheHighPropValue != null) {
            try {
                int i = parseInt(integerCacheHighPropValue);
                i = Math.max(i, 127);
                // Maximum array size is Integer.MAX_VALUE
                h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
            } catch( NumberFormatException nfe) {
                // If the property cannot be parsed into an int, ignore it.
            }
        }
        high = h;

        cache = new Integer[(high - low) + 1];
        int j = low;
        for(int k = 0; k < cache.length; k++)
            cache[k] = new Integer(j++);

        // range [-128, 127] must be interned (JLS7 5.1.7)
        assert IntegerCache.high >= 127;
    }

    private IntegerCache() {}
  }

এবং তুলনা করে পূর্ণসংখ্যা.ভালিউওফ (127) == পূর্ণসংখ্যা.ভালিউঅফ (127) সত্য প্রত্যাবর্তন

Integer a = 127; // Compiler converts this line to Integer a = Integer.valueOf(127);
Integer b = 127; // Compiler converts this line to Integer b = Integer.valueOf(127);
a == b; // return true 

কারণ এটি ক্যাশে থেকে একই রেফারেন্স সহ পূর্ণসংখ্যার অবজেক্টগুলিকে গ্রহণ করে।

তবে Integer.valueOf (128) == Integer.valueOf (128) মিথ্যা, কারণ 128 ইন্টিজার ক্যাশে সীমার বাইরে এবং এটি নতুন পূর্ণসংখ্যা ফেরত দেয়, সুতরাং অবজেক্টের বিভিন্ন রেফারেন্স থাকবে।


দয়া করে সাহসী বিন্যাসকে অপব্যবহার করবেন না: এটি আপনার পোস্টের পঠনযোগ্যতাকে হ্রাস করে।
জো

-2
  1. ValueOf -> এর ক্ষেত্রে এটি একটি পূর্ণসংখ্যার অবজেক্ট তৈরি করে। কোনও আদিম ধরণের নয় এবং স্থির পদ্ধতি নয়।
  2. ParseInt.ParseFloat -> এর ক্ষেত্রে এটি সম্পর্কিত আদিম ধরণের ফেরত দেয়। এবং একটি স্থিতিশীল পদ্ধতি।

আমাদের প্রয়োজন অনুসারে আমাদের যে কোনও একটি ব্যবহার করা উচিত। যেমন কোনও বস্তুর তাত্ক্ষণিকভাবে ভ্যালুওফের ক্ষেত্রে। এটি আরও সংস্থান গ্রহণ করবে যদি আমাদের কেবলমাত্র কিছু পাঠ্যের মান প্রয়োজন তবে আমাদের উচিত পার্সেন্ট, পার্সফ্লোট ইত্যাদি ব্যবহার করা should

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