জাভা স্ট্রিংস: "স্ট্রিং এস = নতুন স্ট্রিং (" মূর্খ ")"


86

আমি জাভা শিখছি একটি সি ++ লোক। আমি কার্যকর জাভা পড়ছি এবং কিছু আমাকে বিভ্রান্ত করেছে। এটি বলে যে এইভাবে কোডটি কখনই লিখবে না:

String s = new String("silly");

কারণ এটি অপ্রয়োজনীয় Stringবস্তু তৈরি করে। তবে পরিবর্তে এটি এইভাবে লেখা উচিত:

String s = "No longer silly";

ঠিক আছে এখন পর্যন্ত ... যাইহোক, এই শ্রেণি দেওয়া:

public final class CaseInsensitiveString {
    private String s;
    public CaseInsensitiveString(String s) {
        if (s == null) {
            throw new NullPointerException();
        }
        this.s = s;
    }
    :
    :
}

CaseInsensitiveString cis = new CaseInsensitiveString("Polish");
String s = "polish";
  1. প্রথম বিবৃতি ঠিক আছে কেন? এটা হওয়া উচিত নয়

    CaseInsensitiveString cis = "Polish";

  2. উপরের বিবৃতিটি ঠিক আছে (এর সাথে এবং প্রসারিত না করে ) কীভাবে এমন CaseInsensitiveStringআচরণ করব ? স্ট্রিং সম্পর্কে এটি কী এমন যে এটি কেবল আক্ষরিকভাবে এটি পাস করতে সক্ষম হতে ঠিক করে তোলে? আমার বোঝা থেকে জাভাতে কোন "কপি কন্সট্রাক্টর" ধারণা নেই?StringString


4
স্ট্রিং str1 = "foo"; স্ট্রিং str2 = "foo"; স্ট্রিংপুলের স্ট্রিং পরিচালনা করে স্ট্রিংপুলে স্ট্রিং পরিচালনা করে স্ট্রিং অবজেক্ট, "ফু", বিআর কোজ আরআরএইচআর এবং স্ট্রাইপ উভয়ই একই স্ট্রিংকে বোঝায়, নতুন স্ট্রিংটিকে একই স্ট্রিংকে বোঝানো হয়, এটি অন্য একটি তৈরি করে না বরং একই অ্যালরেডি উপস্থিতকে নির্ধারণ করে স্ট্রিংপুল তবে আমরা যখন এটি করি: স্ট্রিং str1 = নতুন স্ট্রিং ("foo"); স্ট্রিং str2 = নতুন স্ট্রিং ("foo"); এখানে str1 এবং str2 উভয়ই বিভিন্ন অবজেক্টের অন্তর্গত, নতুন স্ট্রিং () শক্তভাবে একটি নতুন স্ট্রিং অবজেক্ট তৈরি করুন।
আকাশ5288

উত্তর:


111

Stringভাষার একটি বিশেষ অন্তর্নির্মিত শ্রেণি। এটি কেবলমাত্রString ক্লাসের জন্য যাতে আপনার বলা এড়ানো উচিত

String s = new String("Polish");

কারণ আক্ষরিক "Polish"ইতিমধ্যে টাইপযুক্ত Stringএবং আপনি একটি অতিরিক্ত অপ্রয়োজনীয় বস্তু তৈরি করছেন। অন্য কোন শ্রেণির জন্য, বলছি

CaseInsensitiveString cis = new CaseInsensitiveString("Polish");

সঠিক (এবং শুধুমাত্র, এক্ষেত্রে) করণীয় কাজ।


8
দ্বিতীয় বিষয়টি হ'ল সংকলকটি স্ট্রিং লিটারেলগুলি দিয়ে ইন্টার্নিগ / প্রচার-প্রসারিত স্টাফগুলিকে পছন্দ করতে পারে যা "স্ট্রিং (আক্ষরিক)" এর মতো অদ্ভুত ফাংশনকল দিয়ে অগত্যা সম্ভব হয় না
তেথা

4
যেহেতু আপনাকে কখনই কল করা উচিত নয় new String("foo"), তাই আপনি নিজেকে জিজ্ঞাসা করতে পারেন কেন নির্মাণকারীর new String(String)উপস্থিতি রয়েছে। : উত্তর কখনও কখনও যে এটির জন্য একটি ভাল ব্যবহার stackoverflow.com/a/390854/1442870
Enwired

অবগতির জন্য, উপরে Tetha এর মন্তব্য, শব্দ "interning" বানান ভুল হিসেবে স্ট্রিং interning
তুলসী বার্ক

57

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

উদাহরণস্বরূপ, নিম্নলিখিত কোডটি প্রথম লাইনের জন্য সত্য প্রিন্ট করবে তবে দ্বিতীয়টির জন্য মিথ্যা:

System.out.println("foo" == "foo");
System.out.println(new String("bar") == new String("bar"));

15
একইভাবে, এজন্যই ফাইন্ডব্যাগস আপনাকে "নতুন পূর্ণসংখ্যা (এন)" "" পূর্ণসংখ্যা.ভালিউঅফ (এন) "এর সাথে প্রতিস্থাপন করতে বলে - সেই ইন্টার্নিংয়ের কারণে।
পল টমবলিন 16

6
আপনার "foo" == নতুন স্ট্রিং ("foo") যোগ করা উচিত intern ইন্টার্ন ()
জেমস শেক

4
একটি সংশোধন: স্ট্রিং আক্ষরিকগুলি ভিএম দ্বারা নয়, সংকলক দ্বারা একই রেফারেন্সকে নির্দেশ করতে তৈরি করা হয়। ভিএম রান টাইমে স্ট্রিং অবজেক্টগুলিকে ইন্টার্ন করতে পারে, তাই দ্বিতীয় লাইনটি সত্য বা মিথ্যা ফিরে আসতে পারে!
ক্রেগ পি মোটলিন

4
@ মটলিন: আমি নিশ্চিত না যে এটি সঠিক। স্ট্রিং ক্লাসের জাভাদোক আদেশ দেয় যে "সমস্ত আক্ষরিক স্ট্রিং এবং স্ট্রিং-মূল্যবান ধ্রুবক অভিব্যক্তি ইন্টার্ন করা হয়"। সুতরাং আমরা আক্ষরিক অভ্যন্তরীণ হওয়ার উপর নির্ভর করতে পারি, যার অর্থ "foo" == "foo" সর্বদা সত্য হওয়া উচিত।
লেইগ করুন

4
@ হ্যাঁ, আক্ষরিক অভ্যন্তরীণ হয়, তবে সংকলক দ্বারা এবং ভিএম দ্বারা নয়। মটলিন যা পাচ্ছেন তা হ'ল ভিএম অতিরিক্তভাবে ইন্টার্নের স্ট্রিংগুলি তৈরি করতে পারে, সুতরাং নতুন স্ট্রিং ("বার") == নতুন স্ট্রিং ("বার") -> মিথ্যা বাস্তবায়ন নির্ভর।
হারুন মেনপা

30

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

যদি লিখি

String s = "Polish";
String t = "Polish";

তারপরে s এবং t আসলে একই অবজেক্টের উল্লেখ করে এবং s == t সত্যই ফিরে আসবে, "==" পড়ার জন্য "একই জিনিস" "(বা পারে, যাইহোক, আমি নিশ্চিত নই যে এটির অংশ কিনা প্রকৃত ভাষার বৈশিষ্ট্য বা কেবল সংকলক বাস্তবায়নের বিশদ - তাই সম্ভবত এটির উপর নির্ভর করা নিরাপদ নয়)।

যদি লিখি

String s = new String("Polish");
String t = new String("Polish");

তাহলে s! = t (কারণ আপনি স্পষ্টভাবে একটি নতুন স্ট্রিং তৈরি করেছেন) যদিও s.equals (টি) সত্য ফিরে আসবে (কারণ স্ট্রিংটি সমানভাবে এই আচরণটি যুক্ত করে)।

আপনি যে জিনিসটি লিখতে চান,

CaseInsensitiveString cis = "Polish";

কাজ করতে পারে না কারণ আপনি ভাবছেন যে কোটেশনগুলি আপনার অবজেক্টের জন্য কিছু প্রকারের শর্ট সার্কিট নির্মাণকারী, যখন বাস্তবে এটি কেবল সরল পুরাতন java.lang.Strings এর জন্য কাজ করে।


অপরিবর্তনযোগ্যতা উল্লেখ করার জন্য +1, যা আমার কাছে জাভা লেখার আসল কারণ strA = strB, তার পরিবর্তে strA = new String(strB)। এটি স্ট্রিং ইন্টার্নিংয়ের সাথে খুব বেশি কিছু করার দরকার নেই।
কৃৎজিক্রতজি

এগুলি রেফারেন্স গণনা দ্বারা পরিচালিত হয় না। স্ট্রিং পুলিং জেএলএস দ্বারা প্রয়োজনীয়।
ব্যবহারকারী 207421

20
String s1="foo";

আক্ষরিক পুলে যাবে এবং এস 1 উল্লেখ করবে।

String s2="foo";

এবার এটি পরীক্ষা করবে "ফু" আক্ষরিক স্ট্রিংপুলের মধ্যে ইতিমধ্যে উপলব্ধ বা এটি এখন যেমন নেই তাই এস 2 একই আক্ষরিক উল্লেখ করবে।

String s3=new String("foo");

স্ট্রিংপুলে প্রথমে "foo" আক্ষরিক তৈরি হবে তারপরে স্ট্রিং আর্গের মাধ্যমে কনস্ট্রাক্টর স্ট্রিং অবজেক্ট তৈরি হবে অর্থাৎ নতুন অপারেটরের মাধ্যমে অবজেক্ট তৈরির কারণে স্তূপে "foo" তৈরি হবে তখন s3 এটি রেফার করবে।

String s4=new String("foo");

s3 হিসাবে একই

তাই System.out.println(s1==s2);// **true** due to literal comparison.

এবং System.out.println(s3==s4);// **false** due to object

তুলনা (এস 3 এবং এস 4 বিভিন্ন স্থানে তৈরি করা হয়েছে)


4
উদ্ধৃত নয় এমন পাঠ্যের জন্য উদ্ধৃতি বিন্যাস ব্যবহার করবেন না এবং কোডের জন্য কোড বিন্যাস ব্যবহার করবেন না।
ব্যবহারকারী 207421

12

Strings জাভাতে বিশেষ - এগুলি পরিবর্তনযোগ্য এবং স্ট্রিং ধ্রুবকগুলি স্বয়ংক্রিয়ভাবে Stringবস্তুতে পরিণত হয় ।

আপনার SomeStringClass cis = "value"উদাহরণের জন্য অন্য কোনও শ্রেণিতে প্রয়োগ করার উপায় নেই ।

বা আপনি প্রসারিত করতে পারবেন না String, কারণ এটি হিসাবে ঘোষিত হয়েছে final, অর্থ উপ-শ্রেণিবদ্ধার অনুমতি নেই।


7

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

স্ট্রিং অপরিবর্তনীয় (আপনি এগুলি কখনই পরিবর্তন করতে পারবেন না)

String x = "x";
x = "Y"; 
  • প্রথম লাইনটি একটি ভেরিয়েবল এক্স তৈরি করবে যাতে স্ট্রিংয়ের মান "x" থাকবে। JVM তার স্ট্রিং মানগুলির পুলে সন্ধান করবে এবং "x" উপস্থিত আছে কিনা তা দেখতে পাবে, এটি ভেরিয়েবল এক্সকে এটিতে নির্দেশ করবে, এটি উপস্থিত না থাকলে এটি তৈরি করবে এবং তারপরে অ্যাসাইনমেন্টটি করবে
  • দ্বিতীয় লাইনটি "x" এর রেফারেন্সটি সরিয়ে ফেলবে এবং স্ট্রিংয়ের মানগুলির পুলে "Y" উপস্থিত কিনা তা দেখুন। যদি এটি বিদ্যমান থাকে তবে এটি এটি বরাদ্দ করবে, যদি এটি না থাকে তবে এটি প্রথমে এ্যাসাইনমেন্ট তৈরি করবে। স্ট্রিংয়ের মানগুলি ব্যবহার করা হয় বা না থাকায় স্ট্রিং মানগুলির পুলে থাকা মেমরির স্থানটি পুনরায় দাবি করা হবে।

স্ট্রিং তুলনাগুলি আপনি তুলনা করছেন তার উপর নির্ভরযোগ্য

String a1 = new String("A");

String a2 = new String("A");
  • a1 সমান না a2
  • a1এবং a2অবজেক্ট রেফারেন্স
  • যখন স্ট্রিং স্পষ্টভাবে ঘোষণা করা হয়, নতুন দৃষ্টান্ত তৈরি করা হয় এবং তাদের উল্লেখগুলি একই হয় না।

আমি মনে করি আপনি কেস সেনসেটিভ ক্লাসটি ব্যবহার করার চেষ্টা করে ভুল পথে চলেছেন। স্ট্রিংগুলি একা ছেড়ে দিন। আপনি কীভাবে সত্যই যত্নশীল তা হ'ল আপনি কীভাবে মানগুলি প্রদর্শন করেন বা তুলনা করেন। স্ট্রিংটি ফর্ম্যাট করতে বা তুলনা করতে অন্য শ্রেণি ব্যবহার করুন।

অর্থাত্

TextUtility.compare(string 1, string 2) 
TextUtility.compareIgnoreCase(string 1, string 2)
TextUtility.camelHump(string 1)

আপনি যেহেতু ক্লাস তৈরি করছেন তাই আপনি তুলনাগুলি যা চান তা করতে পারেন - পাঠ্য মানগুলির তুলনা করুন।


সংকলকটি জেভিএম নয়, স্ট্রিং পুল তৈরি করে। চলকগুলিতে বস্তু থাকে না, তারা সেগুলি উল্লেখ করে। স্ট্রিং লিটারেলের জন্য স্ট্রিং পুলের স্থানটি কখনও পুনরুদ্ধার করা হয় না।
ব্যবহারকারী 207421

6

আপনি পারবেন না। জাভাতে ডাবল-কোটের জিনিসগুলি স্ট্রিংস হিসাবে সংকলক দ্বারা বিশেষভাবে স্বীকৃত এবং দুর্ভাগ্যক্রমে আপনি java.lang.Stringএটিকে ওভাররাইড করতে পারবেন না (বা প্রসারিত - এটি ঘোষিত final)।


ফাইনাল এখানে একটি লাল উত্তেজনা। এমনকি স্ট্রিং চূড়ান্ত না হলেও স্ট্রিং বাড়ানো তাকে এই ক্ষেত্রে সহায়তা করবে না।
ডারন 16

4
আমি মনে করি আপনার ভাগ্যক্রমে আপনি এটিকে ওভাররাইড করতে পারবেন না। :)
ক্রেগ পি। মোটলিন

@ মটলিন: হা! আপনি ভাল অধিকার হতে পারে. আমার মনে হয় আমি কোথাও পড়েছি যে জাভা এমন কোনও আকর্ষণীয় কিছু ইচ্ছাকৃতভাবে বাদ দিয়ে কাউকে বোকা কিছু করা বন্ধ করার জন্য ডিজাইন করা হয়েছিল ...
ড্যান ভিটন

6

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

String s = "Hello";

পুলটিতে কেবল একটি স্ট্রিং অবজেক্ট তৈরি করবে এবং রেফারেন্স গুলি এর উল্লেখ করবে তবে ব্যবহার করে

String s = new String("Hello");

আপনি দুটি স্ট্রিং অবজেক্ট তৈরি করেন: একটি পুলে এবং অন্যটি গাদাতে। রেফারেন্স হিপ মধ্যে বস্তু উল্লেখ করবে।


4

- উপরের স্টেটমেন্টটি ঠিক আছে (স্ট্রিং সহ এবং ডাব্লু / আউট প্রসারিত) ঠিক কীভাবে হয় আমি কেসআইসেন্সিটিভ স্ট্রিংকে স্ট্রিংয়ের মতো আচরণ করব? স্ট্রিং সম্পর্কে এটি কী এটি ঠিক এটির মতো আক্ষরিক পাস করতে সক্ষম হওয়া ঠিক করে দেয়? আমার বোঝা থেকে জাভাতে কোনও "কপি কন্সট্রাক্টর" ধারণা নেই?

প্রথম দিক থেকে যথেষ্ট বলা হয়েছে। "পোলিশ" একটি স্ট্রিং আক্ষরিক এবং কেসআইসেনসেটিভ স্ট্রিং ক্লাসে বরাদ্দ করা যায় না।

এখন দ্বিতীয় পয়েন্ট সম্পর্কে

যদিও আপনি নতুন আক্ষরিক তৈরি করতে পারবেন না, আপনি "অনুরূপ" পদ্ধতির জন্য সেই বইয়ের প্রথম আইটেমটি অনুসরণ করতে পারেন তাই নিম্নলিখিত বিবৃতিগুলি সত্য:

    // Lets test the insensitiveness
    CaseInsensitiveString cis5 = CaseInsensitiveString.valueOf("sOmEtHiNg");
    CaseInsensitiveString cis6 = CaseInsensitiveString.valueOf("SoMeThInG");

    assert cis5 == cis6;
    assert cis5.equals(cis6);

এখানে কোড।

C:\oreyes\samples\java\insensitive>type CaseInsensitiveString.java
import java.util.Map;
import java.util.HashMap;

public final class CaseInsensitiveString  {


    private static final Map<String,CaseInsensitiveString> innerPool 
                                = new HashMap<String,CaseInsensitiveString>();

    private final String s;


    // Effective Java Item 1: Consider providing static factory methods instead of constructors
    public static CaseInsensitiveString valueOf( String s ) {

        if ( s == null ) {
            return null;
        }
        String value = s.toLowerCase();

        if ( !CaseInsensitiveString.innerPool.containsKey( value ) ) {
             CaseInsensitiveString.innerPool.put( value , new CaseInsensitiveString( value ) );
         }

         return CaseInsensitiveString.innerPool.get( value );   
    }

    // Class constructor: This creates a new instance each time it is invoked.
    public CaseInsensitiveString(String s){
        if (s == null) {
            throw new NullPointerException();
         }         
         this.s = s.toLowerCase();
    }

    public boolean equals( Object other ) {
         if ( other instanceof CaseInsensitiveString ) {
              CaseInsensitiveString otherInstance = ( CaseInsensitiveString ) other;
             return this.s.equals( otherInstance.s );
         }

         return false;
    }


    public int hashCode(){
         return this.s.hashCode();
    }

// "দাবী" কীওয়ার্ড ব্যবহার করে শ্রেণি পরীক্ষা করুন

    public static void main( String [] args ) {

        // Creating two different objects as in new String("Polish") == new String("Polish") is false
        CaseInsensitiveString cis1 = new CaseInsensitiveString("Polish");
        CaseInsensitiveString cis2 = new CaseInsensitiveString("Polish");

        // references cis1 and cis2 points to differents objects.
        // so the following is true
        assert cis1 !=  cis2;      // Yes they're different
        assert cis1.equals(cis2);  // Yes they're equals thanks to the equals method

        // Now let's try the valueOf idiom
        CaseInsensitiveString cis3 = CaseInsensitiveString.valueOf("Polish");
        CaseInsensitiveString cis4 = CaseInsensitiveString.valueOf("Polish");

        // References cis3 and cis4 points to same  object.
        // so the following is true
        assert cis3 == cis4;      // Yes they point to the same object
        assert cis3.equals(cis4); // and still equals.

        // Lets test the insensitiveness
        CaseInsensitiveString cis5 = CaseInsensitiveString.valueOf("sOmEtHiNg");
        CaseInsensitiveString cis6 = CaseInsensitiveString.valueOf("SoMeThInG");

        assert cis5 == cis6;
        assert cis5.equals(cis6);

        // Futhermore
        CaseInsensitiveString cis7 = CaseInsensitiveString.valueOf("SomethinG");
        CaseInsensitiveString cis8 = CaseInsensitiveString.valueOf("someThing");

        assert cis8 == cis5 && cis7 == cis6;
        assert cis7.equals(cis5) && cis6.equals(cis8);
    }

}

C:\oreyes\samples\java\insensitive>javac CaseInsensitiveString.java


C:\oreyes\samples\java\insensitive>java -ea CaseInsensitiveString

C:\oreyes\samples\java\insensitive>

এটি হ'ল কেসআইসেনসেটিভ স্ট্রিং অবজেক্টের একটি অভ্যন্তরীণ পুল তৈরি করুন এবং সেখান থেকে সংশোধনকারী উদাহরণটি ফিরিয়ে দিন।

এইভাবে "==" অপারেটর একই মানের প্রতিনিধিত্বকারী দুটি বস্তুর রেফারেন্সের জন্য সত্য দেয় ।

অনুরূপ অবজেক্টগুলি খুব ঘন ঘন ব্যবহৃত হয় এবং তৈরি ব্যয় ব্যয়বহুল হলে এটি দরকারী।

স্ট্রিং ক্লাস ডকুমেন্টেশন সূচিত করে যে ক্লাসটি একটি অভ্যন্তরীণ পুল ব্যবহার করে

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

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

এটি স্ট্রিং ক্লাসের জন্য কাজ করে কারণ এটি নিবিড়ভাবে ব্যবহৃত হয় এবং পুলটি কেবল "ইন্টার্নড" অবজেক্ট দ্বারা গঠিত হয়।

এটি বুলিয়ান শ্রেণীর পক্ষেও ভাল কাজ করে, কারণ এখানে দুটি মাত্র সম্ভাব্য মান রয়েছে।

এবং পরিশেষে এ কারণটিও কারণ শ্রেণি পূর্ণসংখ্যার মান Of (int) -128 থেকে 127 ইনট মানগুলিতে সীমাবদ্ধ।


3

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

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

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


3

Stringআপনার ক্লাসে শব্দটি রয়েছে বলেই এর অর্থ এই নয় যে আপনি অন্তর্নির্মিত Stringশ্রেণির সমস্ত বিশেষ বৈশিষ্ট্য পেয়েছেন ।


3

CaseInsensitiveStringএটি একটি নয় Stringযদিও এটি একটি String। একটি Stringআক্ষরিক যেমন "উদাহরণ" কেবলমাত্র একটিতে নির্ধারিত হতে পারে String


2

কেসআইসেনসেটিভ স্ট্রিং এবং স্ট্রিং বিভিন্ন বস্তু। আপনি পারবেন না:

CaseInsensitiveString cis = "Polish";

কারণ "পোলিশ" একটি স্ট্রিং, কেসআইসেনসেটিভ স্ট্রিং নয়। স্ট্রিং যদি কেসআইসেনসেটিভ স্ট্রিংয়ের স্ট্রিং প্রসারিত করে তবে আপনি ঠিক থাকবেন, তবে অবশ্যই তা হয় না।

এবং এখানে নির্মাণ সম্পর্কে চিন্তা করবেন না, আপনি অতিরিক্ত জিনিস তৈরি করবেন না। আপনি যদি কনস্ট্রাক্টরের কোডটি দেখেন তবে এটি যা করছে তা হ'ল আপনি যে স্ট্রিংটি প্রবেশ করেছেন তার একটি রেফারেন্স সংরক্ষণ করছে extra অতিরিক্ত কিছু তৈরি হচ্ছে না।

স্ট্রিং s = নতুন স্ট্রিং ("foobar") ক্ষেত্রে এটি কিছু আলাদা করছে। আপনি প্রথমে আক্ষরিক স্ট্রিং "ফুবার" তৈরি করছেন, তারপরে একটি নতুন স্ট্রিং তৈরি করে এর একটি অনুলিপি তৈরি করছেন। সেই অনুলিপি তৈরি করার দরকার নেই।


এমনকি আপনি স্ট্রিং প্রসারিত করলেও এটি কাজ করবে না। আপনার কেসআইসেনসেটিভ স্ট্রিং প্রসারিত করার জন্য স্ট্রিং দরকার।
ডারন 16

উভয় ক্ষেত্রেই এটি অসম্ভব, কারণ স্ট্রিংটি অন্তর্নির্মিত হয়েছে বা কারণ এটি চূড়ান্ত ঘোষিত হয়েছে
লুके

2

যখন তারা লিখতে বলে

String s = "Silly";

পরিবর্তে

String s = new String("Silly");

স্ট্রিং অবজেক্ট তৈরি করার সময় তারা এটিকে বোঝায় কারণ উপরের দুটি বিবৃতি স্ট্রিং অবজেক্ট তৈরি করে তবে নতুন স্ট্রিং () সংস্করণ দুটি স্ট্রিং অবজেক্ট তৈরি করে: একটি হিপ এবং অন্যটি স্ট্রিং ধ্রুবক পুলে। সুতরাং আরও স্মৃতি ব্যবহার।

তবে আপনি যখন লিখবেন

CaseInsensitiveString cis = new CaseInsensitiveString("Polish");

আপনি স্ট্রিং তৈরি করছেন না এর পরিবর্তে আপনি কেসআইসেনসেটিভ স্ট্রিং ক্লাসের একটি বিষয় তৈরি করছেন। সুতরাং আপনাকে নতুন অপারেটর ব্যবহার করতে হবে to


1

যদি আমি এটি সঠিকভাবে বুঝতে পারি তবে আপনার প্রশ্নের অর্থ হ'ল আমরা কেন এটি সরাসরি কোনও মান নির্ধারণ করে কোনও অবজেক্ট তৈরি করতে পারছি না, এটি জাভাতে স্ট্রিং ক্লাসের একটি র‍্যাপারের মধ্যে সীমাবদ্ধ রাখি না।

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

এর যথাযথ অর্থ হল, যদি দোভাষী 3 টি দেখেন তবে এটি একটি পূর্ণসংখ্যায় রূপান্তরিত হবে কারণ পূর্ণসংখ্যা হ'ল আক্ষরিক জন্য সংজ্ঞায়িত টাইপ।

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

একইভাবে যদি অনুবাদক কিছু "" তে কিছু দেখে থাকেন তবে এটি তার ডিফল্ট টাইপ অর্থাৎ স্ট্রিংয়ের একটি বিষয় হিসাবে বিবেচিত হবে। এটি পটভূমিতে কাজ করা কিছু নেটিভ কোড।

এমআইটি ভিডিও বক্তৃতা কোর্স 00.০০ এর জন্য ধন্যবাদ যেখানে আমি এই উত্তরের ইঙ্গিত পেয়েছি।


0

জাভাতে সিনট্যাক্স "পাঠ্য" java.lang.String শ্রেণীর উদাহরণ তৈরি করে। নিয়োগ:

String foo = "text";

কোনও সাধারণ অ্যাসাইনমেন্ট, কোনও অনুলিপি নির্মাণকারীর প্রয়োজন নেই।

MyString bar = "text";

আপনি যা কিছু করেন তা অবৈধ কারণ মাই স্ট্রিং ক্লাসটি জাভা.এল.আর স্ট্রিং বা জাভা.লং.স্ট্রিংয়ের একটি সুপারক্লাস নয়।


0

প্রথমত, আপনি স্ট্রিং থেকে প্রসারিত কোনও শ্রেণি তৈরি করতে পারবেন না, কারণ স্ট্রিং একটি চূড়ান্ত শ্রেণি। এবং জাভা অন্যান্য ক্লাস থেকে স্ট্রিংসকে আলাদাভাবে পরিচালনা করে তাই কেবল স্ট্রিংয়ের মাধ্যমেই আপনি করতে পারেন

String s = "Polish";

তবে আপনার ক্লাসটি হ'ল আপনাকে কনস্ট্রাক্টরকে ডাকতে হবে। সুতরাং, যে কোড ঠিক আছে।


0

আমি কেবল যুক্ত করব যে জাভাতে কপির কনস্ট্রাক্টর রয়েছে ...

আচ্ছা, এটি একটি সাধারণ নির্মাতা যা একই ধরণের একটি যুক্তি হিসাবে যুক্তি হিসাবে।


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

0

জেডিকে-র বেশিরভাগ সংস্করণে দুটি সংস্করণ একই হবে:

স্ট্রিং s = নতুন স্ট্রিং ("নির্বোধ");

স্ট্রিং s = "আর নির্বোধ নেই";

স্ট্রিং অপরিবর্তনীয় কারণ সংকলক স্ট্রিং ধ্রুবকগুলির একটি তালিকা বজায় রাখে এবং আপনি যদি নতুন তৈরি করার চেষ্টা করেন তবে প্রথমে স্ট্রিংটি সংজ্ঞায়িত কিনা তা পরীক্ষা করে দেখুন। যদি তা হয় তবে বিদ্যমান অপরিবর্তনীয় স্ট্রিংয়ের একটি রেফারেন্স ফিরে আসে।

স্পষ্ট করে বলার জন্য - আপনি যখন "স্ট্রিং এস =" বলছেন তখন আপনি একটি নতুন ভেরিয়েবল সংজ্ঞায়িত করছেন যা স্ট্যাকের উপরে স্থান নেয় - তবে আপনি "আর আর নির্বোধ" বা নতুন স্ট্রিং ("মূর্খ") বলছেন না কেন ঠিক একই জিনিস ঘটে - একটি নতুন ধ্রুব স্ট্রিং আপনার অ্যাপ্লিকেশন এবং এটিতে রেফারেন্স পয়েন্ট মধ্যে সংকলিত হয়।

আমি এখানে পার্থক্য দেখতে চাই না। তবে আপনার নিজের শ্রেণীর জন্য, যা অপরিবর্তনীয় নয়, এই আচরণটি অপ্রাসঙ্গিক এবং আপনাকে অবশ্যই আপনার নির্মাণকারীকে কল করতে হবে।

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


0

স্ট্রিং এমন একটি বিশেষ শ্রেণীর মধ্যে যেখানে আপনি নতুন শ্রিং অংশটি ছাড়াই এগুলি তৈরি করতে পারেন

এটা যেমন একই

int x = y;

বা

চর গ;



0
 String str1 = "foo"; 
 String str2 = "foo"; 

স্ট্রিংপুল-এ স্ট্রিং অবজেক্ট, "ফু", বি'কোজা জাভা স্ট্রিংগুলি পরিচালনা করে, সুতরাং কোনও নতুন ভেরিয়েবল একই স্ট্রিংকে বোঝায়, এটি স্ট্রিংপুলের মধ্যে উপস্থিত একই অ্যালরেডি উপস্থিতিকে অন্য একটি তৈরি করে না। ।

 String str1 = new String("foo"); 
 String str2 = new String("foo");

এখানে str1 এবং str2 উভয়ই বিভিন্ন অবজেক্টের অন্তর্গত, নতুন স্ট্রিং () শক্তভাবে একটি নতুন স্ট্রিং অবজেক্ট তৈরি করুন।


-1

আপনার কোডটিতে আপনি যে স্ট্রিং ব্যবহার করেন তা জাভা একটি স্ট্রিং অবজেক্ট তৈরি করে। যে কোনও সময় ""ব্যবহৃত হয়, এটি কল করার মতোnew String()

স্ট্রিংগুলি জটিল ডেটা যা আদিম উপাত্তের মতো "কাজ" করে। স্ট্রিং লিটারেলগুলি আসলে বস্তু হয় যদিও আমরা 6, 6.0, 'c',ভেবে দেখি তারা আদিম আক্ষরিক , ইত্যাদি ইত্যাদি। সুতরাং স্ট্রিং "আক্ষরিক" "text"একটি নতুন স্ট্রিং অবজেক্টকে মান প্রদান করে char[] value = {'t','e','x','t}। অতএব, কল করা হচ্ছে

new String("text"); 

আসলে কল করার অনুরূপ

new String(new String(new char[]{'t','e','x','t'}));

আশা করি এখান থেকে আপনি দেখতে পাচ্ছেন যে আপনার পাঠ্যপুস্তকটি কেন এই অপ্রয়োজনীয় বিষয়টিকে বিবেচনা করে।

রেফারেন্সের জন্য, এখানে স্ট্রিং এর বাস্তবায়ন: http://www.docjar.com/html/api/java/lang/String.java.html

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

আর একটি ভাল রেফারেন্স হ'ল স্ট্রিংসের জাভা টিউটোরিয়াল: http://docs.oracle.com/javase/tutorial/java/data/strings.html


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