Java 常见面试题
面试题节选自:Java 面试指南 | JavaGuide、Road 2 Coding | 编程自学之路
每天一记,始终如一…
基础概念与常识Java 语言有哪些特点?
简单易学;
面向对象(封装,继承,多态);
平台无关性(Java 虚拟机实现平台无关性);
支持多线程
可靠性;
安全性;
支持网络编程并且很方便( Java 语言诞生本身就是为简化网络编程设计的,因此 Java 语言不仅支持网络编程而且很方便);
编译与解释并存;
一次编写,随处运行 是 Java 经典的跨平台口号。
但是目前市面上虚拟化技术已经非常成熟,通过 Docker 容器化技术就很容易实现跨平台。
Java 最大的优势应该是强大的生态!
JVM vs JDK vs JREJVMJava 虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。字节码和不同系统的 JVM 实现是 Java 语言“一次编译,随处可以运行”的关键所在。
JVM 并不是只有一种!只要满足 JVM 规范,每个公司 ...
基于 GitLab 的代码审查
Code Review 流程根据 Git Flow 工作流,开发人员在 feature 分支进行开发,开发完成之后 Merge 到 develop 分支进行测试。
那么最适合做 Code Review 就是 featrue 分支合并到 develop 分支的环节
注:为了保证必须以 Merge 的方式变更 develop 分支、release 分支、以及 master 分支,我们对 Push 以及 Merge 权限进行限制
项目仓库 -> 设置 -> 仓库设置 -> Protected Branches
Protected Branches 配置
这里,我们限制分支,所有的开发人员对 develop 分支、release 分支、以及 master 分支均无 Push 权限,只能以 Merge 方式合并到对应分支,而且只有 Maintainers(Masters) 组的用户有 Merge 权限。
Code View 示例准备工作变更 feature 分支 分支 README.md 文件,为 Merge Request 提供基础
随意更改一行内容,然后 Comm ...
Git 分支管理规范
分支分类
根据生命周期区分
主分支:master,develop;
临时分支:feature/_,release/_,hotfix/*;
根据用途区分
发布/预发布分支:master,release/*;
开发分支:develop;
功能分支:feature/*;
热修复分支:hotfix/*;
分支用途master 分支master 分支主要放稳定、随时可上线的版本。这个分支只能从别的分支上合并过来,一般来讲,从 develop 上合并,或者从 bugfix 分支上合并过来。不能直接在 master 分支上进行 commit 文件。因为是稳定的版本,所以每次版本发布都要在这个分支上添加标签(tag)。
develop 分支develop 分支是所有开发分支的母体,所有的开发分支都要从 develop 上切出来,开发完成之后最后都要合并到 develop 上。
hotfix 分支命名规则:hotfix/* –> hotfix/v+bug修复的版本号
hotfix 分支用来修复生产中的紧急 bug,由于 develop 分支尚处于开发过程中,代码不稳定,不能直接应 ...
Docker 部署的微服务注册到 Nacos 的 IP 为私网无法访问
问题描述使用 docker 集群部署微服务时,注册到 nacos 上的 ip 会使用 docker 容器的虚拟内网 ip 作为注册地址,这会导致集群部署服务时,nacos 无法解析对应服务的 ip。
解决方案
参考:注册服务获取 IP 的问题 · Issue #310 · alibaba/nacos (github.com)
方法一:docker compose 配置文件中设置网络模式为 host
1network_mode: host
host 网络模式是直接使用宿主机的 IP 地址与外界进行通信
方法二:nacos 配置指定注册 ip/host
application.yml 配置文件中添加如下配置即可:
123456spring: cloud: nacos: discovery: # 配置host,避免docker部署nacos注册服务ip为内网地址 ip: xxx
MapStruct 对象转换
前言随着微服务和分布式应用程序迅速占领开发领域,数据完整性和安全性比以往任何时候都更加重要。在这些松散耦合的系统之间,安全的通信渠道和有限的数据传输是最重要的。大多数时候,终端用户或服务不需要访问模型中的全部数据,而只需要访问某些特定的部分。
数据传输对象(Data Transfer Objects, DTO)经常被用于这些应用中。DTO 只是持有另一个对象中被请求的信息的对象。通常情况下,这些信息是有限的一部分。例如,在持久化层定义的实体和发往客户端的 DTO 之间经常会出现相互之间的转换。由于 DTO 是原始对象的反映,因此这些类之间的映射器在转换过程中扮演着关键角色。
这就是 MapStruct 解决的问题:手动创建 bean 映射器非常耗时。 但是该库可以自动生成 Bean 映射器类。
简介 MapStructMapStruct 是一个开源的基于 Java 的代码生成器,用于创建实现 Java Bean 之间转换的扩展映射器。使用 MapStruct,我们只需要创建接口,而该库会通过注解在编译过程中自动创建具体的映射实现,大大减少了通常需要手工编写的样板代码的数量。
MapSt ...
Git Flow 工作流
Git Flow 简介Git Flow 是构建在 Git 之上的一个组织软件开发活动的模型,是在 Git 之上构建的一项软件开发最佳实践。Git Flow 是一套使用 Git 进行源代码管理时的一套行为规范和简化部分 Git 操作的工具。
分支约定Git Flow 有主分支和辅助分支两类分支。其中主分支用于组织与软件开发、部署相关的活动;辅助分支组织为了解决特定的问题而进行的各种开发活动。
主分支(长期分支)
master 可执行版本记录分支,上面的每个节点都是发布到线上的一个版本,具体的版本号由 tag 确定
develop 代码开发分支,所有开发
辅助分支(短期分支)
feature 详细功能分支,每个功能分支应该尽可能的小(最好一天以内),开发完成之后尽快移入仓库中
release 测试版本发布分支,同时接收该版本的 bugfix,直到稳定之后再发布到 master,并合并到 develop 中。
hotfix 紧急修复线上 bug 分支,直接从 master 的版本分出,同时最小版本号加 1。修复完成后发布一个最新版本,同时合并到 develop 中。
主分支
...
Git 提交规约
通用规约
【强制】开发环境的配置文件严禁提交到远程库(前后端都适用)
12345# 本地修改配置文件之后不让git跟踪文件修改状态# git关闭跟踪文件修改提交git update-index --assume-unchanged "application-dev.yml"# git打开跟踪文件修改提交git update-index --no-assume-unchanged "application-dev.yml"
【强制】必须设置 git 提交用户信息
12345678# git生成ssh密钥ssh-keygen -t rsa -C "xxx@vanxsoft.net"# 查看git的配置git config --list# 配置git用户信息,username必须为公司档案中文姓名,email必须为公司企业邮箱git config --global user.name "username"git config --global user.email "email"# ...
Lombok 消除冗余代码
前言Lombok 是一款 Java 开发插件,使得 Java 开发者可以通过其定义的一些注解来消除业务过程中冗余的代码,尤其是简单的 Java 模型对象(POJO)。而当我们如果在开发环境中使用 Lombok 开发插件后,可以省出重复构建,诸如 hashCode 和 equals 这样的方法以及各种业务对象模型的 accessor 和 ToString 等方法的大量时间。对于这些方法,它能够在编译源代码期间自动帮我们生产这些方法,并没有如反射那样降低程序的性能。
可以用来帮助开发人员消除冗余的代码,对于一些简单的 Java 对象(POJO),它通过注释实现这一目的。
实现原理Lombok 的实现原理,基于 JSR269(Pluggable Annotation Processing API) 规范,自定义编译器注解处理器,用于在 Javac 编译阶段时,扫描使用到 Lombok 定义的注解的类,进行自定义的代码生成。
安装步骤在 IDEA 中,已经提供了 IntelliJ Lombok plugin 插件,方便我们使用 Lombok。安装方式很简单,只需要在 IDEA Plugins ...
Floccus bookmark sync 自动同步书签
前言本人平常工作生活中主要用到两款浏览器:Chrome、Edge。
Chrome 主要工作中开发调试页面情况下使用较多,Edge 装了比较多的插件,主要是生活中作为搜索工具、娱乐工具使用。
同时用两个浏览器,最让我头疼的就是浏览器书签同步的问题,最近发现 Floccus bookmarks sync 这款浏览器插件,搭配坚果云可以实现跨浏览器之间书签同步!
Floccus 介绍Floccus 是一款浏览器扩展,iOS 和 Android 应用程序,可在所有浏览器和设备上同步您的书签
通过可选的自托管 Nextcloud 或 WebDAV 服务器,或通过 Google 云端硬盘进行可选的端到端加密
Floccus 搭配坚果云同步书签Floccus 支持 WebDAV、Nextcloud Bookmarks 和本地文件网盘同步,我这里采用的是 WebDAV 方案,配合坚果云实现。
准备坚果云
官网:坚果云官网(jianguoyun.com)
登录坚果云官网,选择个人版(没有账号使用邮箱直接注册就行了)
在同步文件夹根目录下创建一个文件夹,选择默认不同步到本地,需要同步到本地也可以,名字自 ...
Docker 安装 Nexus3 并搭建 Docker 私有镜像仓库
前言Nexus 是 Sonatype 公司发布的一款仓库(Repository)管理软件,常用来搭建 Maven 私服,所以也有人将 Nexus 称为“Maven 仓库管理器”。
Nexus Repository 提供多种包格式的仓库:
官方文档:https://help.sonatype.com/repomanager3
安装部署这里采用 Docker 进行安装
安装 nexus312345678docker run -itd \--privileged=true --name=nexus3 \-p 8081:8081 \-p 8082:8082 \-p 8083:8083 \-p 8084:8084 \-v /u01/cicd/nexus3/data:/nexus-data \sonatype/nexus3:3.30.0
参数说明:
8081:可以通过 http 访问 nexus 应用
8082:docker(hosted)私有仓库,可以 pull 和 push
8083:docker(proxy)代理远程仓库,只能 pull
8084:docker(group)私有仓库和 ...