自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(14)
  • 收藏
  • 关注

原创 Python 为什么不用分号作终止符?

一般而言,编程语言中使用分号“;”来实现两种目的: 1.作为语句分隔符:使用分号来分隔语句(statement),这样就能在一行代码中书写多条语句(一行多句) 2.作为语句终止符:使用分号来终止语句,这样就能把多行代码识别为一条语句(一句多行) 单纯看“分隔符”与“终止符”,它们都是必须的,然而是否都要用分号来表示呢?这个问题没有达成一致的标准。 Python 中使用了分号作为语句分隔符,但是不用分号作为终止符, 而是用了换行作为终止符。 若在一句完整的语句末尾加了分号,然后换行,那么 IDE 一般会提

2020-06-28 14:49:02 1605

原创 为什么Python没有 main 函数?为什么我不推荐写 main 函数?

毫无疑问 Python 中没有所谓的 main 入口函数,但是网上经常看到一些文章提“Python 的 main 函数”、“建议写 main 函数”…… 有些人是知情的,他的意图可能是模仿那些正宗的 main 函数,但还有不少人明显是被误导了(或自己误解了),就写出来很累赘的代码。 本期“Python 为什么”栏目来聊聊 Python 为什么没有 main 函数? 在开始正题之前,先要来回答这两个问题:所谓的 “main 函数”是指什么?为什么有些编程语言需要强制写一个 main 函数? 某些编程语言以 m

2020-06-28 14:43:59 250

原创 为什么Python不支持 i++ 自增语法,不提供 ++ 操作符?

在 C/C++/Java 等等语言中,整型变量的自增或自减操作是标配,它们又可分为前缀操作(++i 和 --i)与后缀操作(i++ 和 i–),彼此存在着一些细微差别,各有不同的用途。 Python 中虽然可能出现 ++i 这种前缀形式的写法,但是它并没有“++”自增操作符,此处只是两个“+”(正数符号)的叠加而已,至于后缀形式的“++”,则完全不支持(SyntaxError: invalid syntax)。 本期“Python为什么”栏目,我们将会从两个主要的角度来回答:Python 为什么不支持 i+

2020-06-28 14:39:45 177

原创 Java 代码性能优化,35个细节,让你提升java代码的运行效率

代码优化,一个很重要的课题。可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了。 代码优化也是一样,如果项目着眼于尽快无BUG上线,那么此时可以抓大放小,代码的细节可以不精打细磨;但是如果有足够的时间开发、维护代码,这时候就必须考虑每个可以优化的细节了,一个一个细小的优化点累积起来,对于代码的运行效率绝对是有提升的。 代码优化的目标是 减小代码的体积 提

2020-06-27 15:58:26 238

原创 从Java Socket非阻塞到Netty入门流程(干货!)

Java IO,Socket非阻塞通信流程 这里我们使用一个内嵌的永久循环,来让Socket成为一个非阻塞的通信流程。 如上图所示,ServerSocket是我们自建的一个类,通过启动线程,且线程内置一个真循环,防止accept阻塞; 在客户端监听类上,将监听到的socket作为参数,传递到客户端监听类上,并再次启动线程,获取一个InputStream,同时再次在这个刚刚启动线程内置一个真循环,为的是不断获取信息并回写; 这里要注意的是,第一个真循环是保证获取新连接不会阻塞,第二个真循环是保证不停的获取客

2020-06-27 14:12:46 211

原创 比较jvm内存结构&java内存模型&java对象模型

学习java过程中有三个概念,分别是jvm内存结构、java内存模型、java对象模型。我们系统的学习完之后,如果不加以总结对比,很容易混淆,相信不光是自己有时候会搞混,好多人应该也同样的困惑,所以这里对这三个知识点做一个总结和对比。希望能帮到大家。 一、jvm内存结构(jvm运行时内存结构) Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机的进程启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁

2020-06-22 17:37:16 391

原创 Android WebView —— Java 与 JavaScript 交互总结(干货)

相比于 Native App 和 Web App,Hybrid App 凭借其迭代灵活、控制自如、多端同步的优势在应用市场上越发显得优胜,主要得力于,其将变更频繁的部分产品功能使用 H5 开发并在客户端中借助 WebView 控件嵌入应用当中。所以,开发中我们总会遇到原生 Java 代码与网页中的 Js 代码之间相互调用从而产生的交互问题。 Java 与 Js 彼此调用的前提是设置 WebView 支持 JavaScript 功能: mWebView.getSettings().setJavaScriptE

2020-06-22 15:11:13 301

原创 换另一种方式编写 Spring MVC 接口

1. 前言 通常我们编写 Spring MVC 接口的范式是这样的: @RestController @RequestMapping("/v1/userinfo") public class UserInfoController { @GetMapping("/foo") public String foo() { return "felord.cn"; } } 这种我都写吐了,今天换个口味,使用 Spring 5 新引入的函数式端点(Functional

2020-06-14 16:03:02 155

原创 MyBatis 源码解析:SQL 语句的执行机制

通过前面两篇文章,我们完成了对 MyBatis 所有配置文件(包括配置文件和映射文件)解析过程的分析。回忆一下我们最开始给出的小示例(如下),经过前面的跋山涉水,我们终于完成了第一行代码的 99% (手动滑稽),这最后的 1% 就是创建 SqlSessionFactory 对象。所有的配置解析最后都会封装到 Configuration 对象中,接下去就是调用 SqlSessionFactoryBuilder#build 方法创建 SqlSessionFactory 对象,实际使用的是 DefaultSqlS

2020-06-12 20:42:10 280

原创 MyBatis 源码解析:映射文件的加载与解析

上一篇我们分析了配置文件的加载与解析过程,本文将继续对映射文件的加载与解析实现进行分析。MyBatis 的映射文件用于配置 SQL 语句、二级缓存,以及结果集映射等,是区别于其它 ORM 框架的主要特色之一。 在上一篇分析配置文件 <mappers/> 标签的解析实现时,了解到 MyBatis 最终通过调用 XMLMapperBuilder#parse 方法实现对映射文件的解析操作,本文我们将以此方法作为入口,探究 MyBatis 加载和解析映射文件的实现机制。 方法 XMLMapperBuil

2020-06-12 19:54:10 353

原创 MyBatis 源码解析:配置文件的加载与解析

上一篇我们曾约定 mybatis-config.xml 文件为配置文件,SQL 语句配置文件为映射文件,本文我们将沿用上一篇中的示例程序,一起探究一下 MyBatis 加载和解析配置文件(即 mybatis-config.xml)的过程。 配置文件的加载过程 在示例程序中,执行配置文件(包括后面要介绍的映射文件)加载与解析的过程位于第一行代码中(如下)。其中,Resources 是一个简单的基于类路径或其它位置获取数据流的工具类,借助该工具类可以获取配置文件的 InputStream 流对象,然后将其传递给

2020-06-12 16:56:13 364

原创 MyBatis 源码解析:架构初探

MyBatis 是一个易用、轻量,且强大的半自动化 ORM 框架,在设计思想和代码实现上都有许多值得我们借鉴的地方,例如动态代理机制的应用,资源文件的加载与解析,缓存模块的设计、反射机制的应用,插件模块的设计,架构分层,以及对设计模式的应用等,是一个非常适合初入源码阅读领域的练手项目。本系列文章将从配置文件解析、映射文件解析,以及 SQL 语句执行机制这三个大方向对整个框架的实现展开分析。本文是本系列的第一篇文章,主要从整体的角度对 MyBatis 的架构设计做一个综述性的介绍。 在正式开始之前,先以一个小

2020-06-12 15:46:34 192

原创 Java有关强引用,软引用,弱引用,虚引用的记录(实用)

首先不要被一些对一些名词望而生畏,其实都是一些存在即合理的东西。 引用本身很好理解,引用类型的数据中存放的是实际对象的内存地址,垃圾回收时,就看对象是否存在引用。Java不需要开发人员分配内存和释放内存,但是可以通过四种引用类型来处理相关对象生命周期,配合jvm进行垃圾回收。 1.强引用 正常的创建对象,赋值变量都属于强引用类型,强引用类型在垃圾回收时,不会被回收,内存不足时直接抛出OutOfMemoryError错误。 byte[] data = new byte[2*1024*1024]; VM opt

2020-06-12 15:35:12 123

转载 Java虚拟机内存结构及编码实战(强烈建议!)

了解JVM内存结构的目的 在Java的开发过程中,因为有JVM自动内存管理机制,不再需要像在C、C++开发那样手动释放对象的内存空间,不容易出现内存泄漏和内存溢出的问题。但是,正是由于把内存管理的权利交给了JVM,一旦出现内存泄漏和内存溢出方面的问题,如果不了解JVM是如何使用内存的,不了解JVM的内存结构是什么样子的,就很难找到问题的根源,就更难以解决问题。 JVM内存结构简介 在JVM所管理的内存中,大致分为以下几个运行时数据区域: 程序计数器:当前线程所执行的字节码的行号指示器。 虚拟机栈:Jav

2020-06-10 17:48:17 166

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除