Java、C#、Python间的Battle

一、编译原理和开发效率

编译速度: C# (约大于等于) JAVA > Python

python的编译原理

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

Java的编译原理

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

C#的编译原理

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

**开发效率: 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最灵活,毕竟是弱类型语言,约束性低,当然排查错误很难是它最大的缺点
  1. 对于List Set Map(Dictionary)来说,Java的init方式设计的并不好
  2. 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/629922.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

交通流量预测HSTGCNT:Hierarchical Spatio–Temporal Graph Convolutional

Hierarchical Spatio–Temporal Graph Convolutional Networks and Transformer Network for Traffic Flow Forecasting 交通流预测的层次时空图卷积网络和Transformer网络 Abstract 图卷积网络&#xff08;GCN&#xff09;具有图形化描述道路网络不规则拓扑结构的能力&#…

乳腺癌预测_EDA_Models

文章目录 **前言**数据介绍1.概述2.**关于数据集** 预测过程1.安装包2.加载库3.导入数据4.数据清洗5.EDA重复行缺失值单变量分析正态性检验双变量分析年龄与肿瘤大小(cm)肿瘤大小&#xff08;cm&#xff09;与诊断结果肿瘤大小&#xff08;cm&#xff09;与转移多元分析 6.预处…

QT软件在线安装与维护

一.安装 安装QT开发环境分离线安装和在线安装两种方式&#xff0c;具体步骤如下&#xff1a; QT官网注册账号----下载安装包-----安装-----选择要安装的版本与开发包----版本维护 注意&#xff1a;Qt5.14.2是最后提供二进制安装包的版本&#xff0c;后面的版本都需要在线安装…

Linux学习记录——사십일 高级IO(2)--- Select型服务器

文章目录 1、思路2、select接口3、实现1、准备工作2、实现等待多个fd3、辨别连接和简单处理读事件4、简单处理写、读事件 4、特点 1、思路 select就是多路转接IO。select能以某种形式&#xff0c;等待多个文件描述符&#xff0c;只要有哪个fd有数据就可以读取并全部返回。就绪…

P9852 [ICPC2021 Nanjing R] Windblume Festival 题解(SPJ)

[ICPC2021 Nanjing R] Windblume Festival 单击此处下载原神 题面翻译 给一个长度为 n n n 环形整数序列 a a a, 每次操作可以任意选择一个下标 x x x&#xff0c;令 $ a_x a_x - a_{(x\bmod n)1}$&#xff0c;之后移除 a ( x m o d n ) 1 a_{(x\bmod n)1} a(xmodn)1​…

.Net Core项目在linux部署实战 1.sdk下载 2.环境变量配置/ect/profile 3.运行

1)下载.net core sdk https://download.visualstudio.microsoft.com/download/pr/01292c7c-a1ec-4957-90fc-3f6a2a1e5edc/025e84c4d9bd4aeb003d4f07b42e9159/dotnet-sdk-6.0.418-linux-x64.tar.gz 2)配置下环境变量 step1: // 解压到指定目录 mkdir -p $HOME/dotnet &…

从零学Java 线程池

Java 线程池 文章目录 Java 线程池1 线程池概念1.1 现有问题1.2 线程池 2 线程池原理3 如何使用线程池3.1 获取线程池 4 创建线程的第四种方式 1 线程池概念 1.1 现有问题 线程是宝贵的内存资源、单个线程约占1MB空间&#xff0c;过多分配易造成内存溢出。频繁的创建及销毁线…

Angular系列教程之自定义指令

文章目录 前言指令的基本概念在模板中使用指令总结 前言 在Angular中&#xff0c;指令是一种非常强大的工具&#xff0c;用于扩展HTML元素的功能和行为。它们允许我们创建可重用的组件&#xff0c;并在应用程序中的多个地方使用它们。本文将介绍Angular指令的基础知识&#xf…

AI工具(20240116):Copilot Pro,Fitten Code等

Copilot Pro Copilot Pro是微软推出的Copilot的付费增强版本,通过提供优先访问GPT-4等最新AI模型,大大提升用户的创造力和工作效率。该服务可与Microsoft 365订阅捆绑使用,支持在Word、Excel等Office应用内直接使用Copilot功能,帮助用户更快速地起草文档、电子邮件和演示文稿等…

自动驾驶轨迹规划之碰撞检测(二)

欢迎大家关注我的B站&#xff1a; 偷吃薯片的Zheng同学的个人空间-偷吃薯片的Zheng同学个人主页-哔哩哔哩视频 (bilibili.com) 目录 1.基于凸优化 2.具身足迹 3. ESDF 自动驾驶轨迹规划之碰撞检测&#xff08;一&#xff09;-CSDN博客 大家可以先阅读之前的博客 1.基于…

文件夹重命名技巧:如何避免过长名称带来的混乱,随机名称不再难

在日常生活和工作中&#xff0c;经常要管理大量的文件夹&#xff0c;有清晰、简洁的文件夹名称能大大提高工作效率。在工作的时候会遇到文件夹名称过长的问题&#xff0c;导致显示不完整、容易混淆&#xff0c;影响文件管理器的性能。下面一起来看云炫文件管理器如何批量重命名…

易模真人手办定制:好技术、好服务,共建消费者满意的新一代大众定制平台

随着我国人民精神文化与物质生活的不断升级&#xff0c;定制真人手办摆件的需求变得广泛&#xff0c;易模推出易模真人手办定制服务&#xff08;小程序&#xff09;&#xff0c;帮助市场合作伙伴能够以全线上、手机端形式为用户制作真人手办&#xff0c;“全线上”的内涵包括手…

鸿蒙应用开发学习:改进小鱼动画实现按键一直按下时控制小鱼移动和限制小鱼移出屏幕

一、前言 近期我在学习鸿蒙应用开发&#xff0c;跟着B站UP主黑马程序员的视频教程做了一个小鱼动画应用&#xff0c;UP主提供的小鱼动画源代码仅仅实现了移动组件的功能&#xff0c;还存在一些问题&#xff0c;如默认进入页面是竖屏而页面适合横屏显示&#xff1b;真机测试发现…

【SpringBoot篇】添加富文本编辑器操作

文章目录 &#x1f354;使用步骤⭐首先我们需要安装富文本编辑器⭐在<script>中引入富文本编辑器⭐富文本图片上传接口⭐初始化富文本编辑器⭐调用 初始化富文本编辑器的方法&#x1f388;新增&#x1f388;编辑&#x1f388;保存 ⭐添加按钮⭐实现viewEditor函数&#x…

视觉检测系统:工厂生产零部件的智能检测

在工厂的生产加工过程中&#xff0c;工业视觉检测系统被广泛应用&#xff0c;并且起着重要的作用。它能够对不同的零部件进行多功能的视觉检测&#xff0c;包括尺寸和外观的缺陷。随着制造业市场竞争越来越激烈&#xff0c;对产品质检效率的要求不断提高&#xff0c;传统的人工…

docker试用metabase

安装 docker run -d -p 3000:3000 --name metabase metabase/metabase 初始化 填写相关信息&#xff0c;不要选中文&#xff0c;翻译太生硬了&#xff0c;很多配置项例如聚合这样的词语看不懂&#xff0c;还不如换回英文。 数据查看 在数据源中选择 show editor 可以进行数据…

【不用找素材】ECS 游戏Demo制作教程(2) 1.16

一、知识点补充 1.工程内部 上一篇最后一步运行时&#xff0c;突然发现 变成52:1了&#xff0c;难道每次baking都是随机的&#xff1f; 破案了&#xff0c;52是index索引&#xff0c;1是version版本号 如果您在场景视图中看不到实体&#xff0c;但仍然可以在游戏视图中看到…

FPGA高端项目:12G-SDI 视频编解码,提供工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐我这里已有的 GT 高速接口解决方案我目前已有的SDI编解码方案 3、详细设计方案设计框图UltraScale GTH 的SDI模式应用UltraScale GTH 基本结构参考时钟的选择和分配UltraScale GTH 发送和接收处理流程UltraScale GTH 发送接口UltraScale G…

数据结构与算法:归并排序

数据结构与算法&#xff1a;归并排序 归并思想递归法非递归 归并思想 在讲解归并排序前&#xff0c;我们先看到一个问题&#xff1a; 对于这样两个有序的数组&#xff0c;如何将它们合并为一个有序的数组&#xff1f; 在此我们处理这个问题的思路就是&#xff1a;开辟一个新的…

ATA-1222A宽带放大器在二极管测试中的应用有哪些

宽带放大器是一种用于放大高频信号的电子设备&#xff0c;它在二极管测试中有多种应用。下面安泰电子将介绍宽带放大器在二极管测试中的几种常见应用。 宽带放大器可以用于二极管参数测试。二极管是一种常见的半导体器件&#xff0c;有正向电压-电流特性和反向电压-电流特性。为…