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। নতুন শ্রেণীর উদাহরণ তৈরি করা
একটি নতুন শ্রেণীর উদাহরণ নীচের পরিস্থিতিতে সুস্পষ্টভাবে তৈরি করা যেতে পারে:
অন্য কথায়, আপনি যখন কোনও অ্যাপ্লিকেশন শুরু করবেন, স্ট্রিং পুলটিতে ইতিমধ্যে বস্তু রয়েছে। আপনি সবেই জানেন যে তারা কী এবং তারা কোথা থেকে এসেছে (যদি না আপনি যে সমস্ত অক্ষরে অক্ষরে সমস্ত বোঝা ক্লাস স্ক্যান করেন)।
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");
এটি ধ্রুবক পুলে দুটি এবং একটি হিপ মেমরিতে দুটি বস্তু তৈরি করবে।