Java、C#、Python间的Battle
一、编译原理和开发效率
编译速度: C# (约大于等于) JAVA > Python
python的编译原理
前提:python 3.6+
python不会直接编译源码

而是把源码直接扔给解释器,这种方式 使得python非常灵活,让它的开发效率非常高。
它非常适合数据分析、脚步编写和web开发,当然缺点就是它比编译语言慢,因为它是逐行解释的代码的

Java的编译原理
前提:jdk8+
首先java源代码被编译成字节码(.class文件),运行时由jvm(Java虚拟机执行)将其转换成机器码,由于java里面使用JIT(即时编译)在执行之前动态编译关键的字节码,所以Java的运行速度相对比Python快2-4倍。
其次:Java8及以上默认开启了分层编译,一般有client编译器和server编译器,两种编译器混合编译,以达到最高的性能

C#的编译原理
前提:net core 3.0+
由Roslyn(C# 和 Visual Basic)编译器进行编译成IL(也就是中间语言),然后(.netcore clr)运行时会对其进行编译并将其执行。当然.net平台也使用的分层编译的机制对IL进行相关优化。

**开发效率: Python> C# > JAVA **
至于为啥开发效率会是这样,主要是它们的语法灵活性导致的,后面我将对比它们的一些基础语法。
二、常用的数据类型
1.python里常用数据类型

2.java里常用数据类型

3.C#里常用数据类型

讲讲Tuple C#和Python里面有 它是一组类型不同的数据集合(不可变的)
List Set 是在python 、c#、JAVA里面都有的
这个出现了个Dictionary 也就是字典 在JAVA的表现形式略有不同,它用的Map,其实功能都是差不多的 都是存放键值对的
然后我们来看看 python里面 List Set Dictionary 是怎么取值的
在Python和C#里面
List 和 Tuple 使用的索引(下标-index) list.[index] 取值/赋值
Dictionary 使用的索引(key) dict.[key] 取值和赋值在JAVA里面
List 和 Set 使用的索引(下标-index) get(index) 取值和赋值
Dictionary 使用的索引(key) get(key) 取值和赋值
4.小结:
1.Python最灵活,毕竟是弱类型语言,约束性低,当然排查错误很难是它最大的缺点
- 对于List Set Map(Dictionary)来说,Java的init方式设计的并不好
- Java的获取值和设置值,需要使用get()/set()/put(),记忆api并不友好,像python/c#里面它的形式是[index/key],很像我们是掉同一个api
三、foreach循环
python
# Tuple 元组tuple1 = (123, 10 + 5j, "Hello Python")# 元组的取值 按索引下标取值(不能修改)for item in tuple1:#item = 999print(item)# Listlist1 = [123, 10 + 5j, "Hello Python"]# list的取值 按索引下标取值for item in list1:print(item)#Dictionary#dict1 ={}dict1 = {"one": 123, "two": 10 + 5j, "three": 123}#形式一 获取实际值for key in dict1:print("%s_%s" % (key, dict1[key]))# 形式二 =>dict_itemfor (key,item) in dict1.items():print("%s_%s" %(key,item))# Set#set1 = {,}set1 = {123, 10 + 5j, "Hello Python",123}for item in set1:print(item)
java
//List
List<String> list = new ArrayList<String>();
list.add("123");
list.add("10 + 5j");
list.add("Hello Python");for (String s : list) {System.out.println(s);
}//Map
Map<String,String> map = new HashMap<>();
map.put("one","123");
map.put("two","10 + 5j");
map.put("three","Hello Python");
Set<Map.Entry<String, String>> entries = map.entrySet();
//Set<String> strings = map.keySet();for (Map.Entry<String, String> entry : entries) {System.out.println(entry.getKey()+"_"+entry.getValue());
}map.forEach((key,value)->{System.out.println(key+"_"+value);
});//Set
Set<String> set = new HashSet<>();
set.add("123");
set.add("10 + 5j");
set.add("Hello Python");for (String s : set) {System.out.println(s);
}
C#
IEnumerable<int> emum1 = Enumerable.Range(0,10);foreach (var item in emum1){Console.WriteLine(item);}#region /* Tuple<string, string, string> tuple1= Tuple.Create("123", " 10 + 5j", "Hello Python");*///Tuple Array//简化的方式string[] array1 = { "123", " 10 + 5j", "Hello Python" };foreach (var item in array1){Console.WriteLine(item);}#endregion#region Tuple/* Tuple<string, string, string> tuple1= Tuple.Create("123", " 10 + 5j", "Hello Python");*///Tuple//简化的方式(string, string, string) tuple1 = ("123", " 10 + 5j", "Hello Python");/* for (int i = 0; i < tuple1.Count; i++){}*/#endregion#region ListIList<string> list =new List<string> { "123", " 10 + 5j", "Hello Python" };foreach (var item in list){Console.WriteLine(item);}#endregion#region DictionaryIDictionary<string,string> dict = new Dictionary<string, string> {{"one","123" },{"two","10 + 5j" },{"three","Hello Python" },};//KeyValuePair<String,String>foreach (var item in dict){Console.WriteLine(item.Key+"_"+item.Value);}#endregion#region SetISet<string> set = new HashSet<string> {"123", " 10 + 5j", "Hello Python"};foreach (var item in set){Console.WriteLine(item);}// Set是无序的 所以不能直接用下标取值#endregion
四、数据切片
java
//非常简单的切分//Object[] objs2 = Arrays.copyOf(objs, 3);//Object[] objs3 = Arrays.copyOfRange(objs, 3,8);//List<Object> objects = list.subList(1, 4);Map<String,String> map =new HashMap<>();map.put("name","Java");map.put("birth","1991");Object[] objs = {1, 2, 3, 4, 5, 6, 7,map};List<Object> list =new ArrayList(Arrays.asList(objs));List<Object> segData =list.stream().skip(3).limit(5).collect(Collectors.toList());//segData = Arrays.stream(objs).skip(3).limit(5)// .collect(Collectors.toList());for (Object segDatum : segData) {System.out.println(segDatum);}//物理分页// BufferedReader bufferedReader = Files.newBufferedReader(Paths.get("D:\\Desktop\\battle内容.txt"));
// bufferedReader.skip(100);
// String read = bufferedReader.readLine();
// System.out.println(read);//并行流 =》list.parallelStream();
// IntStream objectStream = IntStream.range(0, 200);
// //原始迭代器
// Spliterator originSp = objectStream.spliterator();
// //对半切分
// while (originSp.estimateSize()>1){
// Spliterator sp1 = originSp.trySplit();
// System.out.println("originSp剩余数量:" + originSp.estimateSize());
// }
C#
IList<object> list = new List<object>{1, 2, 3, 4, 5, 6, 7,new Dictionary<string,string>{ { "name" ,"1998" },{ "birth", "1998" } }};//使用Linq (比较万能)IEnumerable<object> enumerable = list.Skip(4).Take(5);foreach (var item in enumerable){Console.WriteLine(item);}//使用Range C#8 (仅对数组有效)int[] arr = { 13, 12, 39, 81,2 }; var slice1 = arr[1..3];//获取第2项-到第四项(不包括)var slice2 = arr[1..^2];//截止为len-2 从尾部计算var slice3 = arr[^1];//获取最后一项// RuntimeHelpers.GetSubArray(arr, Range.EndAt(3));foreach (var item in enumerable){Console.WriteLine(item);}//使用Span//Span<int> span = arr.AsSpan().Slice(1, 3);//var arraySpan = new Span<byte>(list);// 将日志数据转换为字节数组 byte[] logBytes = File.ReadAllBytes(@"D:\Desktop\battle内容.txt");// 使用Span处理日志数据Span<byte> logSpan = new Span<byte>(logBytes);// 在Span中查找特定关键词string keyword = "error";byte[] keywordBytes = Encoding.UTF8.GetBytes(keyword);int keywordCount = 0;for (int i = 0; i <= logSpan.Length - keywordBytes.Length; i++){if (logSpan.Slice(i, keywordBytes.Length).SequenceEqual(keywordBytes)){keywordCount++;}}Console.WriteLine($"匹配次数:{keywordCount}");
python
## 切片支持 string list set tuple dictionary
var1 = "1,2,3,4,5,6,7,'hello','Python'"
var1 = (1, 2, 3, 4, 5, 6, 7, 'hello', 'Python')
var1 =[1,2,3,4,5,6,7,{"name":"Python","birth":"1989"}]
segeme_var = var1[4:8]
print(segeme_var)
优雅性: Python > C# > Java
(相对)性能: C# > Java > Python
五、对IO流如何关闭
java
//方式一 try-finally (jdk8以前)BufferedReader bufferedReader1 =null;try {bufferedReader1 = Files.newBufferedReader(Paths.get("D:\\Desktop\\battle内容.txt"));//coding} catch (IOException e) {e.printStackTrace();}finally {if(bufferedReader1!=null){try {bufferedReader1.close();} catch (IOException e) {e.printStackTrace();}}}//方式二 try-resource (jdk8+)try( BufferedReader bufferedReader2 =Files.newBufferedReader(Paths.get("D:\\Desktop\\battle内容.txt"))) {//coding} catch (IOException e) {e.printStackTrace();}
C#
//方式一 try-finallyFileStream fileStream1 = null;try{fileStream1 = File.OpenRead("D:\\Desktop\\battle内容.txt");}catch (Exception){}finally{fileStream1?.Close();}//方式二 usingusing ( FileStream fileStream2 = File.OpenRead("D:\\Desktop\\battle内容.txt") ){}
python
#!/usr/bin/python3
# -*- coding: utf-8 -*-fr = None# region 方式一 try-finally
try:fr = open("D:\\Desktop\\battle内容.txt", "r")var1 = 1/0
finally:if fr is not None:print("已关闭")fr.close()pass
# endregion# # region 方式二 with
# with open("D:\\Desktop\\battle内容.txt", "r") as fr2:
# var1 = 1/0
# # endregion
六、关于它们的继承不同
java
支持单一继承 多个实现
public class Particle {//转动public void turn(){System.out.println("可以转动");}
}public class Wave {//扩散的public void diffuse(){System.out.println("可以扩散");}
}
//单个继承
public class Light extends Particle{public static void main(String[] args) {Light light = new Light();light.diffuse();light.turn();}
}
C#
支持单一继承 多个实现
namespace NetCore_Demo.inherit
{public class Particle { //粒子public void Turn() { //转动System.Console.WriteLine("可以转动");}}public class Wave{ //波 public void Diffuse(){//扩散的System.Console.WriteLine("可以扩散");}}public class Light:Wave{static void Main(string[] args){Light light = new Light();light.Diffuse();}}
}
python
支持多个继承 无接口实现
class Particle: # 粒子@classmethoddef turn(self):print("可以转动")class Wave: # 波@classmethoddef diffuse(self):print("可以扩散")class Light(Particle,Wave): # 光passif __name__ == '__main__':light1 = Light()light1.turn()light1.diffuse()
七、关于它们的重载不同
java
√1.跟返回值类型无关,只跟参数列表有关
√2.不支持关键字和参数默认值
public class MyOverload {public void learn(){System.out.println("正在文化课的学习");}public void learn(String course){System.out.println(String.format("正在%s的学习", course));}/*** @param course 课程名称 举个例子: 舞蹈 跆拳道* @param learnTime 时间学习时长* @return 是否完成学习时长*/public boolean learn(String course,float learnTime){float totalTime =3f;System.out.println(String.format("正在%s的学习,学习时长:%s小时", course,learnTime));return totalTime<=learnTime;}public static void main(String[] args) {MyOverload myOverload =new MyOverload();myOverload.learn();myOverload.learn("舞蹈");bool f = myOverload.learn("舞蹈",1);System.out.println("是否完成学习任务"+f);}
}
C#
√1.跟返回值类型无关,只跟参数列表有关
√2.支持关键字和参数默认值
using System;
namespace NetCore_Demo.overload
{public class MyOverload{public void learn(){Console.WriteLine("正在文化课的学习");}public void learn(string course){Console.WriteLine($"正在{course}的学习");}/// <param name="course">课程名称 举个例子: 舞蹈 跆拳道</param>/// <param name="learnTime">时间学习时长</param>/// <returns>是否完成学习时长</returns>public bool learn(string course, float learnTime){float totalTime = 3f;Console.WriteLine($"正在{course}的学习,学习时长:{learnTime}小时");return totalTime <= learnTime;}static void Main(string[] args){MyOverload myOverload = new MyOverload();myOverload.learn();myOverload.learn("舞蹈");bool f = myOverload.learn("舞蹈", 1);Console.WriteLine("是否完成学习任务" + f);// 关键词参数 + 参数默认值}}
}
python
√python 在类里面只有覆盖没有重载
class MyOverload:def learn(self, course="舞蹈", learnTime=3):print(f"正在{course}的学习,学习时长:{learnTime}小时")return learnTime >= 3if __name__ == '__main__':myOverload = MyOverload()myOverload.learn()myOverload.learn(course="跆拳道")
八、函数式接口
1、python是天然的函数式接口
2.c#里面用于委托,这个可以多播,可以实现函数的回调
public delegate void Action();
public delegate void Action<in T1>(T1 arg1);
public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6>(T1 arg1, T2 arg2, T3 arg3, T3 arg4, T3 arg5, T3 arg6);
public delegate TResult Func<out TResult>();
public delegate TResult Func<in T1, out TResult>(T1 arg1);...
public delegate TResult Func<in T1, in T2, in T3, in T4, in T5,
in T6, out TResult> (T1 arg1,T2 arg2,T3 arg3,T4 arg4,T5 arg5,T6 arg6)
public delegate bool Predicate<in T>(T obj)
3.java8里面使用函数式接口(@FunctionInterface)
//无返回值类型
@FunctionalInterface
public interface Consumer<T> {void accept(T t);//......
}
===》BiConsumer<T, U>//一个入参 一个返回值
@FunctionalInterface
public interface Function<T, R> {R apply(T t);//......
}
===》BiFunction<T, U, R>//一个入参 返回值是布尔类型
@FunctionalInterface
public interface Predicate<T> {//对给定的参数求值boolean test(T t);
}
===》BiPredicate<T, U>
九、相关视频链接:
https://www.bilibili.com/video/BV1Cw411V78V
https://www.douyin.com/user/self?modal_id=7315770090534882570
相关文章:
Java、C#、Python间的Battle
一、编译原理和开发效率 编译速度: C# (约大于等于) JAVA > Python python的编译原理 前提:python 3.6 python不会直接编译源码 而是把源码直接扔给解释器,这种方式 使得python非常灵活,让它的开发效…...
【图形学】探秘图形学奥秘:DDA与Bresenham算法的解密与实战
🌈个人主页:Sarapines Programmer🔥 系列专栏:《图形学 | 图像解码》⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。 目录 🌌1. 初识模式识别…...
微服务-Gateway
案例搭建 官网地址 父Pom <com.alibaba.cloud.version>2.2.8.RELEASE</com.alibaba.cloud.version> <com.cloud.version>Hoxton.SR12</com.cloud.version> <com.dubbo.version>2.2.7.RELEASE</com.dubbo.version> <dependencyManagem…...
【用队列实现栈】【用栈实现队列】Leetcode 232 225
【用队列实现栈】【用栈实现队列】Leetcode 232 225 队列的相关操作栈的相关操作用队列实现栈用栈实现队列 ---------------🎈🎈题目链接 用队列实现栈🎈🎈------------------- ---------------🎈🎈题目链…...
Angular系列教程之观察者模式和RxJS
文章目录 引言RxJS简介RxJS中的设计模式观察者模式迭代器模式 示例代码RxJS 在 Angular 中的应用总结 引言 在Angular开发中,我们经常需要处理异步操作,例如从后端获取数据或与用户的交互。为了更好地管理这些异步操作,Angular中引入了RxJS&…...
展厅设计中搭建的小常识
1、展厅的安全问题 展厅的空间面积大,平时为出现公开展览时人员较少,但遇到开展活动、会展展览时人流量将大大增多,无论是临时的展厅展示还是长期的展示安全问题即使不说都应该是装饰的重中之重,所以在从前期设计规划到后期施工采…...
LeetCode 98. 验证二叉搜索树
98. 验证二叉搜索树 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例…...
自定义shell工具函数之pull_image()
这是一个名为pull_image的Shell脚本函数。让我来解释一下这个函数的功能: function pull_image() {image$1DOCKER_IMAGE_MIRROR$(get_config_or_env DOCKER_IMAGE_MIRROR)if [[ "${DOCKER_IMAGE_MIRROR}" "1" ]]; thenif [[ "$(uname -m…...
2019年认证杯SPSSPRO杯数学建模C题(第二阶段)保险业的数字化变革全过程文档及程序
2019年认证杯SPSSPRO杯数学建模 基于统计建模的车险业数字变革研究 C题 保险业的数字化变革 原题再现: 车险,即机动车辆保险。保险自身是一种分散风险、消化损失的经济补偿制度,车险即为分散机动车辆在行驶过程中可能发作的未知风险和损失…...
【数据结构和算法】反转链表
其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 方法一:迭代(双指针) 2.2 方法二:递归 三、代码 3.…...
What is `GenericFilterBean` does?
GenericFilterBean 是 SpringWeb 框架中提供的一个抽象基类,其对 javax.servlet.Filter接口进行了封装和扩展,它简化了在 Servlet环境下创建自定义过滤器的工作。 GenericFilterBean 主要特点包括: 集成 Spring 容器: 由于它是一…...
突破通胀风险,聚焦现货黄金投资机遇
随着全球经济不断发展和金融市场的波动,通胀风险成为各界关注的焦点。在面对通胀带来的财务压力和资产贬值的威胁时,投资者都在寻找稳定且可靠的避险资产。而现货黄金作为一种值得瞩目的投资工具,正吸引着越来越多投资者的目光。 黄金作为一种…...
Jenkins集成Sonar Qube
下载插件 重启Jenkins 容器 sonarqube 使用令牌 Jenkins 配置 重新构建...
Angular系列教程之zone.js和NgZone
文章目录 什么是zone.jsZone的工作原理Zone的常见用途NgZone:Angular中的zone.js使用NgZone使用NgZone执行代码使用NgZone外部检测 结论 什么是zone.js 在Angular中,zone.js是一个非常重要的库,它为我们提供了一种跟踪和管理异步操作的机制。…...
阿里巴巴的第二代通义千问可能即将发布:Qwen2相关信息已经提交HuggingFace官方的transformers库
本文来自DataLearnerAI官方网站:阿里巴巴的第二代通义千问可能即将发布:Qwen2相关信息已经提交HuggingFace官方的transformers库 | 数据学习者官方网站(Datalearner) 通义千问是阿里巴巴开源的一系列大语言模型。Qwen系列大模型最高参数量720亿…...
肯尼斯·里科《C和指针》第6章 指针(6)编程的练习:查找字符
1.编写一个函数,它在一个字符串中进行搜索,查找在一个给定字符集合中出现的所有字符。这个函数的原型如下: char *find_char( char const *source, char const *chars ); 它的基本想法是查找source字符串中匹配chars字符串中任何字符的第1个…...
Entity Framework知识点整理
Entity Framework Entity Framework(EF)是微软提供的一种对象关系映射(Object-Relational Mapping,ORM)框架,用于在.NET应用程序和关系型数据库之间建立映射关系。它简化了数据访问层的开发,使…...
源码搭建教学:连锁餐饮APP开发实战
连锁餐饮APP,对于很多从事餐饮行业的人来说不会陌生,同样这个项目本身就有着很高的热度。今天,小编将深入为大家讲述一下此系统的前后端开发、数据库设计、用户界面设计等方面,让您深入了解全栈开发的方方面面。 一、项目准备与规…...
使用JavaScript实现一个在线画板
一、引言 随着Web技术的发展,网页上的交互性变得越来越重要。一个在线画板是一个很好的例子,它允许用户在网页上自由创作。在这篇博客中,我们将使用HTML5的Canvas元素和JavaScript来实现一个简单的在线画板 二、HTML结构 首先,…...
微信小程序如何自定义导航栏,怎么确定导航栏及状态栏的高度?导航栏被刘海、信号图标给覆盖了怎么办?
声明:本文为了演示效果,颜色采用的比较显眼,可根据实际情况修改颜色 问题描述 当我们在JSON中将navigationStyle设置成custom后,当前页面的顶部导航栏就需要我们制作了,但出现了一下几个问题: 导航栏的高…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...
MySQL的pymysql操作
本章是MySQL的最后一章,MySQL到此完结,下一站Hadoop!!! 这章很简单,完整代码在最后,详细讲解之前python课程里面也有,感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...
