C # और Java के बीच प्रमुख अंतर क्या हैं?


209

मैं सिर्फ एक बात स्पष्ट करना चाहता हूं। यह एक सवाल नहीं है जिस पर कोई बेहतर है, वह हिस्सा मैं किसी और पर चर्चा करने के लिए छोड़ देता हूं। मुझे इसकी परवाह नहीं है। मुझे यह सवाल मेरी नौकरी के साक्षात्कार पर पूछा गया है और मुझे लगा कि यह थोड़ा और जानने के लिए उपयोगी हो सकता है।

ये वे हैं जिनके साथ मैं आ सकता था:

  • जावा "प्लेटफ़ॉर्म स्वतंत्र" है। आजकल आप कह सकते हैं कि मोनो परियोजना है इसलिए C # पर भी विचार किया जा सकता है लेकिन मेरा मानना ​​है कि यह थोड़ा अतिशयोक्तिपूर्ण है। क्यों? खैर, जब जावा की एक नई रिलीज़ होती है तो यह एक साथ उपलब्ध सभी प्लेटफार्मों पर उपलब्ध होती है, दूसरी ओर मोनो कार्यान्वयन में C # 3.0 की कितनी विशेषताएं अभी भी गायब हैं? या क्या यह वास्तव में सीएलआर बनाम जेआरई है जिसकी हमें यहां तुलना करनी चाहिए?
  • जावा घटनाओं और प्रतिनिधियों का समर्थन नहीं करता है। जहाँ तक मुझे पता है।
  • जावा में सभी विधियाँ आभासी हैं
  • विकास उपकरण: मेरा मानना ​​है कि विज़ुअल स्टूडियो के रूप में अभी तक ऐसा कोई उपकरण नहीं है। खासकर अगर आपने टीम संस्करणों के साथ काम किया है तो आपको पता चल जाएगा कि मेरा क्या मतलब है।

कृपया उन लोगों को जोड़ें जिन्हें आप प्रासंगिक मानते हैं।

अद्यतन: बस मेरे दिमाग में पॉप अप हुआ, जावा में कक्षाओं, विधियों आदि पर कस्टम विशेषताओं जैसी कुछ नहीं है या यह करता है?


1
भाषाएं भाषा कार्यान्वयन से भिन्न होती हैं, जो पुस्तकालयों से भी भिन्न होती हैं। क्या तुलना करने की कोशिश कर रहे हैं?
मिगेल पिंग


2
मुझे यह एक msdn.microsoft.com/en-us/library/ms836794.aspx मिला, इसमें C # और जावा के बीच समानता और अंतर दोनों शामिल हैं।
बिपुल

1
आप सही पुस्तकालयों के साथ जावा के बारे में नीचे बताई गई कई चीजें प्राप्त कर सकते हैं। उदाहरण के लिए इस वैध जावा कोड की जाँच करें: नया स्ट्रिंग [] {"जेम्स", "जॉन", "जॉन", "एडी"}। जगह (प्रारंभ ("जे")। विशिष्ट (); यह एक पुस्तकालय का उपयोग करता है जिसे लुम्बोक-पीजी कहा जाता है।
Github.com/nicholas22/jpropel

जवाबों:


329

जावा 7 और C # 3 की तुलना करना

(जावा 7 की कुछ विशेषताओं का यहाँ उल्लेख नहीं किया गया है, लेकिन usingजावा 1-6 से अधिक # के सभी संस्करणों का विवरण लाभ हटा दिया गया है।)

आपके सभी सारांश सही नहीं हैं:

  • जावा विधियों में डिफ़ॉल्ट रूप से आभासी हैं, लेकिन आप उन्हें अंतिम रूप दे सकते हैं। (C # में वे डिफ़ॉल्ट रूप से सील हैं, लेकिन आप उन्हें आभासी बना सकते हैं।)
  • जावा के लिए बहुत सारे आईडीई हैं, दोनों मुफ्त (जैसे ग्रहण, नेटबीन्स) और वाणिज्यिक (जैसे इंटेलीज आईडीआईए)

इससे परे (और आपके सारांश में पहले से क्या है):

  • दोनों के बीच पीढ़ी पूरी तरह से अलग है; जावा जेनरिक बस एक संकलन-समय "ट्रिक" है (लेकिन उस पर एक उपयोगी है)। C # और .NET जेनेक्स में निष्पादन के समय भी बनाए रखा जाता है, और उचित दक्षता रखते हुए मूल्य प्रकारों के साथ-साथ संदर्भ प्रकारों के लिए भी काम करते हैं, (जैसे कि बॉक्सिंग बाइट्स की एक सरणी के बजाय List<byte>एक byte[]बैकिंग के रूप में ।)
  • C # ने अपवादों की जाँच नहीं की है
  • जावा उपयोगकर्ता-परिभाषित मूल्य प्रकारों के निर्माण की अनुमति नहीं देता है
  • जावा में ऑपरेटर और रूपांतरण ओवरलोडिंग नहीं है
  • जावा में पुनरावृत्तियों के सरल पुनरावृत्ति के लिए पुनरावृत्त ब्लॉक नहीं हैं
  • Java में LINQ जैसा कुछ भी नहीं है
  • आंशिक रूप से प्रतिनिधियों के नहीं होने के कारण, जावा में अनाम विधियों और लंबोदर अभिव्यक्तियों की तरह कुछ भी नहीं है। अनाम आंतरिक वर्ग आमतौर पर इन भूमिकाओं को भरते हैं, लेकिन क्लंकली।
  • जावा में अभिव्यक्ति के पेड़ नहीं हैं
  • अनाम # में आंतरिक वर्ग नहीं है
  • C # में जावा की आंतरिक कक्षाएं बिल्कुल नहीं हैं, वास्तव में - C # में सभी नेस्टेड कक्षाएं जावा के स्थिर नेस्टेड कक्षाओं की तरह हैं
  • जावा में स्थिर कक्षाएं नहीं हैं (जिनके पास कोई इंस्टेंस कंस्ट्रक्टर नहीं है , और इसका उपयोग चर, पैरामीटर आदि के लिए नहीं किया जा सकता है)
  • जावा के पास C # 3.0 अनाम प्रकारों के बराबर नहीं है
  • जावा में अंतर्निहित स्थानीय चर टाइप नहीं है
  • जावा में विस्तार विधियाँ नहीं हैं
  • जावा में ऑब्जेक्ट और संग्रह आरम्भिक अभिव्यक्ति नहीं है
  • पहुँच संशोधक कुछ अलग हैं - जावा में (वर्तमान में) विधानसभा का कोई प्रत्यक्ष समकक्ष नहीं है, इसलिए "आंतरिक" दृश्यता का कोई विचार नहीं है; C # में जावा में "डिफ़ॉल्ट" दृश्यता के बराबर नहीं है जो नाम स्थान (और विरासत) का हिसाब लेता है
  • जावा और C # में इनिशियलाइज़ेशन का क्रम बिलकुल अलग है (C # बेस टाइप के कंस्ट्रक्टर को जंजीर कॉल से पहले वेरिएबल इनिशियलाइज़र निष्पादित करता है)
  • जावा में भाषा के भाग के रूप में गुण नहीं हैं; वे / सेट / तरीकों का एक सम्मेलन हैं
  • जावा में "असुरक्षित" कोड के बराबर नहीं है
  • Interop जावा के JNI की तुलना में C # (और सामान्य रूप से .NET) में आसान है
  • जावा और सी # में कुछ अलग विचार हैं। जावा बहुत अधिक वस्तु-उन्मुख हैं।
  • जावा में कोई प्रीप्रोसेसर निर्देश नहीं है (#define, #if आदि C # में)।
  • Java के पास C # के समतुल्य नहीं है refऔर outसंदर्भ द्वारा पैरामीटर पारित करने के लिए
  • जावा में आंशिक प्रकार का कोई समकक्ष नहीं है
  • सी # इंटरफेस फ़ील्ड घोषित नहीं कर सकते
  • जावा में कोई अहस्ताक्षरित पूर्णांक प्रकार नहीं है
  • जावा में दशमलव प्रकार के लिए कोई भाषा समर्थन नहीं है । (java.math.BigDecimal System.Decimal जैसे कुछ प्रदान करता है - अंतर के साथ - लेकिन कोई भाषा समर्थन नहीं है)
  • जावा में अशक्त मान प्रकार नहीं है
  • जावा में बॉक्सिंग पूर्वनिर्धारित (लेकिन "सामान्य") संदर्भ प्रकार का उपयोग करता है, उन पर विशेष संचालन के साथ। C # और .NET में बॉक्सिंग एक अधिक पारदर्शी मामला है, जिसमें संदर्भ मूल्य किसी भी प्रकार के CLR द्वारा बॉक्सिंग के लिए बनाया जाता है।

यह संपूर्ण नहीं है, लेकिन इसमें वह सब कुछ शामिल है जो मैं ऑफ-हैंड सोच सकता हूं।


24
@ ब्रायन: मुझे लगता है कि जावा जेनरिक और आंतरिक कक्षाओं का विवरण बहुत जल्दी जावा के विचार को सरलता के माध्यम से श्रेष्ठता प्राप्त करने के बारे में बताता है;)
जॉन स्कीट

8
@ ऑरेंजडॉग: जो लोग बहस कर रहे हैं वे ज्यादातर खुद को आइएमओ कह रहे हैं। यह देखने में मुश्किल है कि एक स्पष्ट प्रयास लिखने के लिए कैसे मजबूर किया जा रहा है / आखिरकार एक उपयोग कथन, आईएमओ की तुलना में कम त्रुटि वाला है। जावा के साथ तुलना में C # के "अतिरिक्त" सुविधाओं में से अधिकांश का मतलब है कि आप कम कोड लिखने के साथ दूर हो सकते हैं, और उस कोड को पढ़ने योग्य बनाया जा सकता है।
जॉन स्कीट

17
@ ऑरेंजडॉग: आप कितने निष्पक्ष हैं, रुचि से बाहर हैं? हां, मैं एक C # उत्साही हूं, लेकिन बहुत महत्वपूर्ण जावा अनुभव के साथ भी - यह मेरा दिन का काम है, आखिरकार। यह ऐसा नहीं है कि मैं अज्ञानी हूं कि जावा का प्रभावी ढंग से उपयोग कैसे किया जाए।
जॉन स्कीट

8
@ ऑरेंजडॉग: एक शुरुआत के लिए, अधिकांश डेवलपर्स "असुरक्षित" का उपयोग करते हुए कोड नहीं लिखते हैं, जहां तक ​​मैं जागरूक हूं, इसलिए यह एक लाल हेरिंग है। मुझे यह भी लगता है कि उकसावे की भावना एक लाल हेरिंग है - मुझे नहीं लगता कि औपचारिक उकसावे के साथ यह करना बहुत आसान है कि किसी मानव के लिए कोड के बारे में तर्क करना कितना आसान है । मेरा कहना यह है कि किसी ऐसे व्यक्ति के रूप में जो जावा और सी # दोनों में काफी अनुभवी है, मुझे लगता है कि सी # उत्पादकता और पठनीयता के मामले में बहुत बेहतर भाषा है। यदि आप इसके विपरीत महसूस करते हैं, तो क्या आप दोनों भाषाओं में अपने अनुभव के स्तर को स्पष्ट कर सकते हैं? मुझे लगता है कि यह चर्चा के लिए काफी प्रासंगिक है।
जॉन स्कीट

21
@ ऑरेंजडॉग: इसके अलावा, आपका दावा है कि "अधिक चीजें करने में सक्षम होने की संभावना बढ़ जाती है कि आप उन्हें गलत कर देंगे" भी एक गिरावट आईएमओ है ... क्योंकि यह मानता है कि यदि आप किसी फीचर का उपयोग करके कुछ नहीं कर सकते हैं भाषा जो इसे आसान बनाती है, आपको इसे बिल्कुल नहीं करना होगा। यह बस असत्य है - अक्सर जावा और सी # में आपको जिन कार्यों को पूरा करने की आवश्यकता होती है, वे समान होते हैं, लेकिन अनुपलब्ध विशेषताओं के कारण, जावा उन कार्यों को सही ढंग से पूरा करना कठिन बनाता है। कार्य को सरल बनाने से, इस सुविधा की संभावना कम हो जाती है कि आप इसे गलत करेंगे।
जॉन स्कीट

24

C # और Java के बीच के अंतर पर Dare Obasanjo द्वारा गहराई से संदर्भ में एक महान है। मैं हमेशा अपने आप को इस लेख का संदर्भ देता हूं जब दोनों के बीच स्विच करता हूं।

http://www.25hoursaday.com/CsharpVsJava.html


2
@Jon Skeet: आप सबसे अधिक C # सक्रिय डेवलपर हैं। आप अपने सी # और जावा अंतर के संस्करण को क्यों नहीं बनाए रखते हैं। मुझे यकीन है कि लोग इसे पढ़ना पसंद करेंगे।
पंजे

1
@claws: मुझे वह सब कुछ करने का समय नहीं मिला है जो मैं करना चाहता हूं।
जॉन स्कीट

19
@ आइंस्टीन: हमें "चक नॉरिस और जॉन स्कीट के बीच अंतर" सूची की आवश्यकता है: 1) चक नॉरिस के पास हमेशा समय होता है; जॉन TimeDateको हमेशा समय बिताने के लिए कक्षा को संशोधित करना चाहिए , और अभी तक समय नहीं दिया है :(
RedFilter

11

C # में स्वचालित गुण होते हैं जो अविश्वसनीय रूप से सुविधाजनक होते हैं और वे आपके कोड क्लीनर को रखने में भी मदद करते हैं, कम से कम जब आपके पास अपने गेटर्स और सेटर में कस्टम तर्क नहीं होते हैं।


10

जावा में सी # अनुपस्थित की विशेषताएं • सी # में अधिक आदिम प्रकार और अंकगणितीय अपवादों को पकड़ने के लिए कार्यक्षमता शामिल है।

• जावा पर बड़ी संख्या में उल्लेखनीय उपयुक्तताएं शामिल हैं, जिनमें से कई, जैसे कि ऑपरेटर ओवरलोडिंग और उपयोगकर्ता-परिभाषित जाति, पहले से ही C ++ प्रोग्रामर के बड़े समुदाय से परिचित हैं।

• इवेंट हैंडलिंग "प्रथम श्रेणी का नागरिक" है - यह भाषा का ही हिस्सा है।

• "संरचना" की परिभाषा की अनुमति देता है, जो कक्षाओं के समान हैं, लेकिन स्टैक पर आवंटित किया जा सकता है (सी # और जावा में कक्षाओं के उदाहरणों के विपरीत)।

• C # भाषा सिंटैक्स के भाग के रूप में गुणों को लागू करता है।

• C # स्ट्रिंग्स पर संचालित करने के लिए स्विच स्टेटमेंट की अनुमति देता है।

• C # अनाम कार्यप्रणाली को क्लोजर कार्यक्षमता प्रदान करने की अनुमति देता है।

• सी # एक कार्यात्मक शैली उपज कीवर्ड के माध्यम से सह-दिनचर्या को रोजगार करने वाले इट्रेटर को अनुमति देता है।

• C # में आउटपुट मापदंडों के लिए समर्थन है, कई मूल्यों की वापसी में सहायता, C ++ और SQL द्वारा साझा की गई सुविधा।

• C # में नाम स्थान बदलने की क्षमता है।

• C # में "स्पष्ट सदस्य कार्यान्वयन" है जो एक वर्ग को विशेष रूप से एक इंटरफ़ेस के तरीकों को लागू करने की अनुमति देता है, अपने स्वयं के वर्ग विधियों से अलग। यह दो अलग-अलग इंटरफेस को लागू करने की अनुमति देता है, जो एक ही नाम की एक विधि है। एक इंटरफ़ेस के तरीकों को सार्वजनिक होने की आवश्यकता नहीं है; वे केवल उस इंटरफेस के माध्यम से सुलभ हो सकते हैं।

• C # COM के साथ एकीकरण प्रदान करता है।

• C और C ++ के उदाहरण के बाद, C # आदिम और संदर्भ प्रकारों के लिए संदर्भ द्वारा कॉल की अनुमति देता है।

C # में जावा अनुपस्थित की विशेषताएं

• जावा के सख्त कीवर्ड की गारंटी है कि फ्लोटिंग पॉइंट ऑपरेशंस का परिणाम प्लेटफॉर्म पर समान रहता है।

• जावा त्रुटि जाल और हैंडलिंग के बेहतर प्रवर्तन के लिए जाँच किए गए अपवादों का समर्थन करता है।


9

एक और अच्छा संसाधन है http://www.javacamp.org/javavscsharp/ यह साइट कई ऐसे उदाहरण प्रस्तुत करती है जो इन दो प्रोग्रामिंग भाषाओं के बीच के लगभग सभी अंतरों को मिटा देते हैं।

विशेषताओं के बारे में, जावा में एनोटेशन हैं, जो लगभग उसी तरह से काम करते हैं।


5

जेनेरिक्स:

जावा जेनरिक के साथ, आपको वास्तव में कोई भी निष्पादन दक्षता नहीं मिलती है जो आपको .NET के साथ मिलती है क्योंकि जब आप जावा में जेनेरिक क्लास संकलित करते हैं, तो कंपाइलर टाइप पैरामीटर को हटा देता है और हर जगह ऑब्जेक्ट को प्रतिस्थापित करता है। उदाहरण के लिए यदि आपके पास एक Foo<T>वर्ग है जावा कम्पाइलर बाइट कोड उत्पन्न करता है जैसे कि यह थाFoo<Object> । इसका मतलब है कि कास्टिंग और बॉक्सिंग / अनबॉक्सिंग को "पृष्ठभूमि" में करना होगा।

मैं अभी कुछ समय के लिए जावा / सी # के साथ खेल रहा हूं और मेरी राय में, भाषा के स्तर पर बड़ा अंतर है, जैसा कि आपने बताया, प्रतिनिधि हैं।


यह गलत है, जेनेरिक इरेज़र या रिफ़ॉर्मेशन (जावा और क्रमशः #) प्रदर्शन को प्रभावित नहीं करता है।
मिगुएल पिंग

आप कास्टिंग के साथ ऑटोबॉक्सिंग को भ्रमित कर रहे हैं।
जेसपेई

3
नहीं, ब्रूनो प्रदर्शन अंतर के बारे में सही है। जावा में सूची <बाइट> (सामान्य रूप से) के बराबर होने का कोई तरीका नहीं है। आपके पास एक सूची होगी <बाइट> जो मुक्केबाजी दंड (समय और स्मृति) को उकसाएगी।
जॉन स्कीट

(संयुक्त राष्ट्र) बॉक्सिंग केवल बॉक्सिंग प्रकारों के लिए होता है, जो आदिम प्रकार हैं।
मिगुएल पिंग

1
कृपया इस लेख को देखें: jprl.com/Blog/archive/development/2007/Aug-31.html
bruno conde

0

कृपया नीचे दिए गए लिंक पर जाएं msdn.microsoft.com/en-us/library/ms836794.aspx यह C # और जावा के बीच समानता और अंतर दोनों को कवर करता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.