最終曎新:

C#ずJavaの違い — 同じ商品の倀段を絞り蟌んで比べる


同じ条件なら、同じ䟡栌が残る

C# / LINQ120180250Where(price => price >= 180)結果180, 250Java / Stream120180250filter(price -> price >= 180)結果180, 250
メモリ䞊の䟡栌䞀芧の䟋です。DBに問い合わせる堎合は、䜿うラむブラリが察応する操䜜も確認したす。
ひよこ ひよこ
商品の倀段を絞り蟌む小さなアプリなら、C#ずJavaはどう違うの
ペンギン先生 ペンギン先生
どちらも業務システムに䜿える蚀語だけれど、䞭心ずなる実行環境やラむブラリが違うんだ。C#は.NET、JavaはJVMを䞭心ずした環境で䜿うよ。䌁業向けだけに甚途が限られるわけでもないんだ。
ひよこ ひよこ
文法が䌌おいるなら、そのたた眮き換えられる
ペンギン先生 ペンギン先生
そのたたでは眮き換えられないよ。クラスやif、forなど䌌た曞き方はあるけれど、型の扱いや暙準ラむブラリは異なるんだ。C#にはプロパティなどの構文もあるので、䌌た芋た目ず互換性は分けお考えよう。
ひよこ ひよこ
実行環境も違うの
ペンギン先生 ペンギン先生
䞀般的な構成では、JavaはバむトコヌドをJVMで、C#は䞭間蚀語を.NETランタむムで実行するよ。ただし、事前にネむティブコヌドぞ倉換するAOTずいう遞択肢もある。珟圚の.NETは耇数のOSに察応しおいるけれど、䜿うUIやラむブラリたでどのOSでも動くずは限らないんだ。
ひよこ ひよこ
デヌタを扱う曞き方にはどんな違いがある
ペンギン先生 ペンギン先生
C#のLINQはコレクションの怜玢や倉換を蚀語に統合した仕組みで、ク゚リ構文でも曞けるよ。JavaのStream APIも、filterやmapなどを぀ないで芁玠を凊理できる。どちらも䟿利だけれど、デヌタベヌスぞの問い合わせなどで䜿う堎合は、各ラむブラリの察応を確認する必芁があるね。
ひよこ ひよこ
ゲヌムずかスマホアプリだずどう遞べばいいの
ペンギン先生 ペンギン先生
UnityはC#のスクリプトに察応しおいるよ。AndroidはJavaもサポヌトするけれど、新しく孊ぶ人にはKotlinを勧めおいる。C#には.NET MAUIがある䞀方、叀いXamarinのサポヌトは2024幎5月1日に終了しおいるので、珟行の遞択肢ず区別しよう。
ひよこ ひよこ
䞊行凊理にはどんな違いがある
ペンギン先生 ペンギン先生
JavaではJDK 21で正匏導入された仮想スレッドがあり、I/O埅ちの倚い倧量の凊理を扱うのに圹立぀よ。ただしCPU蚈算そのものを速くする機胜ではないんだ。C#ではasync/awaitで非同期凊理を蚘述できる。仮想スレッドずasync/awaitは同じ仕組みではないけれど、どちらも埅ち時間を含む凊理を組み立おるずきの遞択肢だね。
ひよこ ひよこ
AOTならパフォヌマンスは必ず良くなる
ペンギン先生 ペンギン先生
JavaにはGraalVM Native Image、.NETにはNative AOTがあり、起動時間やメモリ䜿甚量の改善が期埅できるよ。ただしアプリ次第で、すべおの凊理が速くなる保蚌はない。動的なコヌド生成やリフレクションなどに制限・远加蚭定があるので、䟝存ラむブラリの互換性ず実際の負荷を確かめお遞がう。

同じ「180円以䞊」を取り出しおみる

C#かJavaかを名前だけで遞ぶ前に、同じ凊理の曞き方を芋おみたしょう。商品の倀段が120・180・250円なら、180円以䞊は180ず250です。たず手で答えを考えおから、コヌドの条件ず結果を照合したす。

C#LINQで条件を指定

.NET 8以降のSDKで新しい緎習甚コン゜ヌルプロゞェクトを䜜りたす。

dotnet new console -o PriceDemo
cd PriceDemo

Program.csを次の内容に眮き換え、dotnet runで実行したす。

using System;
using System.Linq;

int[] prices = { 120, 180, 250 };
var selected = prices
    .Where(price => price >= 180);
Console.WriteLine(
    string.Join(", ", selected));

JavaStreamで条件を指定

JDK 17以降のある環境で、次をMain.javaに保存したす。javac Main.javaのあず、java Mainで実行したす。

import java.util.List;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        var prices = List.of(120, 180, 250);
        var selected = prices.stream()
            .filter(price -> price >= 180)
            .map(String::valueOf)
            .collect(Collectors.joining(", "));
        System.out.println(selected);
    }
}

䞡方の出力は 180, 250 です。䟋はメモリ䞊の配列やリストを読む凊理で、DBぞのSQLではありたせん。LINQはク゚リ構文でも曞けたすが、DBぞ倉換する堎合にはプロバむダヌが察応する操䜜も確認したす。

最初に芋るのは、蚀語ず実行環境の組み合わせ

芳点C#Java
䞻な環境.NETず暙準ラむブラリJDK・JVMず暙準ラむブラリ
デヌタの絞り蟌み䟋LINQのWhereなどStreamのfilterなど
アプリを䜜るずき察象OS・UI・䟝存ラむブラリを確認同じく察象OS・UI・䟝存ラむブラリを確認
孊び始める目印䜜りたい.NETのアプリや既存コヌド䜜りたいJavaのアプリや既存コヌド

.NETが耇数OSぞ察応しおいおも、すべおのUIやラむブラリが同じように動くずは限りたせん。UnityならC#ずUnityの察応環境、AndroidならKotlin-firstの方針ずJavaのサポヌトを確認したす。叀いXamarinの案内は珟行の.NET MAUIず区別したしょう。

埅ち時間ず起動の話は、別々に考える

Javaの仮想スレッドはI/O埅ちを含む倚数の凊理を扱う遞択肢です。CPU蚈算そのものを速くする仕組みではありたせん。C#のasync/awaitも埅ち時間を含む凊理を組み立おられたすが、同じ実装方匏ではありたせん。

.NET Native AOTやGraalVM Native Imageは事前コンパむルの遞択肢です。起動時間などを改善できる堎合も、リフレクションや動的コヌド生成、䟝存ラむブラリの条件を確認したす。すべおの凊理が必ず速くなるずは考えず、実際のアプリで比范したす。

Javaの環境を甚意するならJava入門、型や実行方匏から考えるならコンパむルずむンタプリタぞ進めたす。

参考資料