这是 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. 基础部分之System、Object、Calendar、StringBuffer

    System.out.println(obj)和 System.out.println(obj.toString())区别 public static void main(String[] args) ...

  2. 重读《学习JavaScript数据结构与算法-第三版》- 第6章 链表(一)

    定场诗 伤情最是晚凉天,憔悴厮人不堪言: 邀酒摧肠三杯醉.寻香惊梦五更寒. 钗头凤斜卿有泪,荼蘼花了我无缘: 小楼寂寞新雨月.也难如钩也难圆. 前言 本章为重读<学习JavaScript数据结构 ...

  3. jsDeliver+github使用教程,免费的cdn

    欢迎访问我的个人博客皮皮猪:http://www.zhsh666.xyz 前言:CDN的全称是Content Delivery Network,即内容分发网络.CDN是构建在网络之上的内容分发网络,依 ...

  4. [Python] Django框架入门3——深入视图

    说明: 本文主要深入了解视图(views.py),涉及路由配置.定义视图.Request对象.Response对象.状态保持等. 一.路由配置 1.配置位置(settings.py 的 ROOT_UR ...

  5. net core天马行空系列: 泛型仓储和声明式事物实现最优雅的crud操作

    系列目录 1.net core天马行空系列:原生DI+AOP实现spring boot注解式编程 哈哈哈哈,大家好,我就是那个高产似母猪的三合,长久以来,我一直在思考,如何才能实现高效而简洁的仓储模式 ...

  6. 迷宫问题 POJ - 3984 [kuangbin带你飞]专题一 简单搜索

    定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, ...

  7. Java日志框架总结

    1. 前言 从写代码开始,就陆陆续续接触到了许多日志框架,较常用的属于LOG4J,LogBack等.每次自己写项目时,就copy前人的代码或网上的demo.配置log4j.properties或者lo ...

  8. 《即时消息技术剖析与实战》学习笔记5——IM系统如何保证消息的一致性

    一.什么是消息一致性 消息一致性指的是消息的时序一致性,即消息收发的一致性.如果不能保证时序一致性,就会造成聊天语义不连贯,引起误会. 对于点对点的聊天场景,时序一致性保证接收方的接收顺序和发送方的发 ...

  9. java中存储机制堆栈。

    一.java的六种存储地址及解释 1) 寄存器(register):这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配.你不 ...

  10. Log4Net 日志记录的实现

    一.前言 在上一篇文章[(转载)非常完善的Log4net配置详细说明]介绍了Log4Net的配置说明,如果不知道的可以去看看,这里我们就介绍一下日志记录的实现,说得都比较基础,所以大神请绕过. 二.L ...