Apa perbedaan utama antara C # dan Java?


209

Saya hanya ingin mengklarifikasi satu hal. Ini bukan pertanyaan yang mana yang lebih baik, bagian yang saya serahkan kepada orang lain untuk didiskusikan. Saya tidak peduli tentang itu. Saya telah ditanyai pertanyaan ini pada wawancara pekerjaan saya dan saya pikir mungkin berguna untuk belajar lebih banyak.

Inilah yang bisa saya kemukakan:

  • Java adalah "platform independent". Nah saat ini Anda bisa mengatakan ada proyek Mono sehingga C # dapat dipertimbangkan juga tapi saya percaya itu agak berlebihan. Mengapa? Nah, ketika rilis baru Java dilakukan, ia tersedia secara bersamaan di semua platform yang didukungnya, di sisi lain berapa banyak fitur C # 3.0 yang masih hilang dalam implementasi Mono? Atau benarkah CLR vs. JRE yang harus kita bandingkan di sini?
  • Java tidak mendukung acara dan delegasi. Sejauh yang aku tahu.
  • Di Jawa semua metode virtual
  • Alat pengembangan: Saya percaya belum ada alat seperti Visual Studio. Terutama jika Anda sudah bekerja dengan edisi tim Anda akan tahu apa yang saya maksud.

Silakan tambahkan orang lain yang menurut Anda relevan.

Pembaruan: Baru saja muncul pikiran saya, Java tidak memiliki sesuatu seperti atribut khusus pada kelas, metode dll. Atau apakah itu?


1
Bahasa berbeda dari implementasi bahasa, yang juga berbeda dari perpustakaan. Apa yang ingin Anda bandingkan?
Miguel Ping


2
Saya menemukan ini msdn.microsoft.com/en-us/library/ms836794.aspx Ini mencakup persamaan dan perbedaan antara C # dan java.
Bipul

1
Anda bisa mendapatkan banyak hal yang disebutkan di bawah tentang Java dengan perpustakaan yang tepat. Periksa misalnya kode Java yang valid ini: String baru [] {"james", "john", "john", "eddie"} .where (beginWith ("j")). Different (); Ini menggunakan perpustakaan yang disebut lombok-pg. Dapat ditemukan di github.com/nicholas22/jpropel
NT_

Jawaban:


329

Membandingkan Java 7 dan C # 3

(Beberapa fitur Java 7 tidak disebutkan di sini, tetapi usingkeuntungan pernyataan semua versi C # di atas Java 1-6 telah dihapus.)

Tidak semua ringkasan Anda benar:

  • Di Java metode virtual secara default tetapi Anda dapat membuatnya final. (Dalam C # mereka disegel secara default, tetapi Anda dapat membuatnya virtual.)
  • Ada banyak IDE untuk Java, keduanya gratis (mis. Eclipse, Netbeans) dan komersial (mis. IntelliJ IDEA)

Di luar itu (dan apa yang sudah ada dalam ringkasan Anda):

  • Generik benar-benar berbeda antara keduanya; Java generics hanyalah "trik" waktu kompilasi (tetapi yang bermanfaat pada saat itu). Dalam C # dan .NET generik dipertahankan pada waktu eksekusi juga, dan bekerja untuk tipe nilai serta tipe referensi, menjaga efisiensi yang sesuai (misalnya List<byte>sebagai byte[]dukungan, daripada array byte kotak.)
  • C # tidak memiliki pengecekan pengecualian
  • Java tidak mengizinkan pembuatan tipe nilai yang ditentukan pengguna
  • Java tidak memiliki operator dan kelebihan konversi
  • Java tidak memiliki blok iterator untuk implementasi sederhana iterator
  • Java tidak memiliki sesuatu seperti LINQ
  • Sebagian karena tidak memiliki delegasi, Java tidak memiliki apa pun seperti metode anonim dan ekspresi lambda. Kelas batin anonim biasanya mengisi peran-peran ini, tetapi dengan ceroboh.
  • Java tidak memiliki pohon ekspresi
  • C # tidak memiliki kelas batin anonim
  • C # tidak memiliki kelas dalam Java sama sekali, pada kenyataannya - semua kelas bersarang di C # seperti kelas bersarang statis Java
  • Java tidak memiliki kelas statis (yang tidak memiliki apapun contoh konstruktor, dan tidak dapat digunakan untuk variabel, parameter dll)
  • Java tidak memiliki yang setara dengan tipe anonim C # 3.0
  • Java tidak memiliki variabel lokal yang diketik secara implisit
  • Java tidak memiliki metode ekstensi
  • Java tidak memiliki ekspresi objek dan koleksi initializer
  • Pengubah akses agak berbeda - di Jawa (saat ini) tidak ada yang setara langsung dengan rakitan, jadi tidak ada gagasan visibilitas "internal"; di C # tidak ada yang setara dengan visibilitas "default" di Java yang memperhitungkan namespace (dan warisan)
  • Urutan inisialisasi di Java dan C # agak berbeda (C # mengeksekusi initializers variabel sebelum panggilan dirantai ke konstruktor tipe dasar)
  • Java tidak memiliki properti sebagai bagian dari bahasa; mereka adalah konvensi metode get / set / is
  • Java tidak memiliki kode yang setara dengan "tidak aman"
  • Interop lebih mudah di C # (dan .NET secara umum) daripada JNI Java
  • Java dan C # memiliki ide enum yang agak berbeda. Java jauh lebih berorientasi objek.
  • Java tidak memiliki arahan preprocessor (#define, #if dll dalam C #).
  • Java tidak memiliki padanan dengan C # refdan outuntuk melewatkan parameter dengan referensi
  • Java tidak memiliki padanan dengan tipe parsial
  • Antarmuka C # tidak dapat mendeklarasikan bidang
  • Java tidak memiliki tipe integer yang tidak ditandai
  • Java tidak memiliki dukungan bahasa untuk jenis desimal. (java.math.BigDecimal menyediakan sesuatu seperti System.Decimal - dengan perbedaan - tetapi tidak ada dukungan bahasa)
  • Java tidak memiliki yang setara dengan tipe nilai yang dapat dibatalkan
  • Boxing di Java menggunakan tipe referensi yang sudah ditentukan sebelumnya (tetapi "normal") dengan operasi tertentu pada mereka. Boxing dalam C # dan .NET adalah urusan yang lebih transparan, dengan tipe referensi yang dibuat untuk tinju oleh CLR untuk semua tipe nilai.

Ini tidak lengkap, tetapi mencakup semua yang bisa saya pikirkan begitu saja.


24
@Brian: Saya pikir generik Java dan rincian kelas dalam cukup cepat membatalkan gagasan Jawa mencapai superioritas melalui kesederhanaan;)
Jon Skeet

8
@OrangeDog: Orang-orang yang berdebat kebanyakan bercanda, IMO. Sulit untuk melihat bagaimana dipaksa untuk menulis blok coba / akhirnya eksplisit kurang rentan kesalahan daripada pernyataan menggunakan, IMO. Sebagian besar fitur "ekstra" C # dibandingkan dengan Java berarti Anda dapat lebih sedikit menulis kode lebih sedikit, dan bahwa kode itu bisa lebih mudah dibaca.
Jon Skeet

17
@OrangeDog: Seberapa netral Anda, karena minat? Ya, saya seorang penggemar C #, tetapi dengan pengalaman Java yang cukup signifikan juga - itu adalah pekerjaan saya, setelah semua. Bukannya saya tidak tahu bagaimana menggunakan Java secara efektif.
Jon Skeet

8
@OrangeDog: Sebagai permulaan, sebagian besar pengembang tidak menulis kode menggunakan "tidak aman" sejauh yang saya ketahui, jadi itu adalah herring merah. Saya juga berpikir bahwa provabilitas adalah herring merah - saya tidak berpikir provabilitas formal sangat terkait dengan betapa mudahnya bagi manusia untuk berpikir tentang kode. Maksud saya adalah bahwa sebagai seseorang yang cukup berpengalaman di Jawa dan C #, saya menemukan C # menjadi bahasa yang jauh lebih unggul dalam hal produktivitas dan keterbacaan. Jika Anda merasa sebaliknya, dapatkah Anda memperjelas tingkat pengalaman Anda dalam kedua bahasa? Saya pikir ini cukup relevan dengan diskusi.
Jon Skeet

21
@OrangeDog: Lebih jauh, klaim Anda bahwa "Mampu melakukan lebih banyak hal meningkatkan kemungkinan bahwa Anda akan melakukan kesalahan" juga merupakan kesalahan IMO ... karena mengasumsikan bahwa jika Anda tidak dapat melakukan sesuatu menggunakan fitur dari bahasa yang membuatnya mudah, Anda tidak perlu melakukannya sama sekali. Itu tidak benar - seringkali tugas yang perlu Anda selesaikan di Java dan C # adalah sama, tetapi karena fitur yang hilang, Java mempersulit untuk menyelesaikan tugas-tugas itu dengan benar. Dengan menyederhanakan tugas, fitur ini mengurangi kemungkinan Anda melakukan kesalahan.
Jon Skeet

24

Berikut ini adalah referensi mendalam yang mendalam oleh Dare Obasanjo tentang perbedaan antara C # dan Jawa. Saya selalu menemukan diri saya merujuk ke artikel ini ketika beralih di antara keduanya.

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


2
@ Jon Skeet: Anda adalah pengembang C # paling aktif. Mengapa Anda tidak mempertahankan versi C # & Java perbedaan Anda. Saya yakin orang-orang akan senang membacanya.
cakar

1
@claws: Saya tidak punya waktu untuk melakukan semua yang saya inginkan.
Jon Skeet

19
@ Winston: Kami membutuhkan daftar "perbedaan antara Chuck Norris dan Jon Skeet": 1) Chuck Norris selalu punya waktu; Jon harus memodifikasi TimeDatekelas agar selalu punya waktu, dan belum punya waktu untuk :(
RedFilter

11

C # memiliki properti otomatis yang sangat nyaman dan mereka juga membantu menjaga kode Anda lebih bersih, setidaknya ketika Anda tidak memiliki logika khusus di getter dan setter Anda.


10

Fitur C # Absen di Jawa • C # mencakup tipe yang lebih primitif dan fungsionalitas untuk menangkap pengecualian aritmatika.

• Termasuk sejumlah besar kenyamanan notasi di Jawa, banyak di antaranya, seperti overloading operator dan gips yang ditentukan pengguna, sudah akrab bagi komunitas besar programmer C ++.

• Penanganan acara adalah "warga negara kelas satu" —itulah bagian dari bahasa itu sendiri.

• Memungkinkan definisi "struct", yang mirip dengan kelas tetapi dapat dialokasikan pada stack (tidak seperti instance dari kelas di C # dan Java).

• C # mengimplementasikan properti sebagai bagian dari sintaks bahasa.

• C # memungkinkan pergantian pernyataan untuk beroperasi pada string.

• C # memungkinkan metode anonim yang menyediakan fungsionalitas penutupan.

• C # memungkinkan iterator yang menggunakan co-rutin melalui kata kunci hasil gaya fungsional.

• C # memiliki dukungan untuk parameter output, membantu mengembalikan nilai-nilai berganda, fitur yang dibagikan oleh C ++ dan SQL.

• C # memiliki kemampuan untuk alias namespace.

• C # memiliki "Implementasi Anggota Eksplisit" yang memungkinkan kelas untuk secara khusus mengimplementasikan metode antarmuka, terpisah dari metode kelasnya sendiri. Ini memungkinkannya juga untuk mengimplementasikan dua antarmuka berbeda yang kebetulan memiliki metode dengan nama yang sama. Metode antarmuka tidak perlu bersifat publik; mereka dapat dibuat hanya dapat diakses melalui antarmuka itu.

• C # menyediakan integrasi dengan COM.

• Mengikuti contoh C dan C ++, C # memungkinkan panggilan dengan referensi untuk tipe primitif dan referensi.

Fitur Java Absen di C #

• Kata kunci strictfp Java menjamin bahwa hasil operasi floating point tetap sama di seluruh platform.

• Java mendukung pengecualian yang diperiksa untuk penegakan yang lebih baik terhadap perangkap dan penanganan kesalahan.


9

Sumber lain yang bagus adalah http://www.javacamp.org/javavscsharp/ Situs ini menyebutkan banyak contoh yang menggambarkan hampir semua perbedaan antara kedua bahasa pemrograman ini.

Tentang Atribut, Java memiliki Anotasi, yang bekerja dengan cara yang hampir sama.


5

Generik:

Dengan Java generics, Anda tidak benar-benar mendapatkan efisiensi eksekusi yang Anda dapatkan dengan .NET karena ketika Anda mengkompilasi kelas generik di Java, kompiler menghapus parameter tipe dan mengganti Object di mana-mana. Sebagai contoh jika Anda memiliki Foo<T>kelas kompiler java menghasilkan Kode Byte seolah-olah ituFoo<Object> . Ini berarti casting dan juga tinju / unboxing harus dilakukan di "latar belakang".

Saya telah bermain dengan Java / C # untuk sementara waktu sekarang dan, menurut pendapat saya, perbedaan utama di tingkat bahasa adalah, seperti yang Anda tunjukkan, delegasi.


Ini salah, penghapusan atau reifikasi generik (masing-masing Java dan C #) tidak selalu mempengaruhi kinerja.
Miguel Ping

Anda bingung melakukan autoboxing dengan casting.
JesperE

3
Tidak, Bruno benar tentang perbedaan kinerja. Tidak ada cara untuk mendapatkan yang setara dengan Daftar <byte> (secara umum) di Jawa. Anda harus memiliki Daftar <Byte> yang akan dikenakan penalti tinju (waktu dan memori).
Jon Skeet

Tinju (un) hanya terjadi untuk tipe kotak, yang merupakan tipe primitif.
Miguel Ping


0

Silakan buka tautan yang diberikan di bawah ini msdn.microsoft.com/en-us/library/ms836794.aspx Ini mencakup persamaan dan perbedaan antara C # dan java

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.