ইন্টিজার.টোস্ট্রিং (ইনট আই) বনাম স্ট্রিং.ভালিউওফ (ইনট আই)


175

আমি ভাবছি পদ্ধতিটি কেন String.valueOf(int i)বিদ্যমান? আমি এই পদ্ধতি ব্যবহার করছি রূপান্তর করতে intপ্রবেশ Stringএবং মাত্র আবিষ্কৃত Integer.toString(int i)পদ্ধতি।

এই পদ্ধতিগুলির বাস্তবায়নটি দেখার পরে আমি দেখলাম যে প্রথমটি দ্বিতীয়টিকে কল করছে। ফলস্বরূপ আমার সমস্ত কলগুলি String.valueOf(int i)সরাসরি কল করার চেয়ে আরও একটি কল জড়িতInteger.toString(int i)


3
কেবল রেফারেন্সের উদ্দেশ্যে: স্ট্যাকওভারফ্লো
ববি

উত্তর:


46

একই জিনিসটি করার দুটি ভিন্ন উপায়। এটি historicalতিহাসিক কারণ হতে পারে (অন্যজনের আগে একজন এসেছিল কিনা তা মনে করতে পারে না)।


22
হ্যাঁ, তবে কিছু যদি একই কাজ করে তবে এর অর্থ এই নয় যে একই জিনিস।
দামিয়ান লেজস্কিওস্কি - ভ্যাশ

3
স্ট্রিং.ভ্যালুওফ (ইনট্রেট) কেবলমাত্র ইন্টিজার.টোস্ট্রিং (আই) কে সরাসরি কল করে। ইন্টিজার.টোস্ট্রিং (ইনট) এ কল করা ভাল।
djchapm

171

স্ট্রিং টাইপে আমাদের বেশ কয়েকটি পদ্ধতি মান রয়েছে

static String   valueOf(boolean b) 
static String   valueOf(char c) 
static String   valueOf(char[] data) 
static String   valueOf(char[] data, int offset, int count) 
static String   valueOf(double d) 
static String   valueOf(float f) 
static String   valueOf(int i) 
static String   valueOf(long l) 
static String   valueOf(Object obj) 

যেহেতু আমরা দেখতে পাচ্ছি যে এই পদ্ধতিটি সমস্ত ধরণের সংখ্যা সমাধান করতে সক্ষম

আপনার মতো নির্দিষ্ট পদ্ধতির প্রতিটি বাস্তবায়ন উপস্থাপন করেছেন: সুতরাং আমাদের কাছে পূর্ণসংখ্যার জন্য

Integer.toString(int i)

দ্বিগুণ জন্য

Double.toString(double d)

ইত্যাদি

আমার মতে এটি কোনও historicalতিহাসিক জিনিস নয়, তবে কোনও বিকাশকারীর পক্ষে valueOfস্ট্রিং ক্লাস থেকে সঠিক ধরণের চেয়ে পদ্ধতিটি ব্যবহার করা আরও কার্যকর , কারণ এটি করার জন্য আমাদের কম পরিবর্তন হতে পারে।

নমুনা 1:

public String doStuff(int num) {

  // Do something with num...

  return String.valueOf(num);

 }

sample2:

public String doStuff(int num) {

 // Do something with num...

 return Integer.toString(num);

 }

আমরা যেমন নমুনা 2 তে দেখি আমাদের দুটি নমুনা বিপরীতে দুটি পরিবর্তন করতে হবে।

আমার উপসংহারে, valueOfস্ট্রিং ক্লাস থেকে পদ্ধতিটি ব্যবহার করা আরও নমনীয় এবং সে কারণেই এটি এখানে উপলব্ধ।


18
এবং এটি ভুলে যাবেন না Integer.toString(int i, int radix)যে 10 এর বাইরে অন্য ঘাঁটির স্ট্রিংগুলিতে রূপান্তরিত হবে
স্টিফেন পি

@ ওয়াশ আপনি কি স্ট্রিংয়ের সাথে তুলনা করে স্ট্রিংয়ের সাথে তুলনা করতে খালি স্ট্রিং ব্যবহার সম্পর্কে ব্যাখ্যা করতে পারেন? মূল্য? উদাঃ) "" + ইনট আই = "আই"? কোনটি সেরা?
কানগাভেলু সুগুমার

1
স্ট্রিং হিসাবে ইন্ট ফর্ম্যাট করতে আপনার "+ i ব্যবহার করা উচিত নয়। মাথার উপরে বড় অস্তিত্ব নেই তবে সাধারণত এটি মার্জিত নয়। ব্যবহারের পরিবর্তে String.valueOf(int), আপনি String.format("%d",i);আরও পড়ার জন্য ব্যবহার করতে পারেন দয়া করে এই ওয়েবসাইটটি দেখুন ডকস.অরাকল.com
ড্যামিয়ান

আমি চাই যে অটোবক্সিং চালাক ছিল এবং সংকলন বা কিছুতে রূপান্তরটি যুক্ত করেছে।
রব গ্রান্ট

1
@ রবার্টগ্রান্ট এখানে অটোবক্সিংয়ের ঘটনা নেই। তবে আপনার উদ্বেগের জবাব দিতে, আপনি এটি করতে int i = new Integer("1");এবং তদ্বিপরীত হিসাবে চালাক এটি is
দামিয়ান লেজস্কিওস্কি - ভ্যাশ

52

একটি বিশাল পার্থক্য হ'ল আপনি যদি toString()নাল বস্তুতে আহ্বান করেন তবে আপনি কিছুটা সময় পাবেন NullPointerException, ব্যবহার করে String.valueOf()আপনি শূন্যতার জন্য পরীক্ষা করতে পারবেন না।


46
প্রশ্নটি Integer.toString(int i)একটি staticপদ্ধতি সম্পর্কে । কোনও nullবস্তু সম্ভব নয়।
পেট্রা জেনেয়েক

14
Integer i = null; i.toString(); // Null pointer exception!! String.valueOf(i); // No exception
মণীশ_সকোবর

10
@ মানিস কুমার: আপনার উদাহরণটি String.valueOf(int i)পদ্ধতিটিকে আগুন ধরিয়ে দেবে না String.valueOf(Object obj)। যাইহোক, প্রশ্নটি আদিম intমান সম্পর্কে , যেখানে কোনও সম্ভাবনা নেই null
hleinone

1
@ মানিশ_স উদাহরণ থেকে এটি বেশ স্পষ্ট ছিল যে কেউই অবজেক্ট টাইপ পূর্ণসংখ্যার বিষয়ে কথা বলছে না। আমরা কেবল আদিমদের নিয়ে কথা বলছি।
ড্যানিয়েল ওচোয়া

2
@ মানিশ_স: ওপি বলেনি Integer.toString()তবে Integer.toString(int i)। এটি একটি স্থিতিশীল পদ্ধতি ( ডকস.ওরাকল . com / জাভাসে / / / ডকস / এপি / জাভা / লং )।
LarsH

13

স্ট্রিং ক্লাসটি সমস্ত আদিম ধরণের এবং অবজেক্ট টাইপের জন্য মান মান পদ্ধতি প্রদান করে তাই আমি ধরে নিই যে তারা সুবিধামত পদ্ধতি যা সমস্ত এক শ্রেণির মাধ্যমে অ্যাক্সেস করতে পারে।

এনবি প্রোফাইলিংয়ের ফলাফল

গড় ইন্টটোস্ট্রিং = 5368 মিমি, গড় স্ট্রিংভ্যালুওফ = 5689ms (100,000,000 ক্রিয়াকলাপের জন্য)

public class StringIntTest {


    public static long intToString () {
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 100000000; i++) {
            String j = Integer.toString(i);
        }
        long finishTime = System.currentTimeMillis();

        return finishTime - startTime;
    }

    public static long stringValueOf () {

        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 100000000; i++) {
            String j = String.valueOf(i);
        }
        long finishTime = System.currentTimeMillis();

        return finishTime - startTime;
    }

    public static void main(String[] args) {
        long intToStringElapsed = 0;
        long stringValueOfElapsed = 0;
        for (int i = 0; i < 10; i++) {
            intToStringElapsed += intToString();
            stringValueOfElapsed+= stringValueOf();
        }
        System.out.println("Average intToString = "+ (intToStringElapsed /10));
        System.out.println("Average stringValueOf = " +(stringValueOfElapsed / 10));
    }
}

7
আপনার প্রোফাইলিংয়ের সত্যই "ওয়ার্ম-আপ" পিরিয়ড হওয়া উচিত, অন্যথায় ফলাফলগুলি জেআইটি জিনিসগুলির সাথে ঝাঁকুনির দ্বারা ঝুঁকতে পারে। বলেছিল যে, 10 ^ 8 অপারেশনের মধ্যে 300 মাইলের পার্থক্যটি সম্পূর্ণ তুচ্ছ হিসাবে এত ছোট।
ক্যামেরন স্কিনার

1
কিংগো আমি আপনার পরীক্ষার কেসটি সঠিক বলে মনে করি না। কারণ আপনি মান নির্ধারণ করছেন String jকিন্তু কখনও ব্যবহার করবেন না। অন্তর্নিহিত সংকলক এটি অনুকূলিত করতে পারে। জে অবজেক্টটি বিভিন্ন পদ্ধতিতে পাস করা এবং কিছু ডামি অপারেশন করা ভাল।
রাকেশ

1
আপনার বাড়ির উত্সাহিত মাইক্রো বেনমার্কগুলি সত্যই এভাবে লেখা উচিত নয়। আপনি যদি জেএমএইচ ব্যবহার করেন । এটি ওয়ার্মআপ, সময় পরিমাপ, একাধিক ইন্ডিপেন্ডেন্ট চেষ্টা (জাভা কাঁটাচামচ!) যত্ন নেবে এবং কোডটি ছোট করে তোলে এটি দেখতে (বিভিন্ন পদ্ধতি এবং মানের জন্য ফলাফল - রানটাইম 7 মিনিট): gist.github.com/ecki/ 399136f4fd59c1d110c1 ( স্পোলার : "" + এন জিতেছে)।

5
ধন্যবাদ বন্ধু, তবে আমার উত্তরটি 5 বছর আগে ছিল! জেএমএইচ কেবল 2013 সালে প্রকাশিত হয়েছিল: পি
কিংো

9

জাভা সূত্র থেকে:

/**
 * Returns the string representation of the {@code int} argument.
 * <p>
 * The representation is exactly the one returned by the
 * {@code Integer.toString} method of one argument.
 *
 * @param   i   an {@code int}.
 * @return  a string representation of the {@code int} argument.
 * @see     java.lang.Integer#toString(int, int)
 */
public static String valueOf(int i) {
    return Integer.toString(i);
}

সুতরাং তারা ঠিক একই ফলাফল দেয় এবং একটিতে অন্যটিকে কল করে। আপনি যদি পরে টাইপটি পরিবর্তন করতে পারেন তবে স্ট্রিং.ভ্যালুওফটি আরও নমনীয়।


8

আপনি যদি Stringশ্রেণীর জন্য উত্স কোডটি দেখেন , Integer.toString()আপনি কল করার সময় এটি আসলে কল হয় valueOf()

বলা হচ্ছে, Integer.toString()পদ্ধতি কলগুলি সংকলনের সময় অনুকূলিত না করা হলে (যা সম্ভবত তারা হ'ল) তাত্পর্যপূর্ণ হতে পারে।


হ্যাঁ এবং "" এন আরও দ্রুত। Gist.github.com/ecki/399136f4fd59c1d110c1
eckes

3

String.valueOf()আপনি যেটি দেখতে পান তার বাস্তবায়ন হ'ল এপিআই-তে উল্লিখিত চুক্তিটি পূরণ করার সহজ উপায়: "উপস্থাপনটি হ'ল Integer.toString()এক যুক্তির পদ্ধতিতে ফিরে আসা ।"


2

ওপিএস প্রশ্নের উত্তর দেওয়ার জন্য, কেবলমাত্র অন্য কল করার জন্য এটি একটি সহায়ক মোড়ক এবং স্টাইলের পছন্দটিতে নেমে আসে এবং এটিই it আমি মনে করি এখানে প্রচুর ভুল তথ্য রয়েছে এবং জাভা বিকাশকারী সবচেয়ে ভাল কাজটি করতে পারেন প্রতিটি পদ্ধতির বাস্তবায়নটি দেখুন, এটি কোনও আইডিইতে এক বা দুটি ক্লিক দূরে রয়েছে। আপনি পরিষ্কারভাবে এটি দেখতে পাবেনString.valueOf(int) এটি কেবল Integer.toString(int)আপনার জন্য কল করছে।

সুতরাং, একেবারে শূন্যের পার্থক্য রয়েছে, এতে তারা উভয়ই একটি চর বাফার তৈরি করে, সংখ্যার অঙ্কগুলি দিয়ে চলতে থাকে, তারপরে এটিকে একটি নতুন স্ট্রিংয়ে অনুলিপি করে ফেরত দেয় (অতএব প্রত্যেকে একটি স্ট্রিং অবজেক্ট তৈরি করছে)। কেবল পার্থক্য হ'ল একটি অতিরিক্ত কল, যা সংকলক যাইহোক একক কলকে সরিয়ে দেয়।

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


আপনি দয়া করে কিছু পাঠাতে আপনার পাঠ্য পৃথক করতে পারেন? এটি পড়া খুব কঠিন।
ম্যাগনিলেক্স

এই ওপিতে অনেক ভুল তথ্য রয়েছে। আপনার পোস্টটি আমার পক্ষে সেরা উত্তর! ধন্যবাদ
aksappy

1

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

উভয়ের অস্তিত্বের কারণ সম্ভবত পঠনযোগ্যতা দেওয়া। বিভিন্ন ধরণের রূপান্তরিত হওয়ার প্রসঙ্গে String, তারপরে বিভিন্ন কলগুলি বিভিন্ন কলগুলির String.valueOf(SomeType)চেয়ে বেশি পঠনযোগ্য হতে পারে SomeType.toString


1
প্রকৃতপক্ষে, এই জাতীয় এক-লাইন কলগুলি খুব দ্রুত ইনলাইন হয়ে যায়।
তাসসোস বসোকোকস

এমনকি 1 000 000 সময়ের স্ট্রিং.ভেলুওফ () কে লুপ করা হচ্ছে ??
ম্যানুয়েল সেলভা

@ মানুয়েল: আপনি কি এটি প্রোফাইল করেছিলেন? আপনি কি সনাক্ত করেছেন যে এখানে আপনার কার্য সম্পাদনের সমস্যা রয়েছে? আপনি কি নিশ্চিত যে আপনি অকালে অপ্টিমাইজ করছেন না? @ টাসোস: হ্যাঁ, এটিও খুব সম্ভবত, তবে কোনওভাবেই আমি এ নিয়ে উদ্বিগ্ন হব না যতক্ষণ না প্রোফাইলিং না বলে যে এই বিশেষ কলটিতে কোনও সমস্যা আছে।
polygenelubricants

প্রকৃতপক্ষে, ম্যানুয়েল, আমি একবার বা দু'বার যাওয়ার চেয়ে প্রায়শই 1000000 বার লুপটি প্রত্যাশা করতাম। তবুও, এটি সময়ের একটি ছোট অংশ হতে চলেছে যতবার এটি লুপ করে না।
কর্সিকা

না তবে আমি নিশ্চিত যে আমার অ্যাপ্লিকেশনটিতে বোতল ঘাড় নেই। আমি কেবল এটি জিজ্ঞাসা করছি কারণ আমি এখানে কোনও পাঠযোগ্যতার উদ্বেগ দেখতে পাচ্ছি না এবং এইভাবে আমি মনে করি যে লাভটি 0 হলেও আমার আরও সর্বোত্তম কোডটি ব্যবহার করতে হবে? আপনি কি সম্মতি দিচ্ছেন না?
ম্যানুয়েল সেলভা

1

আমার উদ্বোধনটি সর্বদা উপস্থাপনের জন্য () সর্বদা টসট্রিং () বলা হয় এবং তাই প্রাইমেটিভ ধরণের মানটির উত্সকরণের জন্য সাধারণীকরণ করা হয় default অবজেক্ট। এখানে পূর্ণসংখ্যা.আর স্ট্রিং (ইনট i) কেবলমাত্র পূর্ণসংখ্যার জন্য রূপান্তর করে এমন একটি সীমা তৈরি করে।


1

Integer.toString (5) এবং String.valueOf (5) এর মধ্যে কোনও পার্থক্য নেই;

কারণ স্ট্রিং.ভ্যালুওফ রিটার্ন দেয়:

public static String valueOf(int i) {
    return Integer.toString(i);
}
public static String valueOf(float f) {
    return Float.toString(f);
}

ইত্যাদি ..


0

স্ট্রিং.ভ্যালুওফ () পদ্ধতিটি ব্যবহার করে আপনাকে ডেটা সম্পর্কে চিন্তা করতে হবে না (এটি আন্তঃ, দীর্ঘ, চর, চর [], বুলিয়ান, অবজেক্ট), আপনি কেবল কল করতে পারেন:

  • স্ট্যাটিক স্ট্রিংয়ের মান

একমাত্র সিনট্যাক্স স্ট্রিং.ভ্যালুওফ () ব্যবহার করে আপনি প্যারামিটার হিসাবে যা যা পাস তা স্ট্রিংয়ে রূপান্তরিত হয়ে ফিরে আসতে পারে ..

অন্যথায়, আপনি যদি Integer.toString (), Float.toString () ইত্যাদি ব্যবহার করেন (যেমন SomeType.toString ()) তবে আপনি স্ট্রিংতে রূপান্তর করতে চান এমন প্যারামিটারের ডেটাটাইপটি পরীক্ষা করতে হবে। সুতরাং, এই জাতীয় রূপান্তরগুলির জন্য স্ট্রিং.ভ্যালুওফ () ব্যবহার করা আরও ভাল।

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

স্ট্রিং.ভেলুওফ () পদ্ধতিটি যখন পাস করা প্যারামিটারের সাথে মেলে (তার পূর্ণসংখ্যা, চর, ফ্লোট ইত্যাদি কিনা) এবং পদ্ধতিটি ওভারলোডিংকে কল করে যে "ভ্যালুফ ()" পদ্ধতিটি যার প্যারামিটারটি মিলে যায় এবং তারপরে সেই পদ্ধতির অভ্যন্তরে তাদের হয় "টো স্ট্রিং ()" পদ্ধতিতে সরাসরি কল

সুতরাং, আমরা দেখতে পাচ্ছি যে কীভাবে ডেটাটাইপ পরীক্ষা করে তারপরে "টস্ট্রিং ()" পদ্ধতিটি কল করার ওভারহেডটি সরিয়ে ফেলা হয়েছে O কেবল আমাদের স্ট্রিংকে রূপান্তর করতে চান সেদিকে নজর না দিয়ে স্ট্রিং.ভেলুওফ () পদ্ধতিটি কল করা দরকার।

উপসংহার: স্ট্রিং.ভালিউওফ () পদ্ধতির কেবলমাত্র আরও একটি কল ব্যয় করে এর গুরুত্ব রয়েছে।


-3

স্ট্রিং()

  1. অবজেক্ট ক্লাসে উপস্থিত থাকে, সাধারণত উত্পন্ন ক্লাসে ওভাররাইড হয়
  2. টপস্টাস্ট থেকে উপযুক্ত শ্রেণিতে টু স্ট্রিং () পদ্ধতিতে কল করতে হবে।

মান()

  1. স্ট্রিং ক্লাসে ওভারলোডেড স্ট্যাটিক পদ্ধতি উপস্থিত।
  2. আদিম ধরণের পাশাপাশি বস্তুর প্রকারগুলি পরিচালনা করে।

    Integer a = null;
    System.out.println(Integer.toString()) ; NUll pointer exception
    System.out.println(String.valueOf() ; give NULL as value

এই লিঙ্কটি এটি খুব ভাল পরীক্ষা করে দেখুন। http://code4reference.com/2013/06/which-one-is-better-valueof-or-tostring/

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