java - একাধিক স্ট্রিং সংমিশ্রণ করার জন্য কতগুলি স্ট্রিং অবজেক্ট তৈরি করা হবে?




string string-concatenation (5)

আপনার প্রশ্নের যে কোনও উত্তর জেভিএম বাস্তবায়ন এবং বর্তমানে ব্যবহৃত জাভা সংস্করণের উপর নির্ভর করবে। আমি মনে করি এটি একটি সাক্ষাত্কারে জিজ্ঞাসা করা অযৌক্তিক প্রশ্ন।

জাভা 8

আমার মেশিনে, জাভা 1.8.0_201 এর সাথে আপনার স্নিপেটের ফলাফল এই বাইকোডে

L0
 LINENUMBER 13 L0
 LDC "First"
 ASTORE 1
L1
 LINENUMBER 14 L1
 LDC "Second"
 ASTORE 2
L2
 LINENUMBER 15 L2
 LDC "Third"
 ASTORE 3
L3
 LINENUMBER 16 L3
 NEW java/lang/StringBuilder
 DUP
 INVOKESPECIAL java/lang/StringBuilder.<init> ()V
 ALOAD 1
 INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
 ALOAD 2
 INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
 ALOAD 3
 INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
 INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
 ASTORE 4

যা প্রমাণ করে যে 5 টি অবজেক্ট তৈরি হচ্ছে (3 String StringBuilder *, 1 StringBuilder , 1 StringBuilder#toString String দ্বারা String ইনস্ট্যান্স গতিশীলভাবে তৈরি করা হয়েছে)।

জাভা 12

আমার মেশিনে, জাভা 12.0.2 এর সাথে, বাইটকোডটি রয়েছে

// identical to the bytecode above
L3
 LINENUMBER 16 L3
 ALOAD 1
 ALOAD 2
 ALOAD 3
 INVOKEDYNAMIC makeConcatWithConstants(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; [
  // handle kind 0x6 : INVOKESTATIC
  java/lang/invoke/StringConcatFactory.makeConcatWithConstants(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
  // arguments:
  "\u0001\u0001\u0001"
 ]
 ASTORE 4

মধ্যবর্তী StringBuilder সাথে জড়িত না StringBuilder যা StringBuilder 4 টি অবজেক্টে "সঠিক উত্তর" পরিবর্তন করে।

* আসুন কিছুটা গভীর খনন করি।

12.5। নতুন শ্রেণীর উদাহরণ তৈরি করা

একটি নতুন শ্রেণীর উদাহরণ নীচের পরিস্থিতিতে সুস্পষ্টভাবে তৈরি করা যেতে পারে:

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

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

java.lang.String ক্লাসটি নিঃসন্দেহে একটি প্রয়োজনীয় জেভিএম শ্রেণি হিসাবে লোড করা হবে, যার অর্থ এটির সমস্ত আক্ষরিক তৈরি করা হবে এবং সেটিকে পুলে স্থাপন করা হবে।

আসুন স্ট্রিংয়ের সোর্স কোড থেকে এলোমেলোভাবে নির্বাচিত একটি স্নিপেট নেওয়া যাক, এটি থেকে বেশ কয়েকটি আক্ষরিক বাছাই করুন, আমাদের প্রোগ্রামের একেবারে শুরুতে একটি ব্রেকপয়েন্ট রাখুন, এবং পরীক্ষা করুন যে পুলটিতে এই লিটারেলগুলি রয়েছে কিনা।

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence,
               Constable, ConstantDesc {
    ...
    public String repeat(int count) {
        // ... 
        if (Integer.MAX_VALUE / count < len) {
            throw new OutOfMemoryError("Repeating " + len + " bytes String " + count +
                    " times will produce a String exceeding maximum size.");
        }
    }
    ...
}

তারা সেখানে আছে।

একটি আকর্ষণীয় সন্ধান হিসাবে, এই আইডিইএর ফিল্টারিংয়ের একটি পার্শ্ব প্রতিক্রিয়া রয়েছে: আমি যে সাবস্ট্রিংগুলি সন্ধান করছিলাম তা পুলটিতেও যুক্ত করা হয়েছে। আমি this.contains("bytes String") প্রয়োগ করার পরে পুলের আকার এক ( "bytes String" হয়েছিল) this.contains("bytes String")

এটা কখন আমাদের ছাড়বে?

আমরা String str1 = "First"; বলার আগে "First" তৈরি এবং ইন্টার্ন করা হয়েছিল কিনা সে সম্পর্কে আমাদের ধারণা নেই String str1 = "First"; , সুতরাং আমরা দৃ firm়ভাবে বলতে পারি না যে লাইনটি একটি নতুন উদাহরণ তৈরি করে।

আমাকে একটি সাক্ষাত্কারে প্রদত্ত সমস্যাটির ভিত্তিতে কতগুলি অবজেক্ট তৈরি করা হবে তা সম্পর্কে জিজ্ঞাসা করা হয়েছিল:

String str1 = "First";
String str2 = "Second";
String str3 = "Third";
String str4 = str1 + str2 + str3;

আমি উত্তর দিয়েছি যে স্ট্রিং পুলে 6 টি অবজেক্ট তৈরি করা হবে।

3 তিনটি ভেরিয়েবলের প্রতিটি জন্য হবে।
1 টি str1 + str2 জন্য হবে (আসুন str বলি)।
1 টি str2 + str3 জন্য হবে।
1 টি str + str3 ( str = str1 + str2 ) এর জন্য হবে।

আমি যে উত্তর দিয়েছি তা কি সঠিক? তা না হলে সঠিক উত্তর কী?


এটি 5 হওয়া উচিত:

  • তিনটি str3 জন্য তিনটি ( str1 , str2 এবং str3 জন্য নির্ধারিত)

  • str1 + str2 জন্য একটি

  • একটির জন্য (result from the previous operation) + str3 ( (result from the previous operation) + str3 নিয়োগ করা)


জাভা 8 সম্ভবত 5 টি বস্তু তৈরি করবে:

  • 3 আক্ষরিক জন্য 3
  • 1 StringBuilder
  • সংক্ষিপ্ত String জন্য 1

জাভা দিয়ে 9 টি জিনিস পরিবর্তিত হয়েছে এবং String কনক্যাটেনশন আর StringBuilder ব্যবহার করে না।


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


স্ট্রিং ধ্রুবক পুলে 4 স্ট্রিং অবজেক্ট তৈরি করা হবে। আক্ষরিক জন্য 3 এবং একযোগে সহ।

যদি আমরা ব্যবহার করি

String s1 = new String("one")

এটি ধ্রুবক পুলে দুটি এবং একটি হিপ মেমরিতে দুটি বস্তু তৈরি করবে।

যদি আমরা সংজ্ঞায়িত করি:

String s1 = "one";
String s2 = new String("one");

এটি ধ্রুবক পুলে দুটি এবং একটি হিপ মেমরিতে দুটি বস্তু তৈরি করবে।








string-building