下面选取在实际项目中应用较多的排序方式作一个性能比较,并会对各个方式作一个分析总结。

排序性能比较

测试方案

  1. 随机生成10万个整型数字,作为待排序数据。
  2. 逐个应用各个排序算法,通过计算开始至结束时间来获得算法执行时间,然后对其进行排序。

测试结果

排序算法 耗时(ms)
直接插入排序 769
希尔排序 10
冒泡排序 18,557
*快速排序 9
直接选择排序 3,811
*堆排序 10
归并排序 20
阅读全文 »

介绍

通常一个分布式系统是由许多相互依赖的服务所组成的,这些被依赖的服务极易出现故障或响应延迟的问题。如果其中某个服务失败则会影响其他服务并进一步降低整体性能,并导致应用程序其他功能无法正常访问,在最坏的情况下,整个应用程序将崩溃。

Hystrix框架通过提供熔断降级来控制服务之间的交互依赖,通过隔离故障服务并停止故障的级联效应以提高系统的总体弹性。

Hystrix的历史

2011年Netflix API团队开发了Hystrix,2012年Hystrix不断发展和成熟,并且Netflix内的许多团队都采用了它。如今,每天在Netflix上通过Hystrix执行数以千亿计的线程隔离和数以千计的信号隔离调用。

Hystrix的作用是什么?

  • 为第三方客户端提供保护,控制延迟和失败(通常依赖网络)等故障。
  • 停止复杂的分布式系统中的级联故障。
  • 快速失败,迅速恢复。
  • 回退并在可能的情况下正常降级。
  • 启用近乎实时的监视,警报和配置控制。

Hystrix解决什么问题?

复杂分布式体系结构中的应用程序具有数十种依赖关系,每种依赖关系不可避免地会在某个时刻失败(因为不可预知的故障)。如果应用程序未与这些外部故障隔离开来,那么外部的错误会影响到自己,以至于将自己拖垮。

阅读全文 »

源码C:\ProgramFiles\Java\jdk1.8.0_181\jre\lib\rt.jar!\java\util\Hashtable.class

简介

本类是java.util.Map接口的一个线程安全实现,自JDK1.0时就被添加进来。任何非空对象都可以用作键或值。为了保证从哈希表存储和检索对象,用作键的对象必须实现hashCode方法和equals方法。

类图结构

下面介绍一下它里面这些内部类的情况:

  • Entry:表示KV整体的对象。
  • ValueCollection:实现Collection接口,为了让值可以被迭代。
  • Enumerator:为了实现元素可迭代
  • EntrySet:条目列表
  • KeySet:键列表
阅读全文 »

目前绝大多数项目用apache maven做java应用依赖管理,当我们缺少某个jar包,只需要在maven中央仓库查找它的GAV坐标,然后在POM文件中声明,在构建时这个jar包会被下载。但有时候也会遇到一个情况,别人给你一个jar包,这个jar包在中央仓库、公司私有仓库和本地仓库都不存在。既然这个jar包都不在仓库里面,那还怎么使用maven管理依赖呢?

方案一

在根目录下创建一个libs目录,并把这个别人给你的jar包放到其中,然后在POM文件中像下面这样声明依赖。

1
2
3
4
5
6
7
<dependency>
<groupId>com.tianmingxing.app</groupId>
<artifactId>web</artifactId>
<version>1.0.0-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/sdk.jar</systemPath>
</dependency>

这个jar包也可以放在本地其它位置,在<systemPath>元素中配置即可。

阅读全文 »

Apache Maven本身实际上只是一个插件驱动引擎。换句话说,真正干活的是插件,例如:创建jar文件,创建war文件,编译代码,单元测试代码,创建项目文档等。

插件命名规则

  • 应用使用<yourplugin>-maven-plugin这种方式。
  • 不要使用maven-<yourplugin>-plugin这种命名方式,因为它是由Apache Maven团队维护官方Apache Maven插件的保留命名模式。官方有明确指出使用这种命名模式是对Apache Maven商标的侵犯。

写第一个插件

我们将构建一个简单的插件,其目标是不带任何参数,并且在运行时仅在屏幕上显示一条消息。

1.在IDE中创建maven项目

项目POM文件内容如下,注意packaging属性与普通应用的区分:

阅读全文 »