Java、C#、Python间的Battle

2024-01-17 16:20
文章标签 java c# python .net netcore battle

本文主要是介绍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

这篇关于Java、C#、Python间的Battle的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/616585

相关文章

SpringBoot中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种

python生成随机唯一id的几种实现方法

《python生成随机唯一id的几种实现方法》在Python中生成随机唯一ID有多种方法,根据不同的需求场景可以选择最适合的方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习... 目录方法 1:使用 UUID 模块(推荐)方法 2:使用 Secrets 模块(安全敏感场景)方法

Java docx4j高效处理Word文档的实战指南

《Javadocx4j高效处理Word文档的实战指南》对于需要在Java应用程序中生成、修改或处理Word文档的开发者来说,docx4j是一个强大而专业的选择,下面我们就来看看docx4j的具体使用... 目录引言一、环境准备与基础配置1.1 Maven依赖配置1.2 初始化测试类二、增强版文档操作示例2.

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断

Spring Boot中的路径变量示例详解

《SpringBoot中的路径变量示例详解》SpringBoot中PathVariable通过@PathVariable注解实现URL参数与方法参数绑定,支持多参数接收、类型转换、可选参数、默认值及... 目录一. 基本用法与参数映射1.路径定义2.参数绑定&nhttp://www.chinasem.cnbs

JAVA中安装多个JDK的方法

《JAVA中安装多个JDK的方法》文章介绍了在Windows系统上安装多个JDK版本的方法,包括下载、安装路径修改、环境变量配置(JAVA_HOME和Path),并说明如何通过调整JAVA_HOME在... 首先去oracle官网下载好两个版本不同的jdk(需要登录Oracle账号,没有可以免费注册)下载完

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

Spring Boot 结合 WxJava 实现文章上传微信公众号草稿箱与群发

《SpringBoot结合WxJava实现文章上传微信公众号草稿箱与群发》本文将详细介绍如何使用SpringBoot框架结合WxJava开发工具包,实现文章上传到微信公众号草稿箱以及群发功能,... 目录一、项目环境准备1.1 开发环境1.2 微信公众号准备二、Spring Boot 项目搭建2.1 创建

Java中Integer128陷阱

《Java中Integer128陷阱》本文主要介绍了Java中Integer与int的区别及装箱拆箱机制,重点指出-128至127范围内的Integer值会复用缓存对象,导致==比较结果为true,下... 目录一、Integer和int的联系1.1 Integer和int的区别1.2 Integer和in

SpringSecurity整合redission序列化问题小结(最新整理)

《SpringSecurity整合redission序列化问题小结(最新整理)》文章详解SpringSecurity整合Redisson时的序列化问题,指出需排除官方Jackson依赖,通过自定义反序... 目录1. 前言2. Redission配置2.1 RedissonProperties2.2 Red