নাল এবং খালি ("") জাভা স্ট্রিংয়ের মধ্যে পার্থক্য


151

মধ্যে পার্থক্য কি nullএবং ""(খালি স্ট্রিং)?

আমি কিছু সাধারণ কোড লিখেছি:

String a = "";
String b = null;

System.out.println(a == b); // false
System.out.println(a.equals(b)); // false

উভয় বক্তব্য ফিরে আসে false। দেখে মনে হচ্ছে, তাদের মধ্যে প্রকৃত পার্থক্য কী তা আমি খুঁজে পাচ্ছি না।


6
এর সাথে তুলনা করুন b.equals(a)- তবে ==স্ট্রিংকে অন্যভাবে "এটি কাজ করবে না" হিসাবে তুলনার জন্য ব্যবহার করবেন না। nullমান (যা একটি খালি স্ট্রিং থেকে ভিন্ন "", একটি বৈধ স্ট্রিং উদাহরণস্বরূপ) করতে পারেন না একটি পদ্ধতি এটি উপর প্রার্থনা আছে। সাম্যতার বাম দিকে "জ্ঞাত নন-নাল" (সাধারণত একটি ধ্রুবক মান বা আক্ষরিক) স্থাপন করা হ'ল "যোদা শর্তসাপেক্ষ" বা এমন কিছু।

উত্তর:


220

"" হ'ল একটি আসল স্ট্রিং, যদিও একটি খালি হোক।

নাল, তবে স্ট্রিং ভেরিয়েবলের কিছুই বোঝায় না nothing

a==b মিথ্যা ফিরিয়ে দেয় কারণ "" এবং নাল মেমরিতে একই স্থান দখল করে না - অন্য কথায়, তাদের ভেরিয়েবলগুলি একই বস্তুগুলিতে নির্দেশ করে না।

a.equals(b) মিথ্যা ফিরিয়ে দেয় কারণ স্পষ্টতই "" নাল সমান হয় না।

পার্থক্যটি হ'ল যেহেতু "" একটি প্রকৃত স্ট্রিং, আপনি এখনও এর মতো পদ্ধতি বা ফাংশন শুরু করতে পারেন

a.length()

a.substring(0, 1)

ইত্যাদি।

স্ট্রিং নলের সমান হলে, খ এর মতো জাভা একটি নিক্ষেপ করবে NullPointerExceptionযদি আপনি চেষ্টা করার চেষ্টা করেন, বলুন:

b.length()


আপনি যে পার্থক্যটি নিয়ে ভাবছেন তা যদি == বনাম সমান হয় তবে তা হ'ল:

== রেফারেন্সের সাথে তুলনা করে, যেমন আমি গিয়েছিলাম

String a = new String("");
String b = new String("");
System.out.println(a==b);

এটি আউটপুট মিথ্যা হবে কারণ আমি দুটি পৃথক অবজেক্ট বরাদ্দ করেছি, এবং a এবং b পয়েন্টটি বিভিন্ন অবজেক্টগুলিতে।

তবে, a.equals(b)এই ক্ষেত্রে সত্যটি ফিরে আসবে, কারণ equalsস্ট্রিংসের পক্ষে সত্যটি ফিরে আসবে যদি কেবল তখনই যদি যুক্তি স্ট্রিংটি নাল না থাকে এবং একই অক্ষরের অক্ষরকে উপস্থাপন করে।

সতর্কতা অবলম্বন করুন, যদিও জাভা স্ট্রিংসের জন্য একটি বিশেষ কেস রাখে।

String a = "abc";
String b = "abc";
System.out.println(a==b);

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


এটি কি সি # তেও প্রযোজ্য? "" এর অ্যারে যেমন {'\ 0'}, একটি নাল
কোল জনসন

3
সম্পর্কিত লিঙ্কটির internমেয়াদ শেষ হয়ে গেছে। আপনি এটি সম্পর্কে পড়ার জন্য অন্য কোনও সাইটের রেফারেন্স করতে পারেন: ওয়েবলগস.জাভা.এন.এল.ব্লগ
অ্যালস্টন

সুতরাং, আমার যদি নাল স্ট্রিং থাকে String a = nullএবং তারপরে আমি এটিকে একটি স্ট্রিংয়ের মতো যুক্ত করি a+= "example", যখন আমি এটি প্রিন্ট করি, nullexampleনাল স্ট্রিং না হলে কেন প্রদর্শন করে ?
সিপিনামটজ

@ পিনাগামার জাভাস্ক্রিপ্ট স্ট্রিংগুলিতে নন-স্ট্রিং যুক্ত করার অনুমতি দেয়। "num: " + 20আপনি স্ট্রিং দেয় "num: 20"। এর অর্থ কি 20এটি একটি স্ট্রিং? (এটি নয়, 20একটি সংখ্যা)। একই ক্ষেত্রে null: এটি স্ট্রিং নয়, আপনি যদি যুক্ত করার চেষ্টা করেন তবে এটি একটিতে রূপান্তরিত হতে পারে।
ডাবরোস

@ জাচ এল: যখন স্ট্রিং এস = নাল + "এ"; এটি আউটপুট নুলা দেয় তবে নাল কোডক্যাট ("এ") এটি নাল পয়েন্টারটিকে ব্যতিক্রম দেয়। আমার প্রথম ক্ষেত্রে নাল + "ক" এর কারণ কী; কাজ করছে.
বেদ প্রকাশ

249

আপনি নাল এবং একটি খালি স্ট্রিংয়ের মধ্যে পার্থক্যটি এইভাবে বুঝতে পারেন:

নাল এবং 0 / খালি স্ট্রিংয়ের মধ্যে পার্থক্য

আর.সাতো ( @ রাইসাতো ) এর মূল চিত্র


7
এটা অসাধারণ! আমি কারও কাছে নাল বনাম খালি ব্যাখ্যা করছিলাম এবং তোমার উত্তরের পরে ঘটল। ধারণাটি অবিলম্বে তাদের জন্য ক্লিক করে।
matt.fc

14

স্ট্রিং একটি অবজেক্ট এবং নাল হতে পারে

নাল মানে স্ট্রিং অবজেক্টটি ইনস্ট্যান্ট করা হয়নি

"" হ'ল "আআ" এর মতো ইনস্ট্যান্টেটেড অবজেক্ট স্ট্রিংয়ের আসল মান

এখানে এমন একটি লিঙ্ক রয়েছে যা এই দফায় স্পষ্ট করে দিতে পারে http://download.oracle.com/javase/tutorial/java/concepts/object.html


"নাল মানে স্ট্রিং অবজেক্টটি ইনস্ট্যান্ট করা হয়নি" - আপনাকে ধন্যবাদ! এটি আমাকে জিনিসগুলি অনেক কিছু বুঝতে সাহায্য করে। আমি মিডিয়াপ্লেয়ার অবজেক্টে একবার if স্টেটমেন্টটি ব্যবহার করতে সক্ষম হয়েছি এবং এটি নাল ব্যবহার করতে, এটি চলছে কিনা তা পরীক্ষা করার জন্য (এটি যদি কার্যকর হয় তবে একটি পদ্ধতি প্রয়োগ করে) কাজ করে, তবে আমি বুঝতে পারি না কেন এটি কাজ করে তবে এখনই আমি এটি যা বলছিলাম তা দেখতে পাচ্ছি, আমি মিডিয়াপ্লেয়ারটি নাল ... উদাহরণস্বরূপ ব্যবহার করে ইনস্ট্যান্ট করা হয়েছিল কিনা তা পরীক্ষা করে দেখছিলাম if (mp==null){do something}
Azurespot

12

আপনার বিবৃতি আপনাকে যা বলছে তা ঠিক "" "নালার মতো নয় - যা সত্য। "" একটি খালি স্ট্রিং; নাল মানে কোনও মান নির্ধারিত হয়নি।

এটি চেষ্টা করা আরও আলোকিত হতে পারে:

System.out.println(a.length()); // 0
System.out.println(b.length()); // error; b is not an object

"" এখনও একটি স্ট্রিং, যার অর্থ আপনি এর পদ্ধতিগুলিতে কল করতে পারেন এবং অর্থবহ তথ্য পেতে পারেন। নাল একটি খালি পরিবর্তনশীল - এখানে আক্ষরিক কিছুই নেই।


9

দুজনের মধ্যে বেশ তাৎপর্যপূর্ণ পার্থক্য রয়েছে। খালি স্ট্রিংটি """স্ট্রিংটির কোনও অক্ষর নেই has" এটি একটি আসল স্ট্রিং যার দৈর্ঘ্য ভাল সংজ্ঞাযুক্ত। স্ট্যান্ডার্ড স্ট্রিংয়ের সমস্ত ক্রিয়াকলাপ খালি স্ট্রিংয়ের উপর সুস্পষ্টভাবে সংজ্ঞায়িত - আপনি এটিকে নিম্ন কেসে রূপান্তর করতে পারেন, এর মধ্যে কিছু চরিত্রের সূচকটি দেখতে পারেন The ইত্যাদি নাল স্ট্রিংটি null"কোনও স্ট্রিং নয়" " এটির দৈর্ঘ্য নেই কারণ এটি মোটেও স্ট্রিং নয়। নাল স্ট্রিংয়ে কোনও স্ট্যান্ডার্ড স্ট্রিং অপারেশন প্রয়োগ করার চেষ্টা করা NullPointerExceptionরানটাইমের সময় ঘটবে ।


9

এখানে a is an Objectকিন্তু b(null)হয় না একটি বস্তু এটি একটি নাল রেফারেন্স

System.out.println(a instanceof Object); // true

System.out.println(b instanceof Object); // false

এখানে আমার অনুরূপ উত্তর


1
উভয় aএবং bরেফারেন্স হয়। aতাত্ক্ষণিক বস্তুর সাথে একটি রেফারেন্স। bতাত্ক্ষণিক বস্তু ছাড়াই একটি রেফারেন্স (সুতরাং "নাল রেফারেন্স" শব্দটি)।
আমার সঠিক মতামত

আমি -১ ;-) এর পাল্টা অভিনয় করেছি তবে এটি এই উত্তরটি পরিষ্কার করতে এবং "একটি বস্তু" এবং nullমান এবং অবজেক্ট এবং ভেরিয়েবলের মধ্যে পার্থক্য নিয়ে আলোচনা করতে সহায়তা করবে ।

@pst ধন্যবাদ :) আমি এটা হৃদয় উত্তর কারণ এখানে আমার অন্য উত্তর হল যে এই প্রশ্নের অনুরূপ stackoverflow.com/questions/4459623/...

8

নাল অর্থ নামটি কোনও তাত্ক্ষণিক বস্তুর উল্লেখ করছে না। "" এর অর্থ একটি খালি স্ট্রিং।

এখানে একটি কিছু অবজেক্টের উল্লেখ করছে যা খালি স্ট্রিং হিসাবে ঘটে। কোনও পদকে শূন্য করার কারণে তা উল্লেখ করছে না।


5

জাভা একটি রেফারেন্স নির্ধারিত টাইপ nullহয়েছে সব সময়ে কোন মান । নির্ধারিত একটি স্ট্রিংয়ের ""একটি মান থাকে: একটি খালি স্ট্রিং, এতে কোনও অক্ষর না রেখে একটি স্ট্রিং বলতে হয়। যখন কোনও ভেরিয়েবল বরাদ্দ করা হয় nullতার অর্থ এটি কোনও ধরণের, স্ট্রিং বা অন্যথায় কোনও অন্তর্নিহিত অবজেক্ট নেই।


4

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

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

public class StringCheck {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    String s1 = "siddhartha";
    String s2 = "";
    String s3 = null;

    System.out.println("length s1 ="+s1.length());
    System.out.println("length s2 ="+s2.length());

    //this piece of code will still throw nullpointerexception . 
    if(s3 != ""){
        System.out.println("length s3 ="+s3.length());
    }
}

}


4
String s = "";
s.length();

String s = null;
s.length();

খালি স্ট্রিংয়ের একটি রেফারেন্স ""হিপগুলির মধ্যে থাকা কোনও বস্তুর দিকে নির্দেশ করে - যাতে আপনি এটিতে পদ্ধতিগুলি কল করতে পারেন।

তবে নির্দেশিত একটি রেফারেন্সের গাদাতে নির্দেশ করার nullকোনও আপত্তি নেই এবং সুতরাং আপনি একটি পাবেন NullPointerException


1

খালি স্ট্রিংটি একটি নাল রেফারেন্সের থেকে পৃথক যে কোনও অবজেক্ট-ভিত্তিক প্রোগ্রামিং ভাষায় একটি স্ট্রিং টাইপের নাল রেফারেন্স কোনও স্ট্রিং অবজেক্টকে নির্দেশ করে না এবং এর ফলে কোনও ক্রিয়াকলাপ চালানোর চেষ্টা করার জন্য একটি ত্রুটি ঘটবে। খালি স্ট্রিংটি এখনও একটি স্ট্রিং যার উপর স্ট্রিং ক্রিয়াকলাপ চেষ্টা করা যেতে পারে।

খালি স্ট্রিংয়ের উইকিপিডিয়া নিবন্ধ থেকে ।


1

String s=null;

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

String t="null";

এটি মানের স্ট্রিং "নাল" টি = "xyz" এর মতো একটি স্ট্রিং আক্ষরিক। এটি নাল পয়েন্টার নিক্ষেপ করবে না।

String u="";

এটি খালি স্ট্রিং হিসাবে এটি নাল পয়েন্টার নিক্ষেপ করবে না।


0

একটি স্ট্রিং খালি থাকতে পারে বা nullমান থাকতে পারে । যদি একটি স্ট্রিং হয় তবে nullএটি মেমরির কোনও কিছুর উল্লেখ করছে না। ব্যবহার করে দেখুন s.length()>0। এটি কারণ যদি কোনও স্ট্রিং ফাঁকা থাকে তবে এটি 0 এর দৈর্ঘ্যটি ফেরত দেয় So সুতরাং আপনি যদি এটির জন্য কিছুই প্রবেশ না করেন তবে এটি এখনও লুপিং চালিয়ে যাবে যেহেতু এটি স্ট্রিংটিকে নিবন্ধিত করে না null। আপনি যদি দৈর্ঘ্যের জন্য পরীক্ষা করেন তবে এটি এর লুপ থেকে বেরিয়ে আসবে।


0

এই ধারণাটি গণিত থেকে আরও ভালভাবে বোঝা যায়। আপনি কি কখনও কোনও গণক যেমন 7/0 ব্যবহার করে 0 দিয়ে কোনও সংখ্যা (শূন্য নয়) ভাগ করার চেষ্টা করেছেন? : আপনি যে কিছু ভালো দেখায় ফলে পাবেন undefined, not a number, nullইত্যাদি অর্থ এই যে অপারেশন কিছু কারণের জন্য, অসম্ভব (আসুন যে কারণে অন্য দিন আলোচনা করা ছেড়ে চলে যান)।

এখন, এটি সম্পাদন করুন: 0/7। আপনি আউটপুট পাবেন, ০। এর অর্থ এই যে অপারেশনটি সম্ভব এবং কার্যকর করা যেতে পারে তবে আপনি উত্তরটি কেবল 0 কারণ বিভাগের পরে আর কিছুই অবশিষ্ট নেই। একটি বৈধ আউটপুট আছে এবং সেই আউটপুটটি শূন্য।

প্রথম উদাহরণে, শুধুমাত্র আউটপুটটি অবৈধ ছিল না, ক্রিয়াকলাপ চালানো সম্ভব ছিল না। এটি nullজাভা স্ট্রিংয়ের অনুরূপ । দ্বিতীয় উদাহরণটি emptyস্ট্রিংয়ের অনুরূপ ।


0

আপনি যখন লিখুন

String a = "";

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

যখন আপনি লিখুন

String b = null;

এর অর্থ হ'ল bটাইপ স্ট্রিংয়ের একটি পরিবর্তনশীল যা অজানা রেফারেন্সকে নির্দেশ করে । এবং অজানা রেফারেন্সে যে কোনও ক্রিয়াকলাপের ফলাফল হবে NullPointerException

এখন, নীচের অভিব্যক্তিগুলি মূল্যায়ন করি।

System.out.println(a == b); // false. because a and b both points to different object reference

System.out.println(a.equals(b)); // false, because the values at object reference pointed by a and b do not match.

System.out.println(b.equals(a)); // NullPointerException, because b is pointing to unknown reference and no operation is allowed

0

সহজ শব্দে,

  • "" একটি খালি স্ট্রিং

  • নাল একটি খালি স্ট্রিং ভেরিয়েবল


0

নাল এবং খালি স্ট্রিংয়ের মধ্যে পার্থক্য। উদাহরণস্বরূপ: আপনার এক্স নামক একটি ভেরিয়েবল রয়েছে। আপনি যদি জেএসে লিখেন,

var x = "";

এর অর্থ হল যে আপনি একটি মান নির্ধারণ করেছেন যা খালি স্ট্রিং (দৈর্ঘ্য 0)। আসলে এটি এমন কিছুর মতো তবে যা কিছুই অনুভব করে না :) অন্যদিকে,

var y = null;

এর অর্থ হ'ল আপনি y এর জন্য এমন কোনও মান নির্ধারণ করেন নি যা স্পষ্টভাবে ঘোষণার সময় y এ নাল লিখে স্পষ্টভাবে বলেছিল। আপনি যদি y.length লিখেন; এটি একটি ত্রুটি ছুঁড়ে দেবে যা ইঙ্গিত করে যে y এর জন্য নির্ধারিত কোনও মান নেই এবং ফলস্বরূপ y এর দৈর্ঘ্য পড়তে পারে না।


প্রশ্ন জাভা
Vega


0

"আমি এটিকে আমার বিলিয়ন ডলারের ভুল বলছি 19 এটি ছিল 1965 সালের নাল রেফারেন্সের আবিষ্কার" - https://en.wikedia.org/wiki/ টনি_হোয়ার

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

অবজেক্টস.একওয়ালস () .equals () কল করার আগে নাল পরীক্ষা করে।


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