基础数据类型
- 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# 通过 out 和 in 更加灵活。
✅ 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 |
| 对比项 |
.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) 递归返回(回归),合并结果。 * 递推(分解问题 → 终止条件) → 回归(合并结果) * */
|