这是 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 的第四周周报,希望对你有用,后续会继续更新,如果想看日更内容欢迎关注公众号。

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

StackOverflow 第四周周报及19年就业情况分析的更多相关文章

  1. TIOBE11月份编程语言排行榜:C非常接近Java,分析下中美的就业情况

    TIOBE公布11月份编程语言排行榜:C非常接近Java Swift挤进前10,分析下中美的就业情况. 我们先看看他们官方对数据的解读 本月TIOBE指数前20位出现了一些有趣的变动.首先,C语言现在 ...

  2. iOS移动开发周报-第19期

    iOS移动开发周报-第19期 前言 欢迎国内的iOS同行或技术作者向我提交周报线索,线索可以是新闻.教程.开发工具或开源项目,将相关文章的简介和链接在微博上发布并 @唐巧_boy 即可. [摘要]:本 ...

  3. 云原生生态周报 Vol. 19 | Helm 推荐用户转向 V3

    作者| 禅鸣.忠源.天元.进超.元毅 业界要闻 Helm 官方推荐用户迁移到 V3 版本 Helm 官方发布博客,指导用户从 v2 迁移到 v3,这标志着官方开始正式推进 helm 从 v2 转向 v ...

  4. 从就业面分析web前端开发工程师就业前景(2011.6)

    案例一 公司名称:法国电信北京研发中心 工作地点:北京 联系方式:hao.luan@orange-ftgroup.com 栾先生 岗位名称:web 前端开发工程师 岗位要求: 1. 计算机或相关专业本 ...

  5. 19.Linux-USB总线驱动分析

    如下图所示,以windows为例,我们插上一个没有USB设备驱动的USB,就会提示你安装驱动程序 为什么一插上就有会提示信息? 是因为windows自带了USB总线驱动程序, USB总线驱动程序负责: ...

  6. 别人的Linux私房菜(19)认识与分析日志文件

    日志文件通常只有root可以读取,解决系统和网络方面的问题. /var/log/boot.log本次开机系统检测和启动硬件,和内核支持的相关功能的信息记录. /var/log/cron计划任务有没有被 ...

  7. hadoop ,传智播客目录

    一.Hadoop入门,了解什么是Hadoop 1.Hadoop产生背景 2.Hadoop在大数据.云计算中的位置和关系 3.国内外Hadoop应用案例介绍 4.国内Hadoop的就业情况分析及课程大纲 ...

  8. Hadoop storm大数据分析 知识体系结构

    最近工作工作有用到hadoop 和storm,最近看到一个网站上例句的hadoop 和storm的知识体系.所以列出来供大家了解和学习.来自哪个网站就不写了以免以为我做广告额. 目录结构知识点还是挺全 ...

  9. Hadoop学习之路(二)Hadoop发展背景

    Hadoop产生的背景 1. HADOOP最早起源于Nutch.Nutch的设计目标是构建一个大型的全网搜索引擎,包括网页抓取.索引.查询等功能,但随着抓取网页数量的增加,遇到了严重的可扩展性问题—— ...

随机推荐

  1. 亲,麻烦给个五星好评!—RatingBar

    引言 上一篇的CheckBox已经让大家越来越接近实战演练了,本章我们继续分享干货给大家,今天介绍一个实用的UI控件RatingBar(星级评分条),对于使用过电商APP(某东,某宝等)的小伙伴们来说 ...

  2. CodeForces 1200F

    题意略. 思路: 如果是问一下然后搜一下,那必然是不现实的.因此我们要预处理出所有的答案. 我们令mod = lcm(m1,m2,...,mn).可知,在任意一点,我们挑选两个不同的数c1.c2,其中 ...

  3. MySQL数据库笔记六:数据定义语言及数据库的备份和修复

    1. MySQL中的函数 <1>加密函数 password(str) 该函数可以对字符串str进行加密,一般情况下,此函数给用户密码加密. select PASSWORD('tlxy666 ...

  4. Django + JQuery + ajax实时显示数据

    1 创建django项目 :Visualization and  APP :Demo >>django-admin startproject Visualization >>p ...

  5. java设计模式4.适配器模式、装饰器模式

    适配器模式 把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够工作. 1. 类的适配器模式 目标角色:期望的接口,对于类的适配器模式,此角色不可以是具体类 ...

  6. SQlServer 数据库表名称,字段比较

    项目中一般分测试环境(QAS),生产环境(PRD),当我们的项目经历了一次周期跨度较长的更新后,当我们发布到生产环境时,首要的任务是将新增的表,字段更新到生产数据库.很多时候,当我们发布更新的时候,已 ...

  7. gym/102091

    https://codeforces.com/gym/102091 2018-2019 ACM-ICPC, Asia Nakhon Pathom Regional Contest A Flying S ...

  8. ECfinal-D-Ice Cream Tower-二分+贪心

    传送门:https://vjudge.net/problem/Gym-101194D 题意:在一堆数中,找到对多的组合,使得每个组合的个数为K,且满足在排序后,后一个是前一个的两倍: 思路:二分,贪心 ...

  9. 2019 Multi-University Training Contest 4

    A. AND Minimum Spanning Tree solved by rdc 21min -1 数组开小了,解体了一次. 题意 给一棵树,两点之间边权为 x & y,求最小生成树. 做 ...

  10. CodeForces 821D Okabe and City

    Okabe and City 题解: 将行和列也视为一个点. 然后从普通的点走到行/列的点的话,就代表这行/列已经被点亮了. 然后将费用为0的点建上边. 注意讨论(n,m)非亮的情况下. 代码: #i ...