স্ট্রিং কনটেনটেশন: কনক্যাট () বনাম "+" অপারেটর


499

স্ট্রিং এ এবং বি ধরে নেওয়া:

a += b
a = a.concat(b)

ফণা নীচে, তারা কি একই জিনিস?

এখানে কনটাক্টটি রেফারেন্স হিসাবে ডিসপম্পল করা হয়েছে। +অপারেটরটি ডিসম্পাইল করতে সক্ষম হতে চাই এবং এটি কী করে তা দেখতে।

public String concat(String s) {

    int i = s.length();
    if (i == 0) {
        return this;
    }
    else {
        char ac[] = new char[count + i];
        getChars(0, count, ac, 0);
        s.getChars(0, i, ac, count);
        return new String(0, count + i, ac);
    }
}


3
আমি নিশ্চিত +না যে পচন হতে পারে।
গ্যালেন ন্যারে

1
জাভা ক্লাস ফাইলটি বিচ্ছিন্ন করতে জাভ্যাপ ব্যবহার করুন।
হট লিকস

'অপরিবর্তনীয়তা' এর কারণে আপনার সম্ভবত ব্যবহার করা উচিত - StringBufferঅথবা এর StringBuilderপরিবর্তে (দ্রুত অনিরাপদ থ্রেডটি বদলে
উজ্জ্বল সিং

উত্তর:


560

না, বেশ না।

প্রথমত, শব্দার্থবিজ্ঞানের মধ্যে কিছুটা পার্থক্য রয়েছে। যদি aথাকে nullতবে a.concat(b)একটি নিক্ষেপ করে NullPointerExceptionতবে এটির a+=bমূল মানটিকে aযেমন ব্যবহার করা হবে তেমন আচরণ করবে null। তদতিরিক্ত, concat()পদ্ধতিটি কেবলমাত্র Stringমানগুলি গ্রহণ করে যখন +অপারেটর নিঃশব্দে আর্গুমেন্টটিকে একটি স্ট্রিংয়ে রূপান্তরিত করে ( toString()বস্তুর জন্য পদ্ধতিটি ব্যবহার করে)। সুতরাং concat()পদ্ধতিটি যা গ্রহণ করে তাতে আরও কঠোর।

ফণা নীচে দেখতে, সঙ্গে একটি সাধারণ ক্লাস লিখুন a += b;

public class Concat {
    String cat(String a, String b) {
        a += b;
        return a;
    }
}

এখন javap -c(সান জেডিকে অন্তর্ভুক্ত) এর সাথে বিচ্ছিন্ন করুন । আপনার তালিকা সহ একটি তালিকা দেখতে হবে:

java.lang.String cat(java.lang.String, java.lang.String);
  Code:
   0:   new     #2; //class java/lang/StringBuilder
   3:   dup
   4:   invokespecial   #3; //Method java/lang/StringBuilder."<init>":()V
   7:   aload_1
   8:   invokevirtual   #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   11:  aload_2
   12:  invokevirtual   #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   15:  invokevirtual   #5; //Method java/lang/StringBuilder.toString:()Ljava/lang/    String;
   18:  astore_1
   19:  aload_1
   20:  areturn

সুতরাং, a += bএর সমতুল্য

a = new StringBuilder()
    .append(a)
    .append(b)
    .toString();

concatপদ্ধতি দ্রুত হওয়া উচিত। যাইহোক, আরও স্ট্রিং সহ StringBuilderপদ্ধতিটি কমপক্ষে পারফরম্যান্সের ক্ষেত্রে জিতে।

এর উত্স কোড Stringএবং StringBuilder(এবং এর প্যাকেজ-ব্যক্তিগত বেস শ্রেণি) সান জেডিকে src.zip এ উপলব্ধ। আপনি দেখতে পারেন যে আপনি একটি চরের অ্যারে তৈরি করছেন (প্রয়োজনীয় হিসাবে পুনরায় আকার দিন) এবং আপনি ফাইনালটি তৈরি করার সময় এটিকে ফেলে দিচ্ছেন String। অনুশীলনে মেমরি বরাদ্দ আশ্চর্যজনকভাবে দ্রুত।

আপডেট: পাভেল অ্যাডামস্কি নোট হিসাবে, সাম্প্রতিকতম হটস্পটে কর্মক্ষমতা পরিবর্তন হয়েছে। javacএখনও ঠিক একই কোড উত্পাদন করে তবে বাইটকোড সংকলক চিট করে। সাধারণ টেস্টিং পুরোপুরি ব্যর্থ হয় কারণ পুরো কোডের কোড ফেলে দেওয়া হয়। সামিং System.identityHashCode(না String.hashCode) দেখায় কোডটির StringBufferকিছুটা সুবিধা আছে। পরবর্তী আপডেটটি প্রকাশের সময় পরিবর্তনের বিষয়, বা আপনি যদি অন্য কোনও জেভিএম ব্যবহার করেন। থেকে @lukaseder , হটস্পট জেভিএম intrinsics একটি তালিকা


4
@ হাইপারলিংক আপনি কোডটি javap -cএকটি সংকলিত শ্রেণিতে ব্যবহার করে এটি ব্যবহার করতে পারেন। (। ওহ, উত্তর হিসেবে আপনি শুধু disassembly বাইটকোড ব্যাখ্যা করা প্রয়োজন, যা কঠিন করা উচিত হবে না।)
tackline - টম Hawtin

1
স্বতন্ত্র বাইকোডগুলি বুঝতে আপনি জেভিএম বিশেষের সাথে পরামর্শ করতে পারেন । আপনি যে জিনিসটি উল্লেখ করতে চাইছেন সেটি অধ্যায় in-এ রয়েছে A
হট লিকস

1
আমি ভাবছি কেন জাভা সংকলক StringBuilderদুটি স্ট্রিংয়ে যোগ দেওয়ার পরেও কেন ব্যবহার করে? যদি Stringচারটি স্ট্রিং পর্যন্ত যুক্ত স্ট্যাটিক পদ্ধতি বা ক এর মধ্যে সমস্ত স্ট্রিং অন্তর্ভুক্ত থাকে তবে String[]কোড দুটি অবজেক্টের বরাদ্দ (ফলাফল Stringএবং এর ব্যাকিং char[], একটিও রিন্ডন্ড্যান্ট) এবং তিনটি বরাদ্দ সহ যে কোনও স্ট্রিংয়ের সংখ্যক স্ট্রিংয়ের সংখ্যক চারটি স্ট্রিং পর্যন্ত যুক্ত হতে পারে ( String[], ফলে String, এবং ব্যাকিং char[], কেবলমাত্র প্রথম হচ্ছে অপ্রয়োজনীয় সহ)। যেমনটি হ'ল, StringBuilderউইল ব্যবহারের জন্য সর্বোত্তমভাবে চারটি বরাদ্দ প্রয়োজন এবং প্রতিটি অক্ষরকে দু'বার অনুলিপি করতে হবে।
সুপারক্যাট

এই অভিব্যক্তি, a + = খ। এর অর্থ এই নয়: a = a + b?
সর্বাধিক শ্রদ্ধেয় স্যার 20

3
এই উত্তরটি তৈরি হওয়ার পর থেকে বিষয়গুলি পরিবর্তিত হয়েছে। দয়া করে আমার উত্তর পড়ুন।
পাওয়ে অ্যাডামস্কি

90

নিয়াস সঠিক, তবে এটিও লক্ষণীয় যে স্পেশাল + অপারেটরটিকে জাভা সংকলক দ্বারা আরও কার্যকর কিছুতে রূপান্তর করতে পারে। জাভাতে একটি স্ট্রিংবিল্ডার শ্রেণি রয়েছে যা একটি নন-থ্রেড-নিরাপদ, পরিবর্তনীয় স্ট্রিং উপস্থাপন করে। স্ট্রিং কনটেক্সেশনগুলির একটি গুচ্ছ সম্পাদন করার সময়, জাভা সংকলক নিঃশব্দে রূপান্তর করে

String a = b + c + d;

মধ্যে

String a = new StringBuilder(b).append(c).append(d).toString();

বড় স্ট্রিংয়ের জন্য এটি উল্লেখযোগ্যভাবে আরও দক্ষ। যতদূর আমি জানি, আপনি যখন কনক্যাট পদ্ধতি ব্যবহার করেন তখন এটি ঘটে না।

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

সুতরাং যদি আপনি দক্ষতা সম্পর্কে অতি-উদ্বিগ্ন হন তবে আপনার সম্ভাব্য-খালি স্ট্রিংগুলি সংমিশ্রনের সময় কনক্যাট পদ্ধতিটি ব্যবহার করা উচিত এবং অন্যথায় + ব্যবহার করা উচিত। তবে, পারফরম্যান্সের পার্থক্যটি নগণ্য হওয়া উচিত এবং আপনার সম্ভবত এটি সম্পর্কে কখনও চিন্তা করা উচিত নয়।


কনক্যাট ইনফ্যাক্ট এটি করে না। আমি
কনট্যাট

10
আসলে এটা করে। আপনার কনক্যাট কোডের প্রথম লাইনটি দেখুন। কনকটের সমস্যাটি হ'ল এটি সর্বদা একটি নতুন স্ট্রিং তৈরি করে ()
মার্সিয়ো আগুইয়ার

2
@ মারসিওআগুইয়ার: সম্ভবত আপনার অর্থ এই যে + সর্বদা একটি নতুন জেনারেট করে String- যেমন আপনি বলেছিলেন, concatযখন আপনি শূন্যকে একত্রিত করেন তখন তার ব্যতিক্রম থাকে String
ব্লেজারব্লেড

45

আমি @ মারসিওর মতো একই পরীক্ষায় দৌড়েছি তবে পরিবর্তে নিম্নলিখিত লুপের সাথে:

String c = a;
for (long i = 0; i < 100000L; i++) {
    c = c.concat(b); // make sure javac cannot skip the loop
    // using c += b for the alternative
}

শুধু ভাল পরিমাপের জন্য, আমি StringBuilder.append()পাশাপাশি ছুঁড়েছি । প্রতিটি পরীক্ষা 10 বার চালানো হয়েছিল, প্রতিটি রানের জন্য 100k রেপিসহ। ফলাফল এখানে:

  • StringBuilderহাত নীচে জয়ী। বেশিরভাগ রানের জন্য ঘড়ির সময় ফলাফল 0 ছিল এবং দীর্ঘতম 16 মিনিট সময় নিয়েছিল।
  • a += b প্রতিটি রানের জন্য প্রায় 40000ms (40s) লাগে।
  • concat কেবল রান প্রতি 10000ms (10s) প্রয়োজন।

আমি অভ্যন্তরীণগুলি দেখতে বা এটি প্রোফাইলারের মাধ্যমে চালানোর জন্য ক্লাসটি বিচ্ছিন্ন করে ফেলিনি, তবে আমার সন্দেহ a += bহয় যে নতুন অবজেক্ট তৈরি করতে StringBuilderএবং সেগুলিতে আবার রূপান্তর করতে আমি বেশিরভাগ সময় ব্যয় করি String


4
বস্তু তৈরির সময়টি সত্যই গুরুত্বপূর্ণ। এজন্য অনেক পরিস্থিতিতে আমরা স্ট্রিংবিল্ডারকে + এর পিছনে স্ট্রিংবিল্ডারের সুবিধা না দিয়ে সরাসরি ব্যবহার করি।
কুলকফ্যান

1
@ কুলকফান: যখন +দুটি স্ট্রিংয়ের জন্য ব্যবহৃত হয়, এমন কোনও পরিস্থিতি আছে যেখানে ব্যবহার StringBuilderকরা তার চেয়ে ভাল হবে String.valueOf(s1).concat(s2)? কোনও ধারণা কেন কম্পাইলাররা পরবর্তীকালে ব্যবহার করবে না [বা অন্যথায় valueOfকলটি বাদ দেয় যেখানে ক্ষেত্রে s1নাল নয়?
ক্যাট

1
@ সুপের্যাট দুঃখিত আমি জানি না। এই চিনির পিছনে থাকা লোকেরা এর উত্তর দেওয়ার পক্ষে সেরা।
coolcfan

25

এখানে বেশিরভাগ উত্তরগুলি ২০০৮ সাল থেকে রয়েছে। মনে হচ্ছে সময়ের সাথে জিনিসগুলি পরিবর্তিত হয়েছে। জেএমএইচ দিয়ে তৈরি আমার সর্বশেষ মানদণ্ডগুলি দেখায় যে জাভা 8 এর +চেয়ে প্রায় দ্বিগুণ দ্রুতconcat

আমার মানদণ্ড:

@Warmup(iterations = 5, time = 200, timeUnit = TimeUnit.MILLISECONDS)
@Measurement(iterations = 5, time = 200, timeUnit = TimeUnit.MILLISECONDS)
public class StringConcatenation {

    @org.openjdk.jmh.annotations.State(Scope.Thread)
    public static class State2 {
        public String a = "abc";
        public String b = "xyz";
    }

    @org.openjdk.jmh.annotations.State(Scope.Thread)
    public static class State3 {
        public String a = "abc";
        public String b = "xyz";
        public String c = "123";
    }


    @org.openjdk.jmh.annotations.State(Scope.Thread)
    public static class State4 {
        public String a = "abc";
        public String b = "xyz";
        public String c = "123";
        public String d = "!@#";
    }

    @Benchmark
    public void plus_2(State2 state, Blackhole blackhole) {
        blackhole.consume(state.a+state.b);
    }

    @Benchmark
    public void plus_3(State3 state, Blackhole blackhole) {
        blackhole.consume(state.a+state.b+state.c);
    }

    @Benchmark
    public void plus_4(State4 state, Blackhole blackhole) {
        blackhole.consume(state.a+state.b+state.c+state.d);
    }

    @Benchmark
    public void stringbuilder_2(State2 state, Blackhole blackhole) {
        blackhole.consume(new StringBuilder().append(state.a).append(state.b).toString());
    }

    @Benchmark
    public void stringbuilder_3(State3 state, Blackhole blackhole) {
        blackhole.consume(new StringBuilder().append(state.a).append(state.b).append(state.c).toString());
    }

    @Benchmark
    public void stringbuilder_4(State4 state, Blackhole blackhole) {
        blackhole.consume(new StringBuilder().append(state.a).append(state.b).append(state.c).append(state.d).toString());
    }

    @Benchmark
    public void concat_2(State2 state, Blackhole blackhole) {
        blackhole.consume(state.a.concat(state.b));
    }

    @Benchmark
    public void concat_3(State3 state, Blackhole blackhole) {
        blackhole.consume(state.a.concat(state.b.concat(state.c)));
    }


    @Benchmark
    public void concat_4(State4 state, Blackhole blackhole) {
        blackhole.consume(state.a.concat(state.b.concat(state.c.concat(state.d))));
    }
}

ফলাফল:

Benchmark                             Mode  Cnt         Score         Error  Units
StringConcatenation.concat_2         thrpt   50  24908871.258 ± 1011269.986  ops/s
StringConcatenation.concat_3         thrpt   50  14228193.918 ±  466892.616  ops/s
StringConcatenation.concat_4         thrpt   50   9845069.776 ±  350532.591  ops/s
StringConcatenation.plus_2           thrpt   50  38999662.292 ± 8107397.316  ops/s
StringConcatenation.plus_3           thrpt   50  34985722.222 ± 5442660.250  ops/s
StringConcatenation.plus_4           thrpt   50  31910376.337 ± 2861001.162  ops/s
StringConcatenation.stringbuilder_2  thrpt   50  40472888.230 ± 9011210.632  ops/s
StringConcatenation.stringbuilder_3  thrpt   50  33902151.616 ± 5449026.680  ops/s
StringConcatenation.stringbuilder_4  thrpt   50  29220479.267 ± 3435315.681  ops/s

আমি ভাবছি কেন জাভা Stringকখনই কোনও এর উপাদানগুলিকে যুক্ত করে স্ট্রিং গঠনের জন্য কোনও স্থির ফাংশন অন্তর্ভুক্ত করে না String[]। এই +জাতীয় ফাংশনটি ব্যবহার করে 8 টি স্ট্রিং সংমিশ্রিত করার জন্য নির্মাণ এবং পরে বিসর্জন প্রয়োজন String[8], তবে এটিই কেবলমাত্র অবজেক্ট তৈরির প্রয়োজন হবে, যখন একটি ব্যবহারের StringBuilderজন্য নির্মাণ এবং পরিত্যাগের প্রয়োজন হবে StringBuilderএবং কমপক্ষে একটি char[]ব্যাকিং স্টোর প্রয়োজন।
সুপারক্যাট

@ সুপের্যাট ক্লাসের String.join()আশেপাশে দ্রুত সিনট্যাক্সের মোড়ক হিসাবে জাভা 8- তে কয়েকটি স্থিতিশীল পদ্ধতি যুক্ত করা হয়েছিল java.util.StringJoiner
তি স্টারগা

@ টিএসআর্টগা: এই +জাতীয় ফাংশনগুলি ব্যবহার করতে হ্যান্ডলিংয়ের পরিবর্তন হয়েছে?
supercat

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

@ টিএসটিগা: কোনও জাভা বাইটোকোড ফাইল "ফাংশন এক্স উপলব্ধ থাকলে, এটি কল করুন; অন্যথায় কিছু করুন" এমন কোনও উপায় রয়েছে যা কোনও শ্রেণি লোড করার প্রক্রিয়ায় সমাধান হতে পারে? স্ট্যাটিক পদ্ধতির সাথে কোড তৈরি করা যা জাবার স্থিতিশীল পদ্ধতির সাথে চেইন করতে পারে বা অন্যথায় স্ট্রিংবিল্ডার ব্যবহার করতে পারে যদি তা না পাওয়া যায় তবে এটি সর্বোত্তম সমাধান বলে মনে হয়।
সুপারক্যাট

22

টম + অপারেটর কী করে তা বর্ণনা করার ক্ষেত্রে সঠিক। এটি একটি অস্থায়ী তৈরি করে StringBuilder, অংশগুলি সংযোজন করে এবং শেষ করে toString()

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

@মারসিও: আপনি একটি মাইক্রো-বেঞ্চমার্ক তৈরি করেছেন ; আধুনিক জেভিএম এর সাথে এটি প্রোফাইল কোডের কোনও বৈধ উপায় নয়।

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

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


আমার অনুমান "এই অস্থায়ী ক্রিয়াকলাপগুলি" দ্বারা আপনি বোঝাতে চাইছেন স্ট্যাকের "গাদা" অবজেক্টগুলিকে বরাদ্দ দেওয়ার জন্য পলায়ন বিশ্লেষণের ব্যবহার যেখানে প্রমাণযোগ্য। যদিও পলায়ন বিশ্লেষণ হটস্পটে উপস্থিত রয়েছে (কিছু সিনক্রোনাইজেশন অপসারণের জন্য দরকারী) তবে আমি বিশ্বাস করি না এটি লেখার সময়, তুমি
টম হাটিন -

21

কিছু সহজ পরীক্ষা সম্পর্কে? নীচের কোডটি ব্যবহার করেছেন:

long start = System.currentTimeMillis();

String a = "a";

String b = "b";

for (int i = 0; i < 10000000; i++) { //ten million times
     String c = a.concat(b);
}

long end = System.currentTimeMillis();

System.out.println(end - start);
  • "a + b"সংস্করণে মৃত্যুদন্ড কার্যকর 2500ms
  • a.concat(b)মৃত্যুদন্ড কার্যকর 1200ms

বেশ কয়েকবার পরীক্ষিত। concat()সংস্করণ সঞ্চালনের গড়ে সময় অর্ধেক নেন।

এই ফলাফলটি আমাকে অবাক করে দিয়েছে কারণ concat()পদ্ধতিটি সর্বদা একটি নতুন স্ট্রিং তৈরি করে (এটি " new String(result)" ফেরত দেয় It's এটি সুবিদিত যে:

String a = new String("a") // more than 20 times slower than String a = "a"

কম্পাইলার কেন সবসময় একই স্ট্রিংয়ের ফলস্বরূপ জানতে পেরে "এ + বি" কোডে স্ট্রিং তৈরিটি অনুকূল করতে সক্ষম হয় নি? এটি একটি নতুন স্ট্রিং সৃষ্টি এড়াতে পারে। যদি আপনি উপরের বিবৃতিতে বিশ্বাস না করেন তবে নিজের জন্য পরীক্ষা করুন।


আমি জাভা jdk1.8.0_241 আপনার কোডটি পরীক্ষা করেছি, আমার জন্য "a + b" কোডটি অনুকূলিত ফলাফল দিচ্ছে। কনক্যাট (): 203 মিমি সহ এবং "+": 113 মিমি সহ । আমি পূর্বের রিলিজে অনুমান করি এটি অনুকূল ছিল না।
আক্কি

6

মূলত, + এবং concatপদ্ধতির মধ্যে দুটি গুরুত্বপূর্ণ পার্থক্য রয়েছে ।

  1. আপনি যদি কনক্যাট পদ্ধতিটি ব্যবহার করে থাকেন তবে আপনি কেবল + অপারেটরের ক্ষেত্রে স্ট্রিংগুলিকে সংহত করতে সক্ষম হবেন , আপনি কোনও ডাটা টাইপের সাথে স্ট্রিংটিও সংযুক্ত করতে পারেন।

    উদাহরণ স্বরূপ:

    String s = 10 + "Hello";

    এই ক্ষেত্রে, আউটপুট 10 হেলো হওয়া উচিত ।

    String s = "I";
    String s1 = s.concat("am").concat("good").concat("boy");
    System.out.println(s1);

    উপরের ক্ষেত্রে আপনাকে দুটি স্ট্রিং বাধ্যতামূলক প্রদান করতে হবে।

  2. + এবং কনকটের মধ্যে দ্বিতীয় এবং প্রধান পার্থক্য হ'ল:

    কেস 1: ধরুন আমি এইভাবে কংক্রিট অপারেটরের সাথে একই স্ট্রিংগুলি সংহত করি

    String s="I";
    String s1=s.concat("am").concat("good").concat("boy");
    System.out.println(s1);

    এক্ষেত্রে পুলটিতে তৈরি করা সামগ্রীর সংখ্যা 7 টি এর মতো:

    I
    am
    good
    boy
    Iam
    Iamgood
    Iamgoodboy

    কেস 2:

    এখন আমি + অপারেটরের মাধ্যমে একই স্ট্রিংগুলি একত্রীকরণ করতে যাচ্ছি

    String s="I"+"am"+"good"+"boy";
    System.out.println(s);

    উপরের ক্ষেত্রে তৈরি করা সামগ্রীর সংখ্যা কেবল 5 টি।

    আসলে যখন আমরা + অপারেটরের মাধ্যমে স্ট্রিংগুলি একত্রীকরণ করি তখন একই কাজটি সম্পাদন করার জন্য এটি একটি স্ট্রিংবফার শ্রেণি বজায় রাখে: -

    StringBuffer sb = new StringBuffer("I");
    sb.append("am");
    sb.append("good");
    sb.append("boy");
    System.out.println(sb);

    এইভাবে এটি কেবল পাঁচটি বস্তু তৈরি করবে।

সুতরাং ছেলেরা এগুলি হল + এবং কনক্যাট পদ্ধতির মধ্যে মূল পার্থক্য । উপভোগ করুন :)


আমার প্রিয়, আপনি খুব ভাল করেই জানেন যে কোনও স্ট্রিং আক্ষরিক স্ট্রিং অবজেক্ট হিসাবে বিবেচিত যা স্ট্রিং পুলে স্টোর করে case এক্ষেত্রে আমাদের কাছে 4 টি স্ট্রিং লিটারাল রয়েছে o সুতরাং স্পষ্টত কমপক্ষে 4 টি অবজেক্ট পুলে তৈরি করা উচিত।
দীপক শর্মা

1
আমি এটি মনে করি না: String s="I"+"am"+"good"+"boy"; String s2 = "go".concat("od"); System.out.println(s2 == s2.intern());প্রিন্টগুলি true, যার অর্থ "good"কল করার আগে স্ট্রিং পুলে ছিল নাintern()
ফেবিয়ান

আমি কেবল এই লাইনটি সম্পর্কেই কথা বলছি স্ট্রিং s = "আমি" + "আমি" + "ভাল" + "ছেলে"; এই ক্ষেত্রে সমস্ত 4 টি স্ট্রিং আক্ষরিক একটি পুলে রাখা হয় ence 4 টি অবজেক্ট পুলে তৈরি করা উচিত।
দীপক শর্মা

4

সম্পূর্ণতার জন্য, আমি যুক্ত করতে চেয়েছিলাম যে '+' অপারেটরের সংজ্ঞা জেএলএস এসই 1515.18.1 এ পাওয়া যাবে :

যদি কেবল একটি অপারেন্ড এক্সপ্রেশন স্ট্রিং টাইপ করে থাকে তবে স্ট্রিং রূপান্তর (§5.1.11) রান করার সময় স্ট্রিং উত্পাদন করতে অন্য অপারেণ্ডে সঞ্চালিত হয়।

স্ট্রিং কনটেনটেশনের ফলাফল হ'ল স্ট্রিং অবজেক্টের একটি রেফারেন্স যা দুটি অপরেন্ড স্ট্রিংয়ের সংমিশ্রণ। বাম-হাতের ক্রিয়াকলাপগুলি সদ্য নির্মিত স্ট্রিং-এ ডান-হাতের ক্রিয়াকলাপের পূর্ববর্তী।

স্ট্রিং অবজেক্টটি নতুনভাবে তৈরি হয়েছে (§12.5) যতক্ষণ না এক্সপ্রেশনটি একটি ধ্রুবক অভিব্যক্তি হয় (§15.28)।

বাস্তবায়ন সম্পর্কে জেএলএস নিম্নলিখিত বলে:

একটি মধ্যবর্তী স্ট্রিং অবজেক্ট তৈরি করা এবং তারপরে এড়ানোর জন্য একটি বাস্তবায়ন এক ধাপে রূপান্তর এবং সংক্ষেপণ সম্পাদন করতে পারে choose পুনরাবৃত্ত স্ট্রিং কন্ডেটিংয়ের কার্যকারিতা বাড়ানোর জন্য, একটি জাভা সংকলক স্ট্রিংবফার ক্লাস বা অনুরূপ কৌশল ব্যবহার করতে পারে যে কোনও এক্সপ্রেশনের মূল্যায়নের মাধ্যমে তৈরি করা ইন্টারমিডিয়েট স্ট্রিং অবজেক্টগুলির সংখ্যা হ্রাস করতে।

আদিম ধরণের জন্য, একটি বাস্তবায়ন একটি আদিম প্রকারটি সরাসরি স্ট্রিংয়ে রূপান্তর করে একটি মোড়কের বস্তুর তৈরি অপসারণ করতে পারে।

সুতরাং 'জাভা সংকলক থেকে স্ট্রিংবফার ক্লাস বা হ্রাস করতে অনুরূপ কৌশল ব্যবহার করতে পারে' তা বিচার করে বিভিন্ন সংকলক বিভিন্ন বাইট-কোড তৈরি করতে পারে।


2

+ অপারেটর একটি স্ট্রিং এবং স্ট্রিং, গৃহস্থালির কাজ, পূর্ণসংখ্যা, ডবল বা ভাসা ডাটা টাইপ মানের মধ্যে কাজ করতে পারেন। এটি কেবল সংক্ষেপণের আগে মানটিকে তার স্ট্রিং উপস্থাপনায় রূপান্তর করে।

CONCAT অপারেটর স্ট্রিংগুলিতে এবং দিয়েই করা যায়। এটি ডেটা ধরণের সামঞ্জস্যের জন্য পরীক্ষা করে এবং ত্রুটি ছুড়ে দেয়, যদি সেগুলি মেলে না।

এটি বাদে, আপনি যে কোড সরবরাহ করেছেন সেটি একই জিনিসগুলি করে।


2

আমি তাই মনে করি না.

a.concat(b)স্ট্রিংয়ে প্রয়োগ করা হয়েছে এবং আমি মনে করি প্রারম্ভিক জাভা মেশিনের পরে বাস্তবায়ন খুব বেশি পরিবর্তন হয়নি। +অপারেশন বাস্তবায়ন জাভা সংস্করণ এবং কম্পাইলার উপর নির্ভর করে। বর্তমানে +ব্যবহার বাস্তবায়িত হয় StringBufferসম্ভব যত দ্রুত অপারেশন করতে। ভবিষ্যতে হয়তো এই পরিবর্তন হবে। জাভা এর পূর্ববর্তী সংস্করণে+ স্ট্রিংসে অপারেশনটি অনেক ধীর ছিল কারণ এটি মধ্যবর্তী ফলাফল তৈরি করেছিল।

আমার ধারণা এটি +=ব্যবহার করে বাস্তবায়ন করা হয়েছে +এবং একইভাবে অনুকূলিত optim


7
"বর্তমানে + স্ট্রিংবুফার ব্যবহার করে প্রয়োগ করা হয়েছে" মিথ্যা এটি স্ট্রিংবিল্ডার। স্ট্রিংবুফার স্ট্রিংবিল্ডারের থ্রেডসফেট ইমপ্লিট।
ফ্রেডেরিক মরিন

1
এটি জাভা 1.5 এর আগে স্ট্রিংবফার হিসাবে ব্যবহৃত হত, কারণ স্ট্রিংবিল্ডার প্রথমবারের সাথে এটি চালু হয়েছিল।
সিসিপিজ্জা

0

+ ব্যবহার করার সময়, স্ট্রিংয়ের দৈর্ঘ্য বাড়ার সাথে সাথে গতি হ্রাস পায়, তবে কনক্যাট ব্যবহার করার সময়, গতিটি আরও স্থিতিশীল হয় এবং সর্বোত্তম বিকল্পটি স্ট্রিংবিল্ডার শ্রেণি ব্যবহার করে যার পক্ষে স্থির গতি থাকে speed

আমার ধারণা আপনি বুঝতে পারবেন কেন। তবে দীর্ঘ স্ট্রিং তৈরির পুরোপুরি সর্বোত্তম উপায় হল স্ট্রিংবিল্ডার () এবং অ্যাপেন্ড () ব্যবহার করা, উভয়ই গতি অগ্রহণযোগ্য।


1
+ অপারেটরটি ব্যবহার করা স্ট্রিংবিল্ডার ( ডকস.ওরাকল .com/ জাভাসে / স্পেসস / জেএলস / সি 8 / এইচটিএমএল /… ) ব্যবহারের সমতুল্য
ইহেবিহব
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.