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 = 999
        print(item)

    # List
    list1 = [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_item
    for (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 List
            IList<string> list =
            new List<string> { "123", " 10 + 5j", "Hello Python" };
            foreach (var item in list)
            {
                Console.WriteLine(item);
            }
            #endregion

            #region Dictionary
            IDictionary<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 Set
            ISet<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-finally
            FileStream fileStream1 = null;
            try
            {
                fileStream1 = File.OpenRead("D:\\Desktop\\battle内容.txt");
            }
            catch (Exception)
            {
            }
            finally
            {
                fileStream1?.Close();
            }


            //方式二 using
            using ( 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:  # 粒子
    @classmethod
    def turn(self):
        print("可以转动")


class Wave:  # 波
    @classmethod
    def diffuse(self):
        print("可以扩散")


class Light(Particle,Wave):  # 光
    pass


if __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 >= 3

if __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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从零开始:生产环境如何部署 Bytebase

Bytebase 是面向研发和 DBA 的数据库 DevOps 和 CI/CD 协同平台。目前 Bytebase 在全球类似开源项目中 GitHub Star 数排名第一且增长最快。 Bytebase 的架构 Bytebase 是一个单体架构 (monolith)&#xff0c;前端是 Vue3 TypeScript&#xff0c;后端是 Go。前端利用 Go 1.6 …

好用的内外网快速传输大文件方法

在信息化时代&#xff0c;数据已经成为各行各业的关键资产&#xff0c;数据的传输和交换方式直接影响着数据价值的体现。在众多场景下&#xff0c;我们需要在不同的网络环境中进行文件传输&#xff0c;如同一个局域网内或者互联网上。这时涉及到内外网的概念。 内外网指的是在不…

UE5 nDisplay群集事件的发送和接收

注意&#xff1a; 1.只能在投屏模式下生效 2.需要监听的机器都要执行“1.打开监听”

创意无限!亲测可用的免费Photoshop素材网站大揭秘!

高质量的PS材料可以保证设计师设计作品的质量&#xff0c;但很多人不知道在哪里找到一些免费的材料&#xff0c;尤其是对初学者来说。那么&#xff0c;有没有质量好、免费的PS材料网站呢&#xff1f;别担心&#xff0c;现在就告诉你。 即时设计 被很多人视为免费的PS素材网站…

likeshop知识付费系统PHP版v1.4.0

✅ 新增功能 题库功能 ⚡ 功能优化 数据库检测优化 订单中心页优化 系统-登录时效优化 &#x1f41e; 功能修复 详情页佣金可见设置未生效 更新内容说明 1.题库 题库功能的引入&#xff0c;不仅仅是对学习方式的一次革新&#xff0c;更是为广大用户提供了更多更丰富的学…

【运维】WSL1如何升级到WSL2

升级WSL1到WSL2&#xff1a;简便快捷版 在这篇博客中&#xff0c;我们将研究如何通过一种更简便的方式&#xff0c;将WSL1迅速升级到WSL2&#xff0c;避免官方文档的繁冗步骤。如果你觉得官方方法太过冗长&#xff0c;那么这里提供的步骤可能更适合你。 官网的办法是&#xf…

GaussDB(DWS)查询优化技术大揭秘

GaussDB(DWS)查询优化技术大揭秘 大数据时代&#xff0c;数据量呈爆发式增长&#xff0c;经常面临百亿、千亿数据查询场景&#xff0c;当数据仓库数据量较大、SQL语句执行效率低时&#xff0c;数据仓库性能会受到影响。本文将深入讲解在GaussDB(DWS)中如何进行表结构设计&#…

Python进阶知识:整理6 -> 正则表达式

1 基础匹配用法 # 演示Python中正则表达式re模块的3个基础匹配方法 import re # 1. match()方法 从头匹配 string "hello world" result re.match("hello", string) # 如果头部没有匹配成功就直接失败了,后面就不会继续匹配了 print(result) print(r…

软件测试|Selenium StaleElementReferenceException 异常分析与解决

简介 Selenium 是一个流行的自动化测试工具&#xff0c;用于模拟用户与网页交互。然而&#xff0c;当我们在使用 Selenium 时&#xff0c;可能会遇到一个常见的异常&#xff0c;即 StaleElementReferenceException。这个异常通常在我们尝试与网页上的元素交互时抛出&#xff0…

牛客-寻找第K大、LeetCode215. 数组中的第K个最大元素【中等】

文章目录 前言牛客-寻找第K大、LeetCode215. 数组中的第K个最大元素【中等】题目及类型思路思路1&#xff1a;大顶堆思路2&#xff1a;快排二分随机基准点 前言 博主所有博客文件目录索引&#xff1a;博客目录索引(持续更新) 牛客-寻找第K大、LeetCode215. 数组中的第K个最大元…

pytest -- 进阶使用详解

pytest-html⽣成报告 Pytest-HTML 是⼀个插件&#xff0c;它可以⽣成漂亮且易于阅读的 HTML 测试报告。 pytest-html ⽣成报告的步骤 ① 安装 pytest-html 插件&#xff1a; pip install pytest-html ② 运⾏测试并⽣成报告&#xff1a; file name:main.pyimport pytest&qu…

苹果MAC怎么清理内存?苹果MAC清理内存的方法

很多使用苹果电脑的用户都喜欢在同时运行多个软件&#xff0c;不过这样会导致在运行一些大型软件的时候出现不必要的卡顿现象&#xff0c;这时候我们就可以去清理下内存&#xff0c;不过很多人可能并不知道正确的清内存方式&#xff0c;下面就和小编一起来看看吧。 苹果MAC清理…

opengauss-高斯数据库的安装部署及MySQL数据迁移实战.

目录 介绍 下载安装包 安装 1.设置SEMMNI 2.新建用户和用户组 3.下载安装包解压 4.安装数据库 5.修改配置 6.重启服务 数据库使用 gsql命令和常用sql 1.使用omm用户连接数据库-本地登陆无需输入密码&#xff1a; 2.查看用户信息 3.删除数据库 4.创建用户 5.创建…

SSL之mkcert构建本地自签名

文章目录 1. 什么是SSL2. mkcert&#xff1a;快速生成自签名证书2.1 mkcert的工作流程如下&#xff1a;2.2 window 本地实现自签证书2.2.1 下载安装2.2.2 下载,生成本地 SSL2.2.3 生成 pem 自签证书,可供局域网内使用其他主机访问。2.2.4 使用-psck12 生成*.p12 文件 2.3 Sprin…

【设计模式-06】Observer观察者模式

简要说明 事件处理模型 场景示例&#xff1a;小朋友睡醒了哭&#xff0c;饿&#xff01; 一、v1版本(披着面向对象的外衣的面向过程) /*** description: 观察者模式-v1版本(披着面向对象的外衣的面向过程)* author: flygo* time: 2022/7/18 16:57*/ public class ObserverMain…

Odoo14 动态过滤或联动domain

在 Odoo14 中最常用的动态过滤或联动domain的方法有两种 1. 使用 上下文 context 和 重写 _search() 或 _name_search() 方法 2. 使用 onchange() 装饰器 的 domain 返回值 示例&#xff1a; 这个图有字段&#xff1a;项目&#xff0c;上级任务&#xff0c;任务 要求&#…

论文笔记(四十)Goal-Auxiliary Actor-Critic for 6D Robotic Grasping with Point Clouds

Goal-Auxiliary Actor-Critic for 6D Robotic Grasping with Point Clouds 文章概括摘要1. 介绍2. 相关工作3. 学习 6D 抓握政策3.1 背景3.2 从点云抓取 6D 策略3.3 联合运动和抓握规划器的演示3.4 行为克隆和 DAGGER3.5 目标--辅助 DDPG3.6 对未知物体进行微调的后视目标 4. 实…

现代密码学 考点汇总(上)

现代密码学 考点汇总&#xff08;上&#xff09; 写在最前面考试范围一、给一个简单的方案&#xff0c;判断是否cca安全二、随机预言机模型之下的简单应用 0. 规约证明一个规约法证明PRG&#xff08;伪随机生成器&#xff09;的例子定长加密方案&#xff0c;并证明不可区分加密…

【二、自动化测试】为什么要做自动化测试?哪种项目适合做自动化?

自动化测试是一种软件测试方法&#xff0c;通过编写和使用自动化脚本和工具&#xff0c;以自动执行测试用例并生成结果。 自动化旨在替代手动测试过程&#xff0c;提高测试效率和准确性。 自动化测试可以覆盖多种测试类型&#xff0c;包括功能测试、性能测试、安全测试等&…

wins安装paddle框架

一、安装 https://www.paddlepaddle.org.cn/install/quick?docurl/documentation/docs/zh/install/pip/windows-pip.html 装包&#xff08;python 的版本是否满足要求&#xff1a; 3.8/3.9/3.10/3.11/3.12&#xff0c; pip 版本为 20.2.2 或更高版本 &#xff09; CPU 版:…