zoukankan      html  css  js  c++  java
  • StackOverflow 第四周周报及19年就业情况分析

    这是 Stack Overflow 第四周周报,两篇 Java、两篇 Python。公众号「渡码」为日更,欢迎关注。另外,我搜集了今年的就业数据,对招聘情况和岗位情况做了简单总结,想了解的朋友点这里

    DAY1. 枚举对象 == 和 equals 区别

    我们在比较枚举常量时可以使用 == 运算符或者 equals 方法,如:

    public class EnumEquals {
    
        public enum FRUITS  {
            /** 苹果 */
            APPLE,
            /** 橙子 */
            ORANGE
        }public static void equalApple(FRUITS fruit) {
            if (fruit == FRUITS.APPLE) {
                System.out.println("equals");
            }
            if (fruit.equals(FRUITS.APPLE)) {
                System.out.println("equals");
            }
        }
    }

    先考虑第一个问题:为什么可以用 == 判断枚举常量相等?

    我们都知道判断对象的相等应该用 equals 方法,== 只是判断对象的引用是否相等,枚举常量能够使用 == 判断相等是因为枚举常量除了定义时初始化的对象外,没有其他实例。例如:常量 APPLE 在定义时已经初始化,并且运行时不会再有其他的 APPLE 枚举常量。根据 JLS 文档,Java 通过以下四点保证枚举常量不存在定义之外的实例

    • 试图显式实例化枚举类型是编译时错误,例如:new FRUITS()
    • Enum 类中的 clone 方法确保永远不能克隆Enum常量,看看 clone 方法可以看到直接抛出 CloneNotSupportedException 异常
    • 序列化机制的特殊处理确保不会因为反序列化而创建重复的实例
    • 禁止枚举类型的反射实例化

    因为枚举常量只有一个实例,因此可以直接用 == 判断枚举实例的相等。如果我们看下 equals 源码就可以发现它也是用 == 进行判断,所以我们考虑第二个问题:使用 == 和 equals 的区别是什么?

    • == 不会抛出 NullPointerException 异常, 而 equals 会
    • == 的类型不匹配在编译时检查,而 equals 不检查
    public class EnumEquals {
    
        public enum FRUITS  {
            /** 苹果 */
            APPLE,
            /** 橙子 */
            ORANGE
        }
    
        public enum SIZE {
            /***/
            SMALL,
            /***/
            MIDDLE,
            /***/
            LARGE
        }
    
        public static void main(String[] args) {
            FRUITS fruit = FRUITS.APPLE;
            fruit == SIZE.SMALL;
        }
    }

    因此使用 == 相比 equals 有以下优势:

    • 更快
    • 运行时更安全
    • 编译时更安全

    参考:

    https://stackoverflow.com/questions/1750435/comparing-java-enum-members-or-equals

    https://docs.oracle.com/javase/specs/jls/se9/html/jls-8.html#jls-8.9

    DAY2. 用 Python 复制文件

    我们都知道 Python 库非常强大,通常我们想实现一个功能基本都找到现成的库。今天我们就介绍 Python 标准库中的一个模块 —— shutil ,该模块中定义了文件复制的方法。如:复制一个文件,直接调一个函数即可

    src = '1.txt'
    dst = '2.txt'
    
    shutil.copyfile(src, dst)

    除了该函数, shutil 模块还定义了其他的函数提供文件复制的功能,但是细节略有不同,对比如下:

    其中 copy2 复制的比较全面,估计性能也是比较低的。下面简单举两个例子对比一下不同函数的区别。

    1. 目的路径是否是目录,copyfile vs copy2

    src = 'test.rar'
    dst = 'D:\'
    
    shutil.copyfile(src, dst)
    shutil.copy2(src, dst)

    2. 是否能复制 meta 数据,copyfile vs copy2

    src = 'test.rar'
    dst = 'test1.rar'
    
    shutil.copyfile(src, dst)
    shutil.copy2(src, dst)

    查看文件的 meta 信息,copyfile 复制的文件的更新时间是最新的, 而 copy2 复制的文件更新时间与源文件一样。

    这里只举这两个例子,如对其他函数感兴趣可自行尝试。另外,shutil 模块应该还有其他更方便的函数可以供我们使用。总之使用 Python 开发效率还是挺高的,掌握 Python 确实能提高工作效率。

    参考:

    https://stackoverflow.com/questions/123198/how-do-i-copy-a-file-in-python

    DAY3. 什么是 Java Bean

    从学 Java web 开发起,我们就知道有 Java Bean 这个东西。但对于我来说,因为我毕业后一直做大数据,讲真我确实不知道 Java Bean 的正式定义。下面我们一起看看符合什么要求才叫 Java Bean :
    • 所有的属性是 private,提供 getter 和 setter 设置属性
    • 有一个 public 无参构造函数
    • 实现 Serializable 接口

    Java Bean 其实是一种规范。对于我们学知识来说,往往想问为什么 Java Bean 定义这样的规范。对照上面三点,我的思考是这样的:

    • getter/setter 方法为了对外暴露属性的读写接口,方便框架调用。同时,属性用 private 修饰可以提高安全性
    • 之前的文章看过 Hadoop 框架反射的例子, public 无参构造可以很方便框架通过反射创建类实例
    • 由于 web 框架通常需要数据传输,因此需要对象具有序列化与反序列化的能力

    我们今天这篇文章比较简短,只是简单介绍了一下 Java Bean 规范的定义,并且谈了谈我自己的一些思考。

    参考:

    https://stackoverflow.com/questions/3295496/what-is-a-javabean-exactly

    DAY3. Python 中实现 switch 语句

     我们都知道 Python 原生语法中不支持 switch 语句。当然 Python 这么灵活的语法,我们自己实现一个也比较容易。代码如下:

    def f(x):
      return {
          'a': 1,
          'b': 2,
      }[x]

    这样实现稍微有些不完备,没有默认值,且如果参数不在字典中会报错。我们更新一版如下:

    def f(x):
      return {
          'a': 1,
          'b': 2
      }.get(x, 9)

    这样实现看起来比较理想了,我们还可以用 Lambda 表达式实现复杂计算,例如:

    def f3(x):
      return {
          'a': lambda x: x * 5,
          'b': lambda x: x + 7,
          'c': lambda x: x - 2
      }.get(x, lambda x: x)

    用 Python 实现 switch 语句还是非常方便的。
    猜测 Python 原生之所以不支持 switch 语法是因为 Python 语言本身已经很灵活了,不需要额外提供 switch 语句增加语言本身的臃肿。真是应了那句话,人生苦短,我用 Python

    以上便是 Stack Overflow 的第四周周报,希望对你有用,后续会继续更新,如果想看日更内容欢迎关注公众号。

    公众号「渡码」,回复 就业 查看各平台完整的分析报告,分享更多高质量内容

  • 相关阅读:
    几种常用的曲线
    0188. Best Time to Buy and Sell Stock IV (H)
    0074. Search a 2D Matrix (M)
    0189. Rotate Array (E)
    0148. Sort List (M)
    0859. Buddy Strings (E)
    0316. Remove Duplicate Letters (M)
    0452. Minimum Number of Arrows to Burst Balloons (M)
    0449. Serialize and Deserialize BST (M)
    0704. Binary Search (E)
  • 原文地址:https://www.cnblogs.com/duma/p/11595248.html
Copyright © 2011-2022 走看看