java和net的一些区别
song

基础数据类型

  • java不支持无符号整数类型, net有无符号整数类型
  • net 有 decimal 用户高精度计算,java需要使用BigDecimal引用类型来处理高精度计算

Java 的基础类型不是对象,而是原始类型(Primitive Type) 但可以用包装类进行装箱。
.NET 的值类型是 struct,继承自 System.ValueType,可以自动装箱为 System.Object
.NET 运行时可以区分值类型和引用类型,而 Java 运行时
所有对象都是引用类型
,基础类型只能通过包装类变成对象。

Java的接口默认实现和Net扩展方法

泛型

  • java 泛型会类型擦除(Type Erasure) 泛型在运行时丢失信息,无法使用某些功能(如 instanceof)。 是 伪泛型
  • net 是真泛型
  • java 受限与 类型擦除 无法创建泛型数组 无法使用 instanceof 检测泛型类型
    1
    2
    3
    4
    5
    6
    public T[] getData(T para) {  
    T[] result = new T[2]; // ❌ 编译错误
    if (value instanceof T) { // ❌ 编译错误 }

    return new T[]{data, para};
    }
  • 协变(规定了上限,只能是自己(最大类型)或他的子类) 与 逆变 (规定了下限,只能是自己(最小类型)或他的父类)
    Java 和 .NET 都支持泛型类的赋值,但 Java 需要通配符 ? extends T? super T 来实现,而 C# 通过 outin 更加灵活。
    C# 泛型接口支持协变和逆变,这比 Java 的泛型更加强大,使泛型集合更灵活。

可变参数

  • params string args
  • java String … args
特性 Java (...) C# (params)
关键字 String... args params string[] args
本质 数组 (String[]) 数组 (string[])
必须放最后
是否可以传入数组 可以 可以
是否能混合数组和单个参数 不行 不行

异常处理

Lambda

Linq VS Stream API 方法对比

  • 基础功能
功能 .NET LINQ (C#) Java Stream API
转换为流 collection.AsEnumerable() collection.stream()
转换为并行流 collection.AsParallel() collection.parallelStream()
转换回集合 collection.ToList() collect(Collectors.toList())
转换回数组 collection.ToArray() toArray()
连接字符串 String.Join(", ", collection) collect(Collectors.joining(", "))
  • 筛选
功能 .NET LINQ (C#) Java Stream API
条件筛选 Where(x => x > 5) filter(x -> x > 5)
分区(按布尔值分类) GroupBy(x => x > 5) collect(Collectors.partitioningBy(x -> x > 5))
  • 映射
功能 .NET LINQ (C#) Java Stream API
单层映射 Select(x => x * 2) map(x -> x * 2)
多层展开(扁平化) SelectMany(x => x.SubList) flatMap(x -> x.getSubList().stream())
  • 排序
功能 .NET LINQ (C#) Java Stream API
升序排序 OrderBy(x => x) sorted()
降序排序 OrderByDescending(x => x) sorted(Comparator.reverseOrder())
多条件排序 ThenBy(x => x.Prop) sorted(Comparator.comparing(x -> x.Prop))
  • 去重
功能 .NET LINQ (C#) Java Stream API
去重 Distinct() distinct()
  • 限制/跳过
功能 .NET LINQ (C#) Java Stream API
取前 N 个元素 Take(3) limit(3)
跳过前 N 个元素 Skip(3) skip(3)
  • 统计
功能 .NET LINQ (C#) Java Stream API
元素个数 Count() count()
求和 Sum() mapToInt(x -> x).sum()
平均值 Average() mapToInt(x -> x).average().orElse(0)
最大值 Max() max(Comparator.naturalOrder()).orElse(0)
最小值 Min() min(Comparator.naturalOrder()).orElse(0)
  • 终端操作
功能 .NET LINQ (C#) Java Stream API
检查是否所有元素满足条件 All(x => x > 0) allMatch(x -> x > 0)
检查是否存在满足条件的元素 Any(x => x > 0) anyMatch(x -> x > 0)
检查是否没有满足条件的元素 !Any(x => x > 0) noneMatch(x -> x > 0)
聚合归约 Aggregate((acc, x) => acc + x) reduce((acc, x) -> acc + x).orElse(0)
  • 分组
功能 .NET LINQ (C#) Java Stream API
按字段分组 GroupBy(x => x.Category) collect(Collectors.groupingBy(x -> x.getCategory()))
  • 连接
功能 .NET LINQ (C#) Java Stream API
内部连接(Join) Join(table2, x => x.Id, y => y.Id, (x, y) => new { x, y }) 不支持,需要手动实现
左连接(GroupJoin) GroupJoin(table2, x => x.Id, y => y.Id, (x, y) => new { x, y }) 不支持,需要手动实现
  • 其他特性
功能 .NET LINQ (C#) Java Stream API
可多次遍历 支持 Stream 只能遍历一次
适用于数据库查询 支持(LINQ to SQL, EF Core) 仅适用于内存数据
支持扩展方法 可扩展 IEnumerable 无法扩展 Stream API
  • LINQ vs Stream API 的优缺点
对比项 .NET LINQ Java Stream API
是否惰性计算 支持延迟执行 支持延迟执行
是否支持并行计算 AsParallel() parallelStream()
是否可多次遍历 可以多次遍历 IEnumerable Stream 只能遍历一次
是否支持数据库查询 支持(EF Core、LINQ to SQL) 仅限于内存操作
是否支持扩展方法 可以扩展 IEnumerable 无法扩展 Stream API
转换集合是否方便 ToList() collect(Collectors.toList())
  • 中间操作 和 终结操作
    • 中间操作(Intermediate Methods / Streaming Methods) 返回一个新的流,不会触发计算,只定义操作。
    • 终结操作(Terminal Methods) 执行最终计算,触发流的处理,返回一个具体的结果或副作用(如遍历、收集、聚合等)。
操作类别 .NET LINQ 方法 Java Stream 方法
中间操作 Where, Select, SelectMany, Distinct, OrderBy, OrderByDescending, Skip, Take, GroupBy filter, map, flatMap, distinct, sorted, skip, limit, groupingBy, partitioningBy, peek
终结操作 ForEach, ToList, ToArray, Count, FirstOrDefault, First, Any, All, Sum, Max, Min, Average, Aggregate forEach, collect, count, findFirst, findAny, anyMatch, allMatch, sum, max, min, average, reduce, joining

代码书写风格

其他

1
2
3
4
5
6
7
8
/*  
* 递归
* 递归前进阶段、边界条件未达成、在持续压栈 如果递归次数过多,会找出栈内存用完,内存溢出
* 达成边界条件
* 递归返回阶段、持续退栈
* 1) 递归前进(递推),将问题分解;2) 达到终止条件,停止递归;3) 递归返回(回归),合并结果。
* 递推(分解问题 → 终止条件) → 回归(合并结果)
* */
由 Hexo 驱动 & 主题 Keep