স্ট্রিং জাভাতে অবজেক্টস, তাই কেন আমরা সেগুলি তৈরি করতে 'নতুন' ব্যবহার করি না?


104

আমরা সাধারণত newকীওয়ার্ড ব্যবহার করে অবজেক্ট তৈরি করি , যেমন:

Object obj = new Object();

স্ট্রিংগুলি অবজেক্টস, তবুও আমরা newএগুলি তৈরি করতে ব্যবহার করি না :

String str = "Hello World";

কেন? আমি কি স্ট্রিং দিয়ে তৈরি করতে পারি new?



1
কারণ স্ট্রিং লিটারেলগুলি ইতিমধ্যে অবজেক্ট।
লার্নের মারকুইস

1
নোটটি new String(...)বড় স্ট্রিংগুলি সাবস্ট্রিং করার সময় একটি প্রয়োগকরণের বিশদটি অবরুদ্ধ করতে ব্যবহৃত হয়েছে। এটি জাভা 7 এ স্থির করা হয়েছিল এবং এটি আর প্রয়োজন হয় না।
থরবজর্ন রাভন অ্যান্ডারসন

আমি এই পোস্টের 100 তম পছন্দকারী। :)
মুকিত09

উত্তর:


130

ইতিমধ্যে যা বলা হয়েছিল তা ছাড়াও, জাভাতে স্ট্রিং লিটারেলস [অর্থাত্ স্ট্রিংগুলি পছন্দ করে "abcd"তবে পছন্দ করা হয় না new String("abcd")] - এর অর্থ হ'ল প্রতিবার "abcd" উল্লেখ করার সময় আপনি Stringএকটি নতুন উদাহরণের পরিবর্তে একক উদাহরণের জন্য একটি রেফারেন্স পাবেন প্রতি বার. সুতরাং আপনি হবে:

String a = "abcd";
String b = "abcd";

a == b; //True

কিন্তু যদি আপনি ছিল

String a = new String("abcd");
String b = new String("abcd");

তাহলে এটা সম্ভব

a == b; // False

(এবং যদি কারও মনে করিয়ে দেওয়ার প্রয়োজন হয় তবে সর্বদা .equals()স্ট্রিংগুলির তুলনা করতে ব্যবহার করুন; ==শারীরিক সাম্যের জন্য পরীক্ষা)।

ইন্টার্নিং স্ট্রিং লিটারেলগুলি ভাল কারণ সেগুলি প্রায়শই একাধিকবার ব্যবহৃত হয়। উদাহরণস্বরূপ, (অনুমোদিত) কোডটি বিবেচনা করুন:

for (int i = 0; i < 10; i++) {
  System.out.println("Next iteration");
}

যদি আমাদের স্ট্রিংগুলির ইন্টার্নিং না হয় তবে "নেক্সট পুনরাবৃত্তি" 10 বার ইনস্ট্যান্ট করা দরকার, এখন এটি কেবল একবার ইনস্ট্যান্ট করা হবে।


1
স্ট্রিং এ = নতুন স্ট্রিং ("অ্যাবসিডি") ব্যবহার করে, এর অর্থ কি একই ধরণের সামগ্রী সহ দুটি স্ট্রিং মেমোরিতে উপস্থিত রয়েছে।
পরিবর্তন হয়েছে

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

হ্যাঁ, এই অপ্টিমাইজেশনটি সম্ভব কারণ স্ট্রিংগুলি পরিবর্তনযোগ্য এবং তাই সমস্যা ছাড়াই ভাগ করা যায়। ভাগ করা "এসএসডিএফ" হ্যান্ডলিং হ'ল 'ফ্লাইওয়েট' ডিজাইন প্যাটার্নের একটি বাস্তবায়ন।
ম্যানুয়েল আলডানা

কেউ বলেনি যে এটি সম্ভব নয়, কেবল এটির গ্যারান্টি নেই। এটা কি তোমার ডাউনটা?
danben

"== অবজেক্টের সমতার জন্য পরীক্ষা" বলতে কী বোঝ? এটি আমার কাছে সত্য বলে মনে হচ্ছে না, তবে সম্ভবত আপনি এর অর্থ বোঝায় বলে কিছুটা আলাদা বোঝাতে চেয়েছিলেন।
দাউদ ইবনে কেরেম

32

স্ট্রিং জাভাতে "বিশেষ" অবজেক্ট। জাভা ডিজাইনাররা বুদ্ধি করে সিদ্ধান্ত নিয়েছিলেন যে স্ট্রিংগুলি প্রায়শই ব্যবহার করা হয় যাতে তাদের নিজস্ব বাক্য গঠন পাশাপাশি ক্যাশিংয়ের কৌশল প্রয়োজন। যখন আপনি এই বলে স্ট্রিং ঘোষণা করেন:

String myString = "something";

মাইস্ট্রিং স্ট্রিং অবজেক্টের "একটি কিছু" এর মান সহ একটি রেফারেন্স। আপনি যদি পরে ঘোষণা করেন:

String myOtherString = "something";

জাভাটি যথেষ্ট দক্ষতার সাথে কাজ করে যে মাইস্ট্রিং এবং মাইঅথার স্ট্রিং একই রকম এবং এগুলিকে একই অবজেক্ট হিসাবে গ্লোবাল স্ট্রিং টেবিলে সংরক্ষণ করবে। এটি নির্ভর করে যে আপনি স্ট্রিংগুলি এটি করার জন্য পরিবর্তন করতে পারবেন না। এটি প্রয়োজনীয় মেমরির পরিমাণ হ্রাস করে এবং তুলনা দ্রুততর করতে পারে।

যদি, পরিবর্তে, আপনি লিখুন

String myOtherString = new String("something");

জাভা আপনার জন্য একেবারে নতুন অবজেক্ট তৈরি করবে, যা মাই স্ট্রিং অবজেক্ট থেকে আলাদা।


আরে ... স্ট্রিং আক্ষরিকের জন্য একরকম সিনট্যাকটিক সহায়তার প্রয়োজনীয়তা স্বীকৃতি জানাতে "অসীম প্রজ্ঞার" প্রয়োজন হয় না। প্রায় প্রতিটি অন্যান্য গুরুতর প্রোগ্রামিং ভাষার ডিজাইন কোনও ধরণের স্ট্রিং আক্ষরিক সমর্থন করে।
স্টিফেন সি

12
হাইপারবোলকে হ্রাস করা হয়েছে, ক্যাপ্টেন :)
জেমি ম্যাকক্রিন্ডল

16
String a = "abc"; // 1 Object: "abc" added to pool

String b = "abc"; // 0 Object: because it is already in the pool

String c = new String("abc"); // 1 Object

String d = new String("def"); // 1 Object + "def" is added to the Pool

String e = d.intern(); // (e==d) is "false" because e refers to the String in pool

String f = e.intern(); // (f==e) is "true" 

//Total Objects: 4 ("abc", c, d, "def").

আশা করি এটি কয়েকটি সন্দেহ সরিয়ে ফেলে। :)


স্ট্রিং d = নতুন স্ট্রিং ("ডিএফ"); // পুলের সাথে 1 অবজেক্ট + "ডিফ" যুক্ত করা হয়েছে -> এখানে "
ডিএফ" তখনই পুলটিতে যুক্ত করা

পুনঃটুইট এটি ইতিমধ্যে পুল হয়। এটি সংকলক দ্বারা সেখানে স্থাপন করা হয়েছিল।
লার্নের মারকুইস

@ ইজেপি এখানে (ই == d) মিথ্যা কেন? তারা উভয় পুলের ডানদিকে একই জিনিস "ডিএফ" রেফার করছে?
রাজা

স্ট্রিং সি = নতুন স্ট্রিং ("abc"); // 1 অবজেক্ট ... এই বিবৃতিটি কি সঠিক? যদি "এবিসি" ইতিমধ্যে ধ্রুবক পুল থেকে রেফারেন্স করা হয় তবে আন্তঃ পদ্ধতির ব্যবহার কী?
প্রশান্ত দেববাদ্বর

6

এটি একটি শর্টকাট। এটি মূলত এর মতো ছিল না, তবে জাভা এটি পরিবর্তন করেছে।

এই FAQ সংক্ষেপে এটি সম্পর্কে কথা বলে। জাভা স্পেসিফিকেশন গাইডও এ সম্পর্কে আলোচনা করে। তবে আমি এটি অনলাইনে খুঁজে পাচ্ছি না।


2
ভাঙা লিংক, এবং এটি কখনও পরিবর্তিত হয়েছিল যে অন্য কোনও প্রমাণ সম্পর্কে আমি অবগত নই।
লার্নের মারকুইস

1
@EJP এখনও এটি ওয়েবব্যাক মেশিনে রয়েছে যদি এটি কার্যকর হয়।
আরজান

6

স্ট্রিং বেশ কয়েকটি অপটিমাইজেশনের সাপেক্ষে (আরও ভাল শব্দগুচ্ছের জন্য)। নোট করুন যে স্ট্রিংয়ের অপারেটর ওভারলোডিং (+ অপারেটরের জন্য) - অন্যান্য অবজেক্টের মতো নয়। সুতরাং এটি খুব একটি বিশেষ ক্ষেত্রে।


1
+ আসলে একটি অপারেটর যা স্ট্রিংবিল্ডার.অ্যাপেন্ড (..) কলটিতে অনুবাদ করা হয়।
হুইস্কিসিয়ার

5

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

উদাহরণ:

String s1=“Hello“;
String s2=“Hello“;
String s3= new String(“Hello“);
String s4= new String(“Hello“);

মেমরির উপরের কোডের জন্য:

এখানে চিত্র বর্ণনা লিখুন


2

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

    String a = "foo";
    String b = "foo";
    System.out.println(a == b); // true
    String c = new String(a);
    System.out.println(a == c); // false
    c = c.intern();
    System.out.println(a == c); // true

যখন ক্লাসলোডার একটি ক্লাস লোড করে, সমস্ত স্ট্রিং ধ্রুবকগুলি স্ট্রিং পুলে যুক্ত হয়।


"ডাবল উদ্ধৃতি সংকলককে একটি স্ট্রিং অবজেক্ট তৈরি করার কারণ দেয়।" অবমূল্যায়িত মন্তব্য
csguy

0

সিনট্যাকটিক চিনি। দ্য

String s = new String("ABC");

বাক্য গঠন এখনও উপলব্ধ।


1
এটি মোটেই ঠিক নয়। s = নতুন স্ট্রিং ("এবিসি") আপনাকে s = "এবিসি" এর মতো একই ফলাফল দেবে না। দানবেনের মন্তব্য দেখুন।
স্টিভ বি।

2
এছাড়াও, কিছুটা ব্যঙ্গাত্মকভাবে, এটি প্রথমে "এবিসি" ইনলাইন উপস্থাপন করে একটি স্ট্রিং ইনস্ট্যান্স তৈরি করবে - এবং তারপরে এটি কনস্ট্রাক্টর কলকে যুক্তি হিসাবে পাস করবে যা একটি অভিন্ন মানের একটি স্ট্রিং তৈরি করবে।
আন্দ্রেজ ডয়েল

1
এই কনস্ট্রাক্টরের বৈধ ব্যবহারের ক্ষেত্রে এটি আপনাকে মূল স্ট্রিং থেকে String small = new String(huge.substring(int, int));বড় অন্তর্নিহিত পুনর্ব্যবহার করতে দেয় । char[]huge
পাস্কেল থিভেন্ট

1
@ প্যাসিকাল টিভেন্ট হ্যাঁ তবে জাভা ৮ এর সাথে আর নয় not এটি আরে ভাগ করে না (জি 1 বা আসন্ন স্ট্রিং সংকোচনের সাথে স্বয়ংক্রিয় স্ট্রিং ডুপ্লিকেশন এর মতো অন্যান্য অপ্টিমাইজেশনের প্রস্তুতির ক্ষেত্রে)।

পছন্দ করুন সংকলক আক্ষরিক জন্য অবজেক্ট তৈরি করে।
লার্নের মারকুইস

0

আপনি এখনও ব্যবহার করতে পারেন new String("string"), তবে স্ট্রিং লিটারালগুলি ছাড়া নতুন স্ট্রিং তৈরি করা শক্ত হবে ... আপনার অক্ষর অ্যারে বা বাইট ব্যবহার করতে হবে :-) স্ট্রিং লিটারেলের একটি অতিরিক্ত সম্পত্তি রয়েছে: যে কোনও শ্রেণি বিন্দু থেকে একই স্ট্রিংয়ে সমস্ত একই স্ট্রিং লিটারেলগুলি উদাহরণ (তারা অভ্যন্তরীণ হয়)।


0

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


0

এর সাথে একটি নতুন স্ট্রিং নির্দ্বিধায় তৈরি করুন

String s = new String("I'm a new String");

সাধারণ স্বরলিপিটি s = "new String";কম বেশি সুবিধাজনক শর্টকাট - যা কার্যকরী কারণে ব্যবহার করা উচিত বেশ কয়েকটি বিরল ক্ষেত্রে বাদে, যেখানে আপনার সত্যিকারের স্ট্রিংগুলি দরকার যা সমীকরণের জন্য যোগ্যতা অর্জন করে qual

(string1.equals(string2)) && !(string1 == string2)

সম্পাদনা

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


4
-1 - খারাপ পরামর্শ। new String(...)আপনার অ্যাপ্লিকেশনটি অপ্রত্যাশিতভাবে ব্যবহার করতে "নির্দ্বিধায়িত হওয়া" উচিত নয়, আপনাকে একটি আলাদা পরিচয় দিয়ে স্ট্রিং তৈরি করতে প্রয়োজনীয়।
স্টিফেন সি

1
আমি জানি। স্পষ্টকরণের জন্য পোস্টটি সম্পাদনা করেছেন।
Andreas ডলক

0

আক্ষরিক পুলটিতে যে কোনও স্ট্রিং রয়েছে যা কীওয়ার্ডটি ব্যবহার না করে তৈরি করা হয়েছিল new

একটি পার্থক্য রয়েছে: নতুন রেফারেন্স ছাড়াই স্ট্রিং স্ট্রিং আক্ষরিক পুলে সংরক্ষণ করা হয় এবং নতুন সহ স্ট্রিং বলেন যে তারা হিপ মেমোরিতে রয়েছে।

স্ট্রিং নতুন সহ অন্য যে কোনও বস্তুর মতো মেমোরিতে অন্য কোথাও রয়েছে।


0

কারণ স্ট্রিং জাভাতে একটি অপরিবর্তনীয় শ্রেণি।

এখন কেন তা অপরিবর্তনীয়? স্ট্রিং যেমন অপরিবর্তনীয় তাই একাধিক থ্রেডের মধ্যে এটি ভাগ করা যায় এবং স্ট্রিং অপারেশনকে বাহ্যিকভাবে সিঙ্ক্রোনাইজ করার দরকার নেই। স্ট্রিং যেমন শ্রেণি লোডিং পদ্ধতিতে ব্যবহৃত হয়। সুতরাং স্ট্রিং যদি পরিবর্তনযোগ্য হয় তবে java.io.writer কে abc.xyz.mywriter এ পরিবর্তন করা যেতে পারে


0
TString obj1 = new TString("Jan Peter");                
TString obj2 = new TString("Jan Peter");                    

if (obj1.Name == obj2.Name)                 
    System.out.println("True");
else                
    System.out.println("False");

আউটপুট:

সত্য

আমি দুটি পৃথক বস্তু তৈরি করেছি, উভয়েরই একটি ক্ষেত্র (রেফ) 'নাম' রয়েছে। এমনকি এই ক্ষেত্রে "জান পিটার" ভাগ করে নেওয়া হয়েছে, যদি আমি জাভা বোঝার উপায়টি বুঝতে পারি ..


0

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

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