开源中国

我们不支持 IE 10 及以下版本浏览器

It appears you’re using an unsupported browser

为了获得更好的浏览体验,我们强烈建议您使用较新版本的 Chrome、 Firefox、 Safari 等,或者升级到最新版本的IE浏览器。 如果您使用的是 IE 11 或以上版本,请关闭“兼容性视图”。
博客专区 - 开源中国社区

精彩阅读

  • 最新推荐

  • 今日热门

  • 本周热门

  • 每日一博

  • 最新文章

京东活动系统--亿级流量架构应对之术

背景 京东活动系统 是一个可在线编辑、实时编辑更新和发布新活动,并对外提供页面访问服务的系统。其高时效性、灵活性等特征,极受青睐,已发展成京东几个重要流量入口之一。近几次大促,系统所承载的pv已经达到数亿级。随着京东业务的高速发展,京东活动系统的压力会越来越大。急需要一个更高效,稳定的系统架构,来支持业务的高速发展。本文主要对活动页面浏览方面的性能,进行探讨。 活动页面浏览性能提升的难点: 1. 活动与活动之间差异很大,不像商品页有固定的模式。每个页面能抽取的公共部分有限,可复用性差。 2. 活动页面内容多样,业务繁多。依赖大量外部业务接口,数据很难做到闭环。外部接口的性能,以及稳定性,严重制约了活动页的渲染速度、稳定性。 经过多年在该系统下的开发实践,提出“页面渲染、浏览异步化”的思想,并以此为指导,对该系统进行架构升级改造。通过近几个月的运行,各方面性能都有显著提升。在分享"新架构"之前,先看看我们现有web系统的架构现状。 一、web架构发展与现状 1.开发阶段 以京东活动系统架构的演变为例,这里没有画出具体的业务逻辑,只是简单的描述下架构:   2.第二步,一般是在消耗性能的地方加缓存,这里对部分查库操作...
高级架构师 发布于 6小时前 阅读 115 评论 1

Java Money与Currency API浅谈

**一、概述** JSR 354 - “金钱和货币”解决了Java中货币和货币金额的标准化问题。 它的目标是为Java生态系统添加一个灵活的可扩展的API,并使货币量更简单,更安全。 JSR没有进入JDK 9,而是未来JDK版本的候选人。虽然在Java9有Currency类简单实现但是实际开发中满足不了需求 **二、引入** 在maven的pom.xml中做如下引入 org.javamoney moneta 最新版本 在gradle中 compile group: 'org.javamoney', name: 'moneta', version: '最新版本' 最新版本依赖,可以查看,[点击这里](https://mvnrepository.com/artifact/org.javamoney/moneta) **三、JSR-354功能** “货币和金钱”API的目标: 1.提供处理和计算货币金额的API 2.定义货币和货币金额的类别,以及货币四舍五入 3.处理汇率 4.处理货币和货币金额的格式化和解析 **四、API分析与使用** 1.规范中提到的类及接口都在javax.money.*包下面。 2.先从核心的两个接口CurrencyUnit与MonetaryAmount开始剖析 3.CurrencyUnit及MonetaryAmount CurrencyUnit 代表的是货币。它有点类似于现在的java.util.Currency类,不同之处在于它支持自定义的实现。从规范的定义来看,java.util.Currency也是可以实现该接口的。CurrencyUnit的实...
ville 发布于 7小时前 阅读 43

快速了解人工智能结晶之语音转换文字

科技解放生产力,人工智能的应用如今是大热,那么今天就来给各位介绍一下IBM在这方面的一个小的尝试,语音转换文字。咱们来看一看相较于传统的转换,结合Watson的IBM是如何做到让识别率飙升的。
IBM Bluemix

[雪峰磁针石博客] 使用pandas处理excel

pandas有强大的excel数据处理和导入处理功能,本文简单介绍pandas在csv和excel等格式方面处理的应用及绘制图表等功能。 pandas处理excel依赖xlutils, OpenPyXL, XlsxWriter等库。 python处理excel库的参考:https://github.com/xurongzhong/mobile_data 本文代码地址:https://github.com/xurongzhong/mobile_data/tree/master/pandas/excel_demo 本文最新版本地址:http://dwz.cn/7ig569 淘宝天猫可以把链接发给qq850766020,为你生成优惠券,降低你的购物成本! 快来领取支付宝跨年红包!1月1日起还有机会额外获得专享红包哦!复制此消息,打开最新版支付宝就能领取!2C56CV70sA 更多参考资料: https://www.dataquest.io/blog/excel-and-pandas/ Using Pandas to Read Large Excel Files in Python 中文 CSV 使用pandas读写csv pandas_parsing_and_write.py import pandas as pd input_file = r"supplier_data.csv" output_file = r"output_files\1output.csv" data_frame = pd.read_csv(input_file) print(data_frame) data_frame.to_csv(output_file, index=False) 当然也可以用python实现: 1csv_simple_parsing_and_write.py input_file = r"supplier_data.csv" o...
磁针石 发布于 9小时前 阅读 78

KMQueue 基于Redis的分布式消息队列

# KMQueue [![Build Status](https://travis-ci.org/fnpac/KMQueue.svg?branch=master)](https://travis-ci.org/fnpac/KMQueue) 码云:https://gitee.com/iicode/KMQueue github:https://github.com/fnpac/KMQueue 该框架是基于redis实现的分布式队列,简单灵活。 下面简单介绍下该队列的一些设计,如果还有其他不懂得地方可以参考源码和注释,代码中我加入了详尽的注释。 还有其他问题可以提issue。 ## 设计 ### 序列图 ![基于Redis的分布式消息队列设计.png](./基于Redis的分布式消息队列设计.png) ### 队列模式 KMQueue队列分为两种模式: - `default` - 简单队列 - `safe` - 安全队列 其中默认为`default`。 可以以`queueName:queueMode`格式设置队列的模式。 - queueName 队列名称 default 为默认队列,可以不指定,默认值。 特性:队列任务可能会丢失,队列任务没有超时限制。 - queueMode 队列模式,可选值有:default、safe。 safe 为安全队列,任务有重试策略,达到重试次数依旧失败或者任务存活超时(这里说的超时是指AliveTimeout)(这两者都称为最终失败),Monitor会发出通知, 这样可以根据业务做一些处理,推荐将这些失败的任务持久化到数据库作为日志记录...
fnpac 发布于 13小时前 阅读 149

再谈让Java支持多行文本

打算抄袭一下MyBatis的Java注解方式配置,添加到在正在开发的持久层工具里,只需要定义一个接口方法,就可以用一个动态代理来使用它,这种方式的优点是可以利用Java的导舤功能快速定位SQL,比文本方式保存的模板定位方便,而且方法名和参数都是Java强类型,支持重构: @Select("select * from users where id = #{id}") User getUserById(Integer id); 但还是老问题,Java对多行文本的支持太差,MyBatis的解决方法个人不是太喜欢,破坏了SQL的可读性: private String selectPersonSql() { return new SQL() {{ SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME"); SELECT("P.LAST_NAME, P.CREATED_ON, P.UPDATED_ON"); FROM("PERSON P"); FROM("ACCOUNT A"); INNER_JOIN("DEPARTMENT D on D.ID = P.DEPARTMENT_ID"); INNER_JOIN("COMPANY C on D.COMPANY_ID = C.ID"); WHERE("P.ID = A.ID"); WHERE("P.FIRST_NAME like ?"); OR(); WHERE("P.LAST_NAME like ?"); GROUP_BY("P.ID"); HAVING("P.LAST_NAME like ?"); OR(); HAVING("P.FIRST_NAME like ?"); ORDER_BY("P.ID"); ORDER_BY("P.FULL_NAME"); ...
yong9981 发布于 2天前 阅读 301 评论 2

Java编程思想学习录(连载之:内部类)

![Thinkpad 25 Anniversary](http://upload-images.jianshu.io/upload_images/9824247-0fb7bdff80a77326.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 用thinkpad打字确实很爽啊! --- ## 内部类基本概念 - 可将一个类的定义置于另一个类定义的内部 - 内部类允许将逻辑相关的类组织在一起,并控制位于内部的类的可见性 - 甚至可将内部类定义于一个**方法**或者**任意作用域**内! - 当然,内部类 ≠ 组合 - 内部类拥有其外围类 所有元素的 访问权 - 更有甚,嵌套多层的内部类能透明地访问所有它所嵌入的外围类的所有成员 一个典型的例子:利用 **Java内部类** 实现的 **迭代器模式** ``` // 接口 ------------------------------------------------------------- public interface Selector { boolean end(); Object current(); void next(); } // 外部类(集合类) + 内部类(迭代器类) ------------------------------------------------------------- public class Sequence { // 外部类(代表一个集合类) private Object[] items; private int next = 0; public Sequence( int size ) { items = new Object[size]; } public void add( Object x ) { if...
hansonwang 发布于 2天前 阅读 259 评论 2 点赞 1

监听器【第二篇应用】

从第一篇已经讲解过了监听器的基本概念,以及Servlet各种的监听器。这篇博文主要讲解的是监听器的应用。 统计网站在线人数 分析 我们在网站中一般使用Session来标识某用户是否登陆了,如果登陆了,就在Session域中保存相对应的属性。如果没有登陆,那么Session的属性就应该为空。 现在,我们想要统计的是网站的在线人数。我们应该这样做:我们监听是否有新的Session创建了,如果新创建了Sesssion,那么在线人数就应该+1。这个在线人数是整个站点的,所以应该有Context对象保存。 大致思路: 监听Session是否被创建了 如果Session被创建了,那么在Context的域对象的值就应该+1 如果Session从内存中移除了,那么在Context的域对象的值就应该-1. 代码 监听器代码: public class CountOnline implements HttpSessionListener { public void sessionCreated(HttpSessionEvent se) { //获取得到Context对象,使用Context域对象保存用户在线的个数 ServletContext context = se.getSession().getServletContext(); //直接判断Context对象是否存在这个域,如果存在就人数+1,如果不存在,那么就将属性设置到Context域中 ...
zhong1232 发布于 2天前 阅读 154

Java8 HashMap源码分析

HashMap是基于hash表的map的实现,使用key-value形式存储键值对,并允许使用 null 值和 null 键,但是key只能有一个为null. Map不保证映射的顺序,其内部是根据hash值去模运算去排列的。HashMap内部使用entry数组作为存储的介质.
EumJi 发布于 3天前 阅读 348 评论 4 点赞 1

JVM你必须知道的那些事儿

一:写在前面 以前从不感觉jvm内部的这一块领域是必须掌握的知识点,大概了解一下就行,甚至可以说是只是知道一些概念化的东西,似乎跟我没有多大关系,但是随着工作年限的不断增加,发现在这件事情真是错了,特别是在当在乞丐环境下跑项目的时候,从代码优化到莫名其妙的错误排查,总归能找到这样那样的原因,回过头来想想,才发现,jvm这块真的很重要,很重要,很重要,重要的事情说三遍,但是依然哪天想起来总是没有好好的深入的去学习,好了伤疤忘了疼。。。。 如今跨入大数据开发领域,却发现调优这块工作无处不在,计算、分析、算法、模式等等似乎总是欠缺点什么东西,得,长痛不如短痛,下功夫深入的了解了一段时间,收货不少,很多东西也就想开了,记录一些核心的部分。 二:初识 不想上来就讲解jvm构成以及组成部分,百度一搜一大堆,没什么心意,先从实际的干饭说起,我们从第一天搞java开发,从来没有想过new了一个对象或者其他的东西后,需要我们手动去管理过他的内存空间释放,因为我们知道java有GC垃圾回收器这哥们的存在,他会帮我们处理好一切,这就好比我是皇帝,我想在哪建个行宫就在哪建,至于打扫战场的事儿,跟我没有关系,有总管专门去处理这件事情,...
寒冰蓝血 发布于 3天前 阅读 348 评论 1 打赏 1

分布式事务 TCC-Transaction 源码分析 —— 调试环境搭建

摘要: 原创出处 http://www.iocoder.cn/TCC-Transaction/build-debugging-environment/ 「芋道源码」欢迎转载,保留摘要,谢谢! **本文主要基于 TCC-Transaction 1.2.3.3 正式版** - [1. 依赖工具](http://www.iocoder.cn/TCC-Transaction/build-debugging-environment/) - [2. 源码拉取](http://www.iocoder.cn/TCC-Transaction/build-debugging-environment/) - [3. 初始化数据库](http://www.iocoder.cn/TCC-Transaction/build-debugging-environment/) - [4. 启动 capital 项目](http://www.iocoder.cn/TCC-Transaction/build-debugging-environment/) - [5. 启动 redpacket 项目](http://www.iocoder.cn/TCC-Transaction/build-debugging-environment/) - [6. 启动 order 项目](http://www.iocoder.cn/TCC-Transaction/build-debugging-environment/) - [666. 彩蛋](http://www.iocoder.cn/TCC-Transaction/build-debugging-environment/) ------- ![](https://user-gold-cdn.xitu.io/2018/1/20/161107247d2b37b4?w=750&h=330&f=jpeg&s=78520) > 🙂🙂🙂关注**微信公众号:【芋道源码】**有福利: > 1. RocketMQ / MyCAT / Sharding-JDBC **所有**源码分析文章列...
芋道源码 发布于 3天前 阅读 132

五年架构师讲述RESTful架构风格

在移动互联网的大潮下,随着docker等技术的兴起,『微服务』的概念也越来越被大家接受并应用于实践,日益增多的web service逐渐统一于RESTful 架构风格,如果开发者对RESTful 架构风格不甚了解,则开发出的所谓RESTful API总会貌合神离,不够规范。 本文是我对RESTful 架构风格的一些理解,和大家分享一下,如果有问题,欢迎讨论。   Outline 1. RESTful架构风格 1.1.1 资源 1.1.2 统一接口 1.1.3 URI 1.1.4 无状态 1.1 RESTful架构风格的特点 1.2 ROA、SOA、REST与RPC 1.3 本真REST与hybrid风格 2. 认证机制 2.1 Basic Auth 2.2 Token Auth 2.3 OAuth 3. 总结   1. RESTful架构风格 RESTful架构风格最初由Roy T. Fielding(HTTP/1.1协议专家组负责人)在其2000年的博士学位论文中提出。HTTP就是该架构风格的一个典型应用。从其诞生之日开始,它就因其可扩展性和简单性受到越来越多的架构师和开发者们的青睐。一方面,随着云计算和移动计算的兴起,许多企业愿意在互联网上共享自己的数据、功能;另一方面,在企业中,RESTful API(也称RESTful Web服务)也逐渐超越SOAP成为实现SOA的重要手段之一。时至今日,RESTful架构风格已成为企业级服务的标配。 REST即Representat...
Java架构分享 发布于 4天前 阅读 2630 评论 5 点赞 8

LeetCode 10. Regular Expression Matching

leetcode
YuKongA 发布于 4天前 阅读 21

 使用Java 8 Stream像操作SQL一样处理数据(下)

在[上一篇文章](https://my.oschina.net/liuyatao19921025/blog/1608232)中,我们介绍了Stream可以像操作数据库一样来操作集合,但是我们没有介绍**flatMap**和**collect**操作。这两种操作对实现复杂的查询是非常有用的。比如你可以结果`flatMap`和`collect`计算stream中的单词的字符数,像下面代码那样。 ``` java import static java.util.function.Function.identity; import static java.util.stream.Collectors.*; Stream words = Stream.of("Java", "Magazine", "is", "the", "best"); Map letterToCount =words.map(w -> w.split("")) .flatMap(Arrays::stream) .collect(groupingBy(identity(), counting())); ``` 上述代码的运行结果是: ``` java [a:4, b:1, e:3, g:1, h:1, i:2, ..] ``` 这篇文章将会介绍flatMap和collect这两种操作的更多细节。 # flatMap操作 假设你在一个文章中查找一个单词,你会怎么做? 我们可以使用`Files.lines()`方法,因为它可以返回一个文章一行一行信息组成的stream。我们可以使用`map()`把文章的每行分割是很多单词,最后,使用`distinct()``移除重复的。我们将想法转化为代码: ``` java Files.lines(Paths.get("stuff.txt")) ....
刘亚涛 发布于 5天前 阅读 505 评论 3 点赞 1

eclipse开发springboot配置文件没有语法提示了

eclipse开发springboot项目,打开 application.properties 和 application.yml,正常情况下,输入:`port` 会提示可选配置项: ![输入图片说明](https://static.oschina.net/uploads/img/201801/16121523_U8u8.png "在这里输入图片标题") 选择 `server.port=` 输入端口号即可。 ### 无法提示的问题 配置文件前天突然发现,没有语法提示了。 回想最近几天做了什么? 重装了jdk9.0.1; 在jdk1.8.144基础上安装了1.8.151,但没删除旧版本; 升级了eclipse oxygen为Photon,在此基础上通过maketplace安装了sts。 ### 问题排除 1. 删除jdk9.0.1,无效。 2. 删除1.8.144 无效。 3. 降eclipse版本,重装sts,无效。 4. 去sts官网github查找线索,发现有issue,提到同样的问题。但并没有官方人员确认。 怀疑sts新版本3.9.2的bug,尝试,卸载sts重装,没用。 卸载sts,通过update sites安装,解决了。 问题在于marketplace的软件包有问题。 properties文件的编辑器没有 `Spring properties files`,它的图标是一片叶子。 如果没有是一个白色图标,"properties files" ![输入图片说明](https://static.oschina.net/uploads/img/201801/16141742_esbb.png "在这里输入图片标题")...
polly 发布于 1周前 阅读 218 评论 2

使用 NPM 发布与维护 TypeScript 模块

本文介绍如何发布一个包到 npmjs.org,包括创建、发布、撤回、更新、使用分支等等,以及其中 包含的一些小技巧。
Fenying 发布于 1周前 阅读 90

Golang解决XORM的时区问题

如果你升级使用了较为新版`xorm`(如v0.6.3)和`go-sql-driver`(如v1.3)的go类库,那么你就可能会遇到时区问题。 如 ```go time.Parse("2006-01-02 15:04:05" ,"2018-01-15 12:11:12") // 2018-01-15T12:11:12+00:00 ``` 写入是数据库时候就会被改变为`2018-01-15T20:11:12+00:00`。 上述的就是时区问题,因为我们使用的是`东8时区`,默认会被设置为`0时区`,解决方案很简单,只需要在main函数中或者main包中初始化时区: ```go time.LoadLocation("Asia/Shanghai") ``` 数据库配置为 ``` root:root@tcp(127.0.0.1:3306)/test?charset=utf8&interpolateParams=true ``` xorm的初始化修改为: ```go orm, err := initOrm(ds, maxIdleConn, maxOpenConn, debug) if err != nil { return nil, err } r.Value = orm orm.DatabaseTZ = time.Local // 必须 orm.TZLocation = time.Local // 必须 orm.SetMaxIdleConns(maxIdleConn) orm.SetMaxOpenConns(maxOpenConn) ``` 字符串转换时间也需要改为 ```go time.ParseInLocation("2006-01-02 15:04:05" ,"2018-01-15 12:11:12",time.Local) ``` 此时写库时区问题就可以得到解决了,但是读库问题如下的的方式: ``` rss, err := this.Re...
梦朝思夕 发布于 1周前 阅读 104 点赞 1

Golang通过Goroutine+Channel指定同时下载的数量

What you are wasting today is tomorrow for those who died yesterday; what you hate now is the future you can not go back. 你所浪费的今天是昨天死去的人奢望的明天; 你所厌恶的现在是未来的你回不去的曾经。  今天发现某盘里有好多收藏的歌曲,于是想下载下来,20个链接,规定一次同时下载5个,就想用Golang下一个(别问为啥) 下载部分整理为库, 代码如下: package download import ( "strconv" "sync" "time" ) type Urls struct { Urls []string Wg sync.WaitGroup Chs chan int // 默认下载量 Ans chan bool // 每个进程的下载状态 } // 初始化下载地址 根据项目确认使用配置文件的方式还是其他方式,此处使用爬虫处理没公开 func (u *Urls) InitUrl(end chan bool) { for i := 0; i < 20; i++ { u.Urls = append(u.Urls, "https://studygolang.com/articles/2228") } end <- true } // 实际的下载操作 func downloadHandle(url string, b *bar.Bar) string { //需要根据下载内容作存储等处理 time.Sleep(3*time.Second) return "" } /** 每个线程的操作 url 下载地址 chs 默认下载量 ans 每个线程的下载状态 */ func (u *Ur...
90design 发布于 1周前 阅读 107

360五年消防猿为你解读Java多线程与并发模型之共享对象

互联网上充斥着对Java多线程编程的介绍,每篇文章都从不同的角度介绍并总结了该领域的内容。但大部分文章都没有说明多线程的实现本质,没能让开发者真正“过瘾”。 以下内容如无特殊说明均指代Java环境。 共享对象 使用Java编写线程安全的程序关键在于正确的使用共享对象,以及安全的对其进行访问管理。在第一章我们谈到Java的内置锁可以保障线程安全,对于其他的应用来说并发的安全性是在内置锁这个“黑盒子”内保障了线程变量使用的边界。谈到线程的边界问题,随之而来的是Java内存模型另外的一个重要的含义,可见性。Java对可见性提供的原生支持是volatile关键字。 volatile关键字 volatile 变量具备两种特性,其一是保证该变量对所有线程可见,这里的可见性指的是当一个线程修改了变量的值,那么新的值对于其他线程是可以立即获取的。其二 volatile 禁止了指令重排。 虽然 volatile 变量具有可见性和禁止指令重排序,但是并不能说 volatile 变量能确保并发安全。 public class VolatileTest {public static volatile int a = 0;public static final int THREAD_COUNT = 20;public static void increase() {a++;}public static void main(String[] args) throws Interr...
脱毛的程序猿 发布于 2周前 阅读 4741 评论 14 点赞 7

数据可视化(五)基于网络爬虫制作可视化图表

- 基于网络爬虫的可视化图表:golang,goquery - 案例:最近十年全国彩票销售变化情况 - 案例:中国科学院院士分布 - 数据可视化技术方案:基于 SVG (D3、Raphael)、基于 Canvas(Echarts)
RiboseYim 发布于 2周前 阅读 371

我的Python学习笔记(四):动态添加属性和方法

一、动态语言相关概念 1.1 动态语言 在运行时代码可以根据某些条件改变自身结构 可以在运行时引进新的函数、对象、甚至代码,可以删除已有的函数等其他结构上的变化 常见的动态语言:Object-C、C#、JavaScript、PHP、Python、Erlang 1.2 动态类型语言 在运行期间检查数据类型的语言 数据类型不是在编译阶段决定的,而是把类型绑定延后到了运行阶段 常见的动态类型语言:Python、Ruby、Erlang、JavaScript、swift、PHP、Perl 1.3 强类型语言 一旦一个变量被指定了某个数据类型,如果不经过强制类型转换,那么它就永远是这个数据类型 常见的强类型语言:Java、C#、Python、Object-C、Ruby Python是动态语言,动态类型语言,也是强类型语言。所以Python可以在运行时改变自身结构,动态添加/删除属性和方法。接下来将介绍Python如何动态添加属性和方法。   二、动态添加属性 2.1 添加对象属性 class Person(object): def __init__(self, newName, newAge): self.name = newName self.age = newAge zhangsan = Person("张三", 18) zhangsan.addr = "北京" # 类对象zhangsan动态添加对象属性addr print(zhangsan.name) # 张三 print(zhangsan.age...
Semonnn 发布于 2周前 阅读 225 评论 4 点赞 1 打赏 1

[雪峰磁针石博客] 使用pandas处理excel

pandas有强大的excel数据处理和导入处理功能,本文简单介绍pandas在csv和excel等格式方面处理的应用及绘制图表等功能。 pandas处理excel依赖xlutils, OpenPyXL, XlsxWriter等库。 python处理excel库的参考:https://github.com/xurongzhong/mobile_data 本文代码地址:https://github.com/xurongzhong/mobile_data/tree/master/pandas/excel_demo 本文最新版本地址:http://dwz.cn/7ig569 淘宝天猫可以把链接发给qq850766020,为你生成优惠券,降低你的购物成本! 快来领取支付宝跨年红包!1月1日起还有机会额外获得专享红包哦!复制此消息,打开最新版支付宝就能领取!2C56CV70sA 更多参考资料: https://www.dataquest.io/blog/excel-and-pandas/ Using Pandas to Read Large Excel Files in Python 中文 CSV 使用pandas读写csv pandas_parsing_and_write.py import pandas as pd input_file = r"supplier_data.csv" output_file = r"output_files\1output.csv" data_frame = pd.read_csv(input_file) print(data_frame) data_frame.to_csv(output_file, index=False) 当然也可以用python实现: 1csv_simple_parsing_and_write.py input_file = r"supplier_data.csv" o...
磁针石 发布于 9小时前 阅读 78

快速了解人工智能结晶之语音转换文字

科技解放生产力,人工智能的应用如今是大热,那么今天就来给各位介绍一下IBM在这方面的一个小的尝试,语音转换文字。咱们来看一看相较于传统的转换,结合Watson的IBM是如何做到让识别率飙升的。
IBM Bluemix

Java Money与Currency API浅谈

**一、概述** JSR 354 - “金钱和货币”解决了Java中货币和货币金额的标准化问题。 它的目标是为Java生态系统添加一个灵活的可扩展的API,并使货币量更简单,更安全。 JSR没有进入JDK 9,而是未来JDK版本的候选人。虽然在Java9有Currency类简单实现但是实际开发中满足不了需求 **二、引入** 在maven的pom.xml中做如下引入 org.javamoney moneta 最新版本 在gradle中 compile group: 'org.javamoney', name: 'moneta', version: '最新版本' 最新版本依赖,可以查看,[点击这里](https://mvnrepository.com/artifact/org.javamoney/moneta) **三、JSR-354功能** “货币和金钱”API的目标: 1.提供处理和计算货币金额的API 2.定义货币和货币金额的类别,以及货币四舍五入 3.处理汇率 4.处理货币和货币金额的格式化和解析 **四、API分析与使用** 1.规范中提到的类及接口都在javax.money.*包下面。 2.先从核心的两个接口CurrencyUnit与MonetaryAmount开始剖析 3.CurrencyUnit及MonetaryAmount CurrencyUnit 代表的是货币。它有点类似于现在的java.util.Currency类,不同之处在于它支持自定义的实现。从规范的定义来看,java.util.Currency也是可以实现该接口的。CurrencyUnit的实...
ville 发布于 7小时前 阅读 43

JAVA基础--QR_Code二维码生成

项目中我们经常会用到二维码,今天就来讲讲二维码的生成: 1, 二维码的概念:            二维条码/二维码(2-dimensional bar code)是用某种特定的集合图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的图形.(二维码的黑点代表二进制的1,空白代表二进制的0); 2, 一维码(条形码) 是由一组粗细不同,黑白(或彩色)相间的条,空及其相应的字符(数字字母)组成的标记,即传统条码. 3, 二维码分类:     二维码也有许多不同的码制,就码制的编码原理而言,通常分为三种类型:     (1), 线性堆叠式二维码;             编码原理: 建立在一维条形码基础之上,按需要堆积成两行或多行;     (2), 矩阵式二维码;            最常用的类型: 在一个矩形空间通过黑,白像素在矩阵中的不同分布进行编码. 在矩阵相应元素位置上,  用点(方点,圆点或其他形状)的出现表示二进制"1",点的不出现表示二进制的"0";     (3), 邮政码;            最少使用: 邮政码通过不同长度的条进行编码,主要用于邮件编码,如: POSTNET, BPO4-STATE. 4, 二维码的优缺点:     优点: (1), 高密度编码,信息容量大;              (2), 编码范围广...
ge洋 发布于 24小时前 阅读 24

smart-socket v1.3.0,不安分的搅局者

smart-socket自发布以来,得到了很多朋友的认可,同时也伴随着的不少的质疑。大部分的质疑是无实际论据支撑的,就是看你不爽,就是你想喷你的项目。对于这样的“朋友”,现在很高兴的通知你们,你们表现的机会又来了,smart-socket又来找骂了。 距离上个版本v1.2.0的发布差不多已经两个月了,这种发布节奏对于新生开源项目算是比较低效的(要多刷刷存在感,混个脸熟啊!!!)。但是本着慢工出精品的原则,过去的两个月smart-socket一直在打磨全新的功能。如果说v1.2.0之前的smart-socket标榜的是极简、易用、高性能的话,那么即将发布的v1.3.0版本又将为smart-socket加上一个新的标签:安全。 整整历时两个月,smart-socket终于支持TLS/SSL通信了。因为工作关系无法全身心投入学习、研究这方面的技术,一直断断续续的用了个把月时间才把SSLEngine消化的差不多,之后又花了个把月时间把TLS/SSL功能接入smart-socket。期间也借鉴了一些优质的开源项目,例如:`https://github.com/alkarn/sslengine.example`(很适合初学者)。支持TLS/SSL对于smart-socket来说是里程碑式的进步,以后若有朋友在犹豫选择Netty还是Mina解决业务问题时,我们可以更有底气的向其推介:考虑一下s...
三刀蜀黍 发布于 6小时前 阅读 18 评论 3

spring工作原理

1、spring原理        内部最核心的就是IOC了,动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射,反射其实就是在运行时动态的去创建、调用对象,Spring就是在运行时,跟xml Spring的配置文件来动态的创建对象,和调用对象里的方法的 。         Spring还有一个核心就是AOP这个就是面向切面编程,可以为某一类对象 进行监督和控制(也就是 在调用这类对象的具体方法的前后去调用你指定的 模块)从而达到对一个模块扩充的功能。这些都是通过  配置类达到的。         Spring目的:就是让对象与对象(模块与模块)之间的关系没有通过代码来关联,都是通过配置类说明管理的(Spring根据这些配置 内部通过反射去动态的组装对象)         要记住:Spring是一个容器,凡是在容器里的对象才会有Spring所提供的这些服务和功能。   Spring里用的最经典的一个设计模式就是:模板方法模式。(这里我都不介绍了,是一个很常用的设计模式), Spring里的配置是很多的,很难都记住,但是Spring里的精华也无非就是以上的两点,把以上两点跟理解了 也就基本上掌握了Spring. Spring AOP与IOC 一、 IoC(Inversion of control): 控...
Idea 发布于 1天前 阅读 13

IT懒开发【精】

懒——休息,我们要在社会上掀起的风浪,这样,星星之火必成燎原之势,进而绽放人类的光。
边鹏_尛爺鑫 发布于 5小时前 阅读 12

python爬虫之模拟登录

用账号密码模拟登录小红书平台
Nekyo 发布于 3小时前 阅读 11

Python 学习总结(三):巧用各类模块,方便维护

python,模块
海岸线的曙光 发布于 10小时前 阅读 8

【转】Python协程:从yield/send到async/await

Python协程:从yield/send到async/await http://python.jobbole.com/86069/
袁一刀 发布于 5小时前 阅读 7

VS头部注释

C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\ItemTemplatesCache\CSharp\Code\2052\Class using System; using System.Collections.Generic; $if$ ($targetframeworkversion$ >= 3.5)using System.Linq; $endif$using System.Text; $if$ ($targetframeworkversion$ >= 4.5)using System.Threading.Tasks; $endif$ namespace $rootnamespace$ { /// /// 版 本:v1.0 /// 创建人:Rex /// 日 期:$time$ /// 描 述: /// public class $safeitemrootname$ { } }
笑丶笑 发布于 13小时前 阅读 6

GPS 经纬度转换 百度、高德经纬度

package com.ldygo.gw.gpsobd.utils; public class ECGeoCoordinateTransformUtil { static double x_pi = 3.14159265358979324 * 3000.0 / 180.0; // π static double pi = 3.1415926535897932384626; // 长半轴 static double a = 6378245.0; // 扁率 static double ee = 0.00669342162296594323; /** * 百度坐标系(BD-09)转WGS坐标 * * @param lng * 百度坐标纬度 * @param lat * 百度坐标经度 * @return WGS84坐标数组 */ public static double[] bd09towgs84(double lng, double lat) { double[] gcj = bd09togcj02(lng, lat); double[] wgs84 = gcj02towgs84(gcj[0], gcj[1]); return wgs84; } /** * WGS坐标转百度坐标系(BD-09) * * @param lng * WGS84坐标系的经度 * @param lat * WGS84坐标系的纬度 * @return 百度坐标数组 */ public static double[] wgs84tobd09(double lng, double lat) { double[] gcj = wgs84togcj02(lng, lat); double[] bd09 = gcj02tobd09(gcj[0], gcj[1]); return bd09; } /** * 火星坐标系(GCJ-02)转百度坐标系(BD...
xiaoye08050141 发布于 13小时前 阅读 6

Python之多线程爬虫抓取网页图片

目标 嗯,我们知道搜索或浏览网站时会有很多精美、漂亮的图片。 我们下载的时候,得鼠标一个个下载,而且还翻页。 那么,有没有一种方法,可以使用非人工方式自动识别并下载图片。美美哒。 那么请使用python语言,构建一个抓取和下载网页图片的爬虫。 当然为了提高效率,我们同时采用多线程并行方式。 思路分析 Python有很多的第三方库,可以帮助我们实现各种各样的功能。问题在于,我们弄清楚我们需要什么: 1)http请求库,根据网站地址可以获取网页源代码。甚至可以下载图片写入磁盘。 2)解析网页源代码,识别图片连接地址。比如正则表达式,或者简易的第三方库。 3)支持构建多线程或线程池。 4)如果可能,需要伪造成浏览器,或绕过网站校验。(嗯,网站有可能会防着爬虫 ;-)) 5)如果可能,也需要自动创建目录,随机数、日期时间等相关内容。 如此,我们开始搞事情。O(∩_∩)O~ 环境配置 操作系统:windows 或 linux 皆可 Python版本:Python3.6 ( not Python 2.x 哦) 第三方库 urllib.request threading 或者 concurrent.futures 多线程或线程池(python3.2+) re 正则表达式内置模块 os 操作系统内置模块 编码过程 我们分解一下过程。完整源代码在博文最终提供。...
斯武丶风晴 发布于 2周前 阅读 179 评论 2

浅谈云计算和虚拟化的区别

虚拟化和云计算并非一回事。它们要解决的是不同维度的IT问题,而且对企业会产生不同层面的影响,导致不同的发展前景。 虚拟化 简要言之,在IT环境中,虚拟化是要“隔离”计算资源,如此一来,某个层上的一个对象(如一个应用,一个任务,一个组件)就可以不考虑该层之下的其他变化而独立操作。对虚拟化做详尽的探讨超出了本文的范围。然而,还是让我们解释一些术语,虚拟化和“隔离”常常因为某些特殊原因而被选用,其实在“虚拟化”和“仿真”、“隔离”和“重定向”之间是存在技术差异的。虚拟化隔离了各种计算资源,因此也就提供了重新分配与整合被隔离资源的机会,以便更好、更高效地利用这些资源。 云计算 而另一方面,云计算则是一种让各种资源按需取用的能力。一般而言,我们指望从云计算获得什么,有很多种答案。而美国国家标准与技术研究院(NIST)给出的云计算定义概括出了基本特征、如何交付,以及何种部署模式才算得上是云计算等等。我则进一步简化了这一定义,提供了一种更直接、更简单的方法来描述云计算,下面就是我用5-3-2原理对云计算所做的图说。 云计算和虚拟化的明显差异 虚拟化和云计算截然相反,它不是建立在5-3-2原理之上的。例如自服务模式就不是虚...
小欣妹妹 发布于 10小时前 阅读 5

Golang FlameGraph(火焰图)

介绍Golang FrameGraph(火焰图)的安装和基本的使用方法,最后总结了一下近期学习go过程中积累的一些经验
城寒 发布于 3个月前 阅读 299 评论 5 点赞 1

jvm调优总结(3)-jvm垃圾回收原理

jvm垃圾回收原理 在jvm中堆空间划分为三个代:年轻代(Young Generation)、年老代(Old Generation)和永久代(Permanent Generation)。年轻代和年老代是存储动态产生的对象。永久带主要是存储的是java的类信息,包括解析得到的方法、属性、字段等等。永久带基本 不参与垃圾回收。我们这里讨论的垃圾回收主要是针对年轻代和年老代。具体如下图。 年轻代又分成3个部分,一个eden区和两个相同的survior区。刚开始创建的对象都是放置在eden区的。分成这样3个部分,主要是为了生命 周期短的对象尽量留在年轻代。当eden区申请不到空间的时候,进行minorGC,把存活的对象拷贝到survior。年老代主要存放生命周期比较长的 对象,比如缓存对象。具体jvm内存回收过程描述如下(可以结合上图): 1、对象在Eden区完成内存分配 2、当Eden区满了,再创建对象,会因为申请不到空间,触发minorGC,进行young(eden+1survivor)区的垃圾回收 3、minorGC时,Eden不能被回收的对象被放入到空的survivor(Eden肯定会被清空),另一个survivor里不能被GC回收的对象也会被放入这个survivor,始终保证一个survivor是空的 4、当做第3步的时候,如果发现survivor满了,则这些对象被copy到old区,或者...
Idea 发布于 8小时前 阅读 5

Spring properties定义bean

Spring提供了丰富的标签和注解来进行bean的定义,除此之外框架来提供了扩展机制让使用可以通过properties来定义bean,与强大的标签式和注解式的bean定义相比,properties提供的规则要简单许多。 key部分用.分隔即通过A.B来进行相关的属性定义,其中A表示bean名称,B通过不同的值还表达不同的含义:   (class),bean的类型 (parent),bean的父bean name,bean的name属性,name是一个普通属性 childBean(ref),bean的childBean属性,childBean是一个引用属性 (singleton),是否单例 (lazy-init),是否懒加载 $0,第一个构造子参数 (scope),作用域 (abstract),是否是抽象bean   看一个例子: bean.properties文件   [java] view plain copy #bean1   propBean.(class) = spring.beans.properties.PropBean   propBean.(parent) = commonBean   propBean.name = name1   propBean.childBean(ref) = childBean   propBean.(singleton) = true   propBean.(lazy-init) = true      #bean2   childBean.(class) = spring.beans.properties.ChildBean   childBean.$0 = cid1   chlldBean.(scope) = singleton      #abstract ...
xiaomin0322 发布于 1天前 阅读 4

Java项目转web项目

Java项目转web项目,找到.project文件,粘贴
没钱不任性 发布于 6小时前 阅读 4

银行家算法回顾[JAVA实现]

分析了一下银行家算法,基于银行家算法做了一个小程序. 银行家算法主要用于操作系统进程管理程序中,用于防止死锁. 接下来这段代码将模拟这一过程. 首先让我们知道银行家算法在进程资源分配中主要做什么:     进程管理系统掌控着操作系统的一切资源.几乎每个进程都要向操作系统索要资源.但是系统的资源又有限.试想:     当操作系统掌握A,B资源,有进程P1,P2,同一时刻,P1和P2都向操作系统索取AB两个资源,而操作系统却把A分给了P1,B分给了P2,这个时候P1和P2只占有一半资源,如果它们不释放,那么这两个进程就会进入死锁状态,在系统中无休止地请求资源. 为了解决这种问题,银行家算法被应用到进程管理系统中,值得注意的是,之所以叫做银行家算法,是因为这个算法最早被应用于银行向客户贷款的案例中,银行需要分析贷款是否安全,即一段时间内满足所有客户.   算法主要过程如下: 1.数据结构     Max矩阵,行号表示进程,列号表示进程所需的最大资源数目.     Allocation矩阵,行号表示进程号,列表示已经分配给进程的资源.     Need矩阵,表示仍然需要的资源数.Need由Max - Allocation得到.     Available向量,用于表示当前系统中可分配的资源.初始化为OS所有可分配资源. 以上数据...
阮少爷 发布于 2个月前 阅读 29

JVM调优总结(2):一些概念(下)

Java对象的大小 基本数据的类型的大小是固定的,这里就不多说了。对于非基本类型的Java对象,其大小就值得商榷。 在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没有任何属性的对象的大小。看下面语句: Object ob = new Object(); 有了Object对象的大小,我们就可以计算其他对象的大小了。这样在程序中完成了一个Java对象的生命,但是它所占的空间为:4byte+8byte。4byte是上面部分所说的Java栈中保存引用的所需要的空间。而那8byte则是Java堆中对象的信息。因为所有的Java非基本类型的对象都需要默认继承Object对象,因此不论什么样的Java对象,其大小都必须是大于8byte。 Class NewObject {     int count;     boolean flag;     Object ob; } 这里需要注意一下基本类型的包装类型的大小。因为这种包装类型已经成为对象了,因此需要把他们作为对象来看待。包装类型的大小至少是12byte(声明一个空Object至少需要的空间),而且12byte没有包含任何有效信息,同时,因为Java对象大小是8的整数倍,因此一个基本类型包装类的大小至少是16byte。这个内存占用是很恐怖的,它是使用基本类型的N倍(N>2),有些类型的内存占用更是夸张(随...
Idea 发布于 9小时前 阅读 4

C语言用static修饰函数的作用与原理

### static可以用来限制函数的可见性 ``` // static.c static void func(){} ``` 被static修饰的func函数只能在static.c这个文件内被访问,在其他文件内则无法访问此函数,否则会造成 undefined reference(找不到函数定义)错误。 ``` //static.h int add(const int a, const int b); //static.c static /* 当外部访问此函数会出现 undefined reference to 'add' */ int add(const int a, const int b) { return a + b; } // main.c #include "static.h" #include "stdio.h" int main() { printf("sum is %d\n", add(10, 20)); return 0; } // gcc main.c static.c -o main // main.c:(.text+0xf): undefined reference to `add' ``` ### 通过static来避免命名冲突 1. 明确**头文件**(.h)与**源文件**(.c)的区别: 在C语言中头文件提供**符号**的申明,源文件则提供**符号**的定义。 **这里的符号包含函数名和变量名等**。 2. 从C源代码到可执行程序需要经历两个步骤: 编译:将源文件翻译成二进制的目标文件.o(bj) 链接:将各个目标文件链接成一个可执行程序 3. 在编译时如果遇到未知的符号,则会到各个头文件中去查找符号的定义,找不到就会报错。然后根据相应的词法语法...
tigerBin 发布于 15小时前 阅读 4

Java递归拷贝文件夹

### 拷贝文件或文件夹 ``` /** * 拷贝文件 * * @param source 源文件 * @param target 目标文件 */ public void copyFile(String source, String target) { // 源文件 File sourceFile = new File(source); if (!sourceFile.exists()) { return; } // 目标文件 File targetFile = new File(target); // 文件拷贝 if (sourceFile.isFile()) { copyFromChanel(sourceFile, targetFile); return; } // 文件夹拷贝 if (!targetFile.exists()) { targetFile.mkdirs(); } for (File file: sourceFile.listFiles()) { copyFile(file.getAbsolutePath(), target + File.separator + file.getName()); } } ``` ### 利用文件管道拷贝文件 ``` /** * 利用文件管道拷贝文件 * * @param source 源文件 * @param target 目标文件 */ public void copyFromChanel(File source, File target) { // 文件流 FileInputStream fis = null; FileOutputStream fos = null; // 文件管道 FileChannel fci = null; FileChannel fco = null; try { // 文件流 fis = new FileInputStream(source); fos = new FileOutputStream(target); // 文件管道 fci = fis.getChannel(); fco = fos.getChannel(); ...
tianshl 发布于 1个月前 阅读 259938 点赞 1

快速了解人工智能结晶之语音转换文字

科技解放生产力,人工智能的应用如今是大热,那么今天就来给各位介绍一下IBM在这方面的一个小的尝试,语音转换文字。咱们来看一看相较于传统的转换,结合Watson的IBM是如何做到让识别率飙升的。
IBM Bluemix

JavaScript指定长度和进制的UUID

### 指定长度和进制的UUID ``` /** * 指定长度和进制的UUID * @param len 长度 * @param radix 进制 * @returns {string} */ function uuid(len, radix) { var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split(''); var uuid = [], i; radix = radix || chars.length; if (len) { for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix]; } else { var r; uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'; uuid[14] = '4'; for (i = 0; i < 36; i++) { if (!uuid[i]) { r = 0 | Math.random()*16; uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r]; } } } return uuid.join(''); } ``` ### 测试 ``` uuid(32, 2) "11110011000001100111011111001111" uuid(32, 8) "31730315503322654076326054034634" uuid(32, 10) "50235847867589708943975575132412" uuid(32, 16) "405F8CA9918F71FC9C73DACB47CEC6EE" ```...
tianshl 发布于 2个月前 阅读 326725

Java实现的k-means聚类算法

### 需求 ``` 对MySQL数据库中某个表的某个字段执行k-means算法,将处理后的数据写入新表中。 ``` ### 源码及驱动 ``` http://download.csdn.net/download/xiaobuding007/10203673 ``` ### 源码 ```java import java.sql.*; import java.util.*; /** * @author tianshl * @version 2018/1/13 上午11:13 */ public class Kmeans { // 源数据 private List origins = new ArrayList<>(); // 分组数据 private Map> grouped; // 初始质心列表 private List cores; // 数据源 private String tableName; private String colName; /** * 构造方法 * * @param tableName 源数据表名称 * @param colName 源数据列名称 * @param cores 质心列表 */ private Kmeans(String tableName, String colName,List cores){ this.cores = cores; this.tableName = tableName; this.colName = colName; } /** * 重新计算质心 * * @return 新的质心列表 */ private List newCores(){ List newCores = new ArrayList<>(); for(List v: grouped.values()){ newCores.add(v.stream().reduce(0, (sum, num) -> sum + num) / (v.size() + 0.0)); } Collections.sort(newCores); return newCores; } /...
tianshl 发布于 1周前 阅读 35974

Python随机生成手机号

### 依据 ``` 根据2017年10月份最新的手机号正则进行编码, 正则如下: (13\d|14[579]|15[^4\D]|17[^49\D]|18\d)\d{8} ``` ### 代码 ``` # -*- coding: utf-8 -*- import random def create_phone(): # 第二位数字 second = [3, 4, 5, 7, 8][random.randint(0, 4)] # 第三位数字 third = { 3: random.randint(0, 9), 4: [5, 7, 9][random.randint(0, 2)], 5: [i for i in range(10) if i != 4][random.randint(0, 8)], 7: [i for i in range(10) if i not in [4, 9]][random.randint(0, 7)], 8: random.randint(0, 9), }[second] # 最后八位数字 suffix = random.randint(9999999,100000000) # 拼接手机号 return "1{}{}{}".format(second, third, suffix) # 生成手机号 phone = create_phone() print(phone) ``` ### 运行结果 ``` 13937342780 15835720604 14589505530 ... ``` ### 验证 (使用正则验证) ``` # -*- coding: utf-8 -*- import random import re def create_phone(): # 第二位数字 second = [3, 4, 5, 7, 8][random.randint(0, 4)] # 第三位数字 third = { 3: random.randint(0, 9), 4: [5, 7, 9][random.randint(0, 2)], 5: [i for i in range(10) if i != ...
tianshl 发布于 2个月前 阅读 285690 评论 1

java递归删除文件或文件夹

```java /** * 递归删除文件或文件夹 * * @param file 文件或文件夹 */ public void delFile(File file) { if (!file.exists()) { return; } if (file.isFile()){ // 文件: 直接删除 file.delete(); } else if (file.isDirectory()) { // 文件夹 // 1. 删除子文件 for (File f: file.listFiles()){ delFile(f); } // 2. 删除文件夹 file.delete(); } } ```
tianshl 发布于 2个月前 阅读 460497 点赞 3

javacsv读写csv文件

### 添加依赖 ``` net.sourceforge.javacsv javacsv 2.0 ``` ### 读文件 ``` CsvReader reader = null; String row; String path = "./tmp/read.csv"; try { reader = new CsvReader(path, ',', Charset.forName("GBK")); // 跳过表头(需要表头就不用跳过) reader.readHeaders(); while (reader.readRecord()) { // 读取每行数据 row = reader.getValues(); System.out.println(row); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (reader != null) { reader.close(); } } catch (Exception e) { e.printStackTrace(); } ``` ### 写文件 ``` CsvWriter csvWriter = null; String path = "./tmp/write.csv"; try { csvWriter =new CsvWriter(path,',', Charset.forName("GBK")); // 写入一行数据 csvWriter.writeRecord(new String[]{"张三", 18, "男"}); } catch (Exception e) { e.printStackTrace(); } finally { try { if (csvWriter != null) { csvWriter.close(); } } catch (Exception e) { e.printStackTrace(); } } ``` ### 备注 ##### 参考文档 [JavaCSV API](http://javacsv.sourceforge.net/) ``` http://javacsv.sourceforge.net/ `...
tianshl 发布于 2个月前 阅读 461287 评论 1 点赞 1

Java8 HashMap源码分析

HashMap是基于hash表的map的实现,使用key-value形式存储键值对,并允许使用 null 值和 null 键,但是key只能有一个为null. Map不保证映射的顺序,其内部是根据hash值去模运算去排列的。HashMap内部使用entry数组作为存储的介质.
EumJi 发布于 3天前 阅读 348 评论 4 点赞 1

JVM你必须知道的那些事儿

一:写在前面 以前从不感觉jvm内部的这一块领域是必须掌握的知识点,大概了解一下就行,甚至可以说是只是知道一些概念化的东西,似乎跟我没有多大关系,但是随着工作年限的不断增加,发现在这件事情真是错了,特别是在当在乞丐环境下跑项目的时候,从代码优化到莫名其妙的错误排查,总归能找到这样那样的原因,回过头来想想,才发现,jvm这块真的很重要,很重要,很重要,重要的事情说三遍,但是依然哪天想起来总是没有好好的深入的去学习,好了伤疤忘了疼。。。。 如今跨入大数据开发领域,却发现调优这块工作无处不在,计算、分析、算法、模式等等似乎总是欠缺点什么东西,得,长痛不如短痛,下功夫深入的了解了一段时间,收货不少,很多东西也就想开了,记录一些核心的部分。 二:初识 不想上来就讲解jvm构成以及组成部分,百度一搜一大堆,没什么心意,先从实际的干饭说起,我们从第一天搞java开发,从来没有想过new了一个对象或者其他的东西后,需要我们手动去管理过他的内存空间释放,因为我们知道java有GC垃圾回收器这哥们的存在,他会帮我们处理好一切,这就好比我是皇帝,我想在哪建个行宫就在哪建,至于打扫战场的事儿,跟我没有关系,有总管专门去处理这件事情,...
寒冰蓝血 发布于 3天前 阅读 348 评论 1 打赏 1

Java编程思想学习录(连载之:内部类)

![Thinkpad 25 Anniversary](http://upload-images.jianshu.io/upload_images/9824247-0fb7bdff80a77326.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 用thinkpad打字确实很爽啊! --- ## 内部类基本概念 - 可将一个类的定义置于另一个类定义的内部 - 内部类允许将逻辑相关的类组织在一起,并控制位于内部的类的可见性 - 甚至可将内部类定义于一个**方法**或者**任意作用域**内! - 当然,内部类 ≠ 组合 - 内部类拥有其外围类 所有元素的 访问权 - 更有甚,嵌套多层的内部类能透明地访问所有它所嵌入的外围类的所有成员 一个典型的例子:利用 **Java内部类** 实现的 **迭代器模式** ``` // 接口 ------------------------------------------------------------- public interface Selector { boolean end(); Object current(); void next(); } // 外部类(集合类) + 内部类(迭代器类) ------------------------------------------------------------- public class Sequence { // 外部类(代表一个集合类) private Object[] items; private int next = 0; public Sequence( int size ) { items = new Object[size]; } public void add( Object x ) { if...
hansonwang 发布于 2天前 阅读 259 评论 2 点赞 1

Django开发环境

### 1.虚拟环境 ``` tianshl:workspace tianshl$ mkdir server tianshl:workspace tianshl$ cd server/ tianshl:server tianshl$ virtualenv venv --python=python3 tianshl:server tianshl$ source venv/bin/activate ``` ### 2. 安装依赖 ``` (venv) tianshl:server tianshl$ pip install django (venv) tianshl:server tianshl$ pip install djangorestframework ``` ### 3. 创建项目 ``` (venv) tianshl:server tianshl$ django-admin.py startproject server (venv) tianshl:server tianshl$ tree server/ server ├── manage.py └── server ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py ``` ### 4. 更新配置 ``` (venv) tianshl:server tianshl$ cd server/ (venv) tianshl:server tianshl$ vim server/settings.py # 1.修改 INSTALLED_APPS = ( ... 'rest_framework', ) # 2.添加 REST_FRAMEWORK = { # Use Django's standard `django.contrib.auth` permissions, # or allow read-only access for unauthenticated users. 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly' ] }...
tianshl 发布于 1天前 阅读 559

分布式事务 TCC-Transaction 源码分析 —— 调试环境搭建

摘要: 原创出处 http://www.iocoder.cn/TCC-Transaction/build-debugging-environment/ 「芋道源码」欢迎转载,保留摘要,谢谢! **本文主要基于 TCC-Transaction 1.2.3.3 正式版** - [1. 依赖工具](http://www.iocoder.cn/TCC-Transaction/build-debugging-environment/) - [2. 源码拉取](http://www.iocoder.cn/TCC-Transaction/build-debugging-environment/) - [3. 初始化数据库](http://www.iocoder.cn/TCC-Transaction/build-debugging-environment/) - [4. 启动 capital 项目](http://www.iocoder.cn/TCC-Transaction/build-debugging-environment/) - [5. 启动 redpacket 项目](http://www.iocoder.cn/TCC-Transaction/build-debugging-environment/) - [6. 启动 order 项目](http://www.iocoder.cn/TCC-Transaction/build-debugging-environment/) - [666. 彩蛋](http://www.iocoder.cn/TCC-Transaction/build-debugging-environment/) ------- ![](https://user-gold-cdn.xitu.io/2018/1/20/161107247d2b37b4?w=750&h=330&f=jpeg&s=78520) > 🙂🙂🙂关注**微信公众号:【芋道源码】**有福利: > 1. RocketMQ / MyCAT / Sharding-JDBC **所有**源码分析文章列...
芋道源码 发布于 3天前 阅读 132

《疯狂工作流讲义(Activiti6.x)》教学视频

工作流 Activiti6 视频
杨大仙的程序空间 发布于 2个月前 阅读 864 评论 3

Java中的多线程你只要看这一篇就够了

引 如果对什么是线程、什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内。 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现。说这个话其实只有一半对,因为反应“多角色”的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法模拟,当然也没法说能用单线程来实现:比如最常见的“生产者,消费者模型”。 很多人都对其中的一些概念不够明确,如同步、并发等等,让我们先建立一个数据字典,以免产生误会。 多线程:指的是这个程序(一个进程)运行时产生了不止一个线程 并行与并发: 并行:多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时。 并发:通过cpu调度算法,让用户看上去同时执行,实际上从cpu操作层面不是真正的同时。并发往往在场景中有公用的资源,那么针对这个公用的资源往往产生瓶颈,我们会用TPS或者QPS来反应这个系统的处理能力。 并发与并行 线程安全:经常用来描绘一段代码。指在并发的情况之下,该代码经过多线程使用,线程的调度顺序不影响任何结果。这个时候使用多线程,我们只需要关注系统的内存,cpu是不是够用即可。反过来,线程不安全就意味着线程的调...
dotleo 发布于 1个月前 阅读 52

 使用Java 8 Stream像操作SQL一样处理数据(下)

在[上一篇文章](https://my.oschina.net/liuyatao19921025/blog/1608232)中,我们介绍了Stream可以像操作数据库一样来操作集合,但是我们没有介绍**flatMap**和**collect**操作。这两种操作对实现复杂的查询是非常有用的。比如你可以结果`flatMap`和`collect`计算stream中的单词的字符数,像下面代码那样。 ``` java import static java.util.function.Function.identity; import static java.util.stream.Collectors.*; Stream words = Stream.of("Java", "Magazine", "is", "the", "best"); Map letterToCount =words.map(w -> w.split("")) .flatMap(Arrays::stream) .collect(groupingBy(identity(), counting())); ``` 上述代码的运行结果是: ``` java [a:4, b:1, e:3, g:1, h:1, i:2, ..] ``` 这篇文章将会介绍flatMap和collect这两种操作的更多细节。 # flatMap操作 假设你在一个文章中查找一个单词,你会怎么做? 我们可以使用`Files.lines()`方法,因为它可以返回一个文章一行一行信息组成的stream。我们可以使用`map()`把文章的每行分割是很多单词,最后,使用`distinct()``移除重复的。我们将想法转化为代码: ``` java Files.lines(Paths.get("stuff.txt")) ....
刘亚涛 发布于 5天前 阅读 505 评论 3 点赞 1

谈谈ali与Google的Java开发规范

  无规矩不成方圆,编码规范就如同协议,有了Http、TCP等各种协议,计算机之间才能有效地通信,同样的,有了一致的编码规范,程序员之间才能有效地合作。道理大家都懂,可现实中的我们,经常一边吐槽别人的代码,一边写着被吐槽的代码,究其根本,就是缺乏遵从编码规范的意识!多年前,Google发布`Google Java Style`来定义Java编码时应遵循的规范;今年年初阿里则发布`阿里巴巴Java 开发手册`,并随后迭代了多个版本,直至9月份又发布了pdf终极版。这两大互联网巨头的初衷,都是希望能够统一标准,使业界编码达到一致性,提升沟通和研发效率,这对于我们码农无疑是很赞的一笔福利呀。笔者将两份规范都通读了一遍,其中列举的不少细则跟平时的编码习惯基本是符合的,不过还是有不少新奇的收获,忍不住记录在此,供日后念念不忘~ # Java开发规范总览 ## 一、Google Java Style   Google的java开发规范主要分为6大部分:源文件基本规范、源文件结构、代码格式、命名、编程实践和Javadoc,各部分概要如下: >1、源文件基本规范(source file basics):文件名、文件编码、特殊字符的规范要求 >2、源文件结构(source file structure):版权许可信息、package、import、类...
sherlockyb 发布于 2周前 阅读 5217 评论 29 点赞 20

源码级别解读 mybatis 插件

简介: MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。 摘自官网。。 为什么要使用mybatis,相信看这篇文章的童鞋都有所了解,俺这里就多废话几句。在orm框架中,有轻量级的dbutils与mybatis,重量级的有hibernate。 为什么要选择mybatis呢?原因如下: 1.简单,这个无需我多废话。肯定的啊,使用过的童鞋都知道,在dao层定义一个接口,然后定义一个对应的xml(xml中namespace的值对应接口的全限定名就ok。因为mybatis是通过namespaceid去和接口类进行映射,然后使用动态代理创建接口类的实例方法,参见动态代理).   2.结果集映射,我认为这是mybatis做的最牛的一点,也是选择他最大的一个理由 3.完善的缓存机制(mybatis有1级缓存和2级缓存),1级缓存是基于会话的(Session),2级缓存是基于应用级别。这里不做过多阐述,有兴趣的可以参考文章 http://www.iteye.com/topic/1112327/ 4.强大的插件机制。它可以在运行过程中动态...
Autorun 发布于 3周前 阅读 2386 评论 6 点赞 6 打赏 2

java中 数组排序,集合排序

一、数组排序   //对数组排序 public void arraySort(){ int[] arr = {1,4,6,333,8,2}; Arrays.sort(arr);//使用java.util.Arrays对象的sort方法 for(int i=0;i<arr.length;i++){ System.out.println(arr[i]); } } 二、集合排序 public void sort(){ List<String> list=new ArrayList<String>(); list.add("5sss"); list.add("我爱你"); list.add("53a"); list.add("51"); list.add("15"); list.add("25"); list.add("35"); Collections.sort(list); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } } sort() 方法默认是升序的。如果要降序 第一种 就是重写方法我 觉得这种太蠢了!不描述  百度搜索sort()降序会出来一大堆。 第二种: public void sort(){ List<String> list=new ArrayList<String>(); list.add("5sss"); list.add("我爱你"); list.add("53a"); list.add("51"); list.add("15"); list.add("25"); list.add("35"); Collections.sort(list); for (int i = list.size()-1; i >=0; i--) { System.out.println(list.get(i)); } } 面试中如果需要...
一个橙子HHH 发布于 2天前 阅读 19

2017全年Java书单整理

希望书单能在你想要进一步打怪升级的路上,给予些许帮助 建议先收藏本书单,认真啃完一本再买下一本,扎实走完每一步 部分书籍关联相关博客和微信公众号,让你更嗨皮 如果对你略有帮助,烦请分享给你的基友 与君共勉,若有合适的书籍,请一定告诉我,谢谢 分类困难因而没分。大体顺序,编程开发 => 数据库 => 架构运维 => 算法 拒绝盗版,从你我做起 书籍列表 《Effective Java 中文版》 豆瓣评分:9.1【1235 人评价】 推荐理由:本书介绍了在Java编程中78条极具实用价值的经验规则,这些经验规则涵盖了大多数开发人员每天所面临的问题的解决方案。 友情提示:同推荐《重构 : 改善既有代码的设计》、《代码整洁之道》、《代码大全》,有一定的内容重叠。 《Spring揭秘》 豆瓣评分:9.0 【162 人评价】 推荐理由:Spring 使用者不得不读! 推荐博客:Spring4All社区 推荐公众号:Spring4All社区 《SpringBoot揭秘》 豆瓣评分:6.8 【44 人评价】 推荐理由:《Spring揭秘》相同作者。SpringBoot 入门书籍。 作者博客:扶墙老师说:一个架构士的思考与沉淀 作者公众号:扶墙老师说 《MyBatis技术内幕》 豆瓣评分:暂无 推荐理由:以MyBatis 3.4为基础,针对MyBatis的架构设计和...
Java团长 发布于 2周前 阅读 832 评论 10 点赞 3

go语言中操作mysql的方法

一、需要下载指定的golang的mysql驱动包 $ go get github.com/go-sql-driver/mysql 二、建库 -- -- 表的结构 `test` -- CREATE TABLE `test` ( `id` int(11) DEFAULT NULL, `name` varchar(10) NOT NULL, `price` int(11) NOT NULL DEFAULT '0' ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 三、例子testsql.go: package main; import ( "database/sql" _ "github.com/go-sql-driver/mysql" "fmt" ) func main() { //打开数据库 //DSN数据源字符串:用户名:密码@协议(地址:端口)/数据库?参数=参数值 db, err := sql.Open("mysql", "mymotif:wxwpxh@tcp(127.0.0.1:3306)/test?charset=utf8"); if err != nil { fmt.Println(err); } //关闭数据库,db会被多个goroutine共享,可以不调用 defer db.Close(); //查询数据,指定字段名,返回sql.Rows结果集 rows, _ := db.Query("select id,name from test"); id := 0; name := ""; for rows.Next() { rows.Scan(&id, &name); fmt.Println(id, name); } //查询数据,取所有字段 rows2, _ := db.Query("select * fro...
wangxuwei 发布于 2天前 阅读 17

基于 Spring Cloud 完整的微服务架构实战

本项目是一个基于 Spring Boot、Spring Cloud、Spring Oauth2 和 Spring Cloud Netflix 等框架构建的微服务项目。
鹏磊 发布于 1个月前 阅读 965 评论 9 点赞 4

Spring Security OAuth2整合JWT

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准([RFC 7519](https://tools.ietf.org/html/rfc7519)).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
修改个人信息 发布于 12分钟前

iota和<<左移>>右移的用法

    在go语言中iota比较特殊,是一个被编译器修改的常量,在每一个const关键字出现时被重置为0,然后在下一个const出现之前,每出现一次iota,其所代表的数字就会自动加1     左移运算符”<<”是双目运算符。左移n位就是乘以2的n次方。 其功能把”<<”左边的运算数的各二进位全部左移若干位,由”<<”右边的数指定移动的位数,高位丢弃,低位补0。     右移运算符”>>”是双目运算符。右移n位就是除以2的n次方。 其功能是把”>>”左边的运算数的各二进位全部右移若干位,”>>”右边的数指定移动的位数。 例一: package iota import "fmt" func Test() { const( c1 = iota //c1=0 c2 = iota //c2=1 c3 = iota //c3=2 ) fmt.Println("c1 = ",c1," c2 = ",c2," c3 = ",c3,"\n") const( a = 1 << iota //a = 1 b = 1 << iota //b = 2 c = 1 << iota //c = 4 ) fmt.Println("a = ",a," b = ",b," c = ",c,"\n") const( v1 = iota //v1 = 0 v2 //v2 = 1 v3 //v3 = 2 ) fmt.Println("v1 = ",v1," v2 = ",v2," v3 = ",v3,"\n"...
浩爷 发布于 1小时前 阅读 2

快速了解人工智能结晶之语音转换文字

科技解放生产力,人工智能的应用如今是大热,那么今天就来给各位介绍一下IBM在这方面的一个小的尝试,语音转换文字。咱们来看一看相较于传统的转换,结合Watson的IBM是如何做到让识别率飙升的。
IBM Bluemix

python爬虫之模拟登录

用账号密码模拟登录小红书平台
Nekyo 发布于 3小时前 阅读 11

线程的创建---3种方式

1.继承Thread类,重写Run方法     class mythread extends Thread{     private String title;     public mythread(String title) {         super();         this.title = title;     }     @Override     public void run() {         // TODO Auto-generated method stub         super.run();         for(int i=0;i<10;i++){             System.out.println(this.title+".x :"+i);         }     } } 2.实现Runnable接口,重写run方法 //这样实现多线好点,因为可以不受单继承的局限 class mythread implements Runnable{     private String title;     public mythread(String title) {         super();         this.title = title;     }     @Override     public void run() {         // TODO Auto-generated method stub         for(int i=0;i<10;i++){             System.out.println(this.title+".x :"+i);         }     } }     2.1,看源码进行分析一个问题; //为啥不调用run而调用start         // priv...
晓波卡拉 发布于 3小时前 阅读 4

Git连载(1)下载和安装Git和TortoiseGit

下载和安装Git和TortoiseGit
杨大仙的程序空间 发布于 4小时前 阅读 3

Java中的break、continue、return的区别

通过简单的demo,区分break、continue和return三者之间的区别,在代码中,特别是循环的时候合理的使用,可以提高代码的执行效率
alexzhu592 发布于 4小时前 阅读 3

JavaEE——架构模式

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 架构模式 一般的程序架构都分为B/S(服务器---浏览器)和C/S(服务器---客户端)架构。 什么模式才算是B/S呢? 并不是说没有客户端的就是B/S架构,而是重服务器,轻客户端。浏览器就是一种轻客户端,不需要安装下载其他什么插件,通过协议就可以对服务器产生访问。 架构模式,也叫架构风格,一个架构模式描述软件系统里的基本的结构组织或纲要。架构模式提供一些呈先定义好的子系统,指定它们的责任,并给出把它们组织在一起的法则和指南。一个架构模式常常可以分解成很多个设计模式的联合使用。MVC模式就属于架构模式。 Web程序架构一般分为三种模式:jsp,jsp+servlet,jsp+servlet+javaclass 我们会发现随着程序的发展,为什么层次会越来越多呢? Servlet需要依赖服务器进行逻辑运算,如果以后不实用jsp,而是用其他的,这样逻辑就无法运行,所以要将他们分离出来。 MVC架构 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组...
凯哥学堂 发布于 4小时前 阅读 2

IT懒开发【精】

懒——休息,我们要在社会上掀起的风浪,这样,星星之火必成燎原之势,进而绽放人类的光。
边鹏_尛爺鑫 发布于 5小时前 阅读 12

产品备份功能设计:一个产品主表,多个附表

1、请求备份的时候,相关表各复制新增一条当前产品相关记录 2、新增记录的主表status字段值为0 这样有个问题是想要查出一个产品有多少个备份的时候,是找不出来的,因为只知道是否是备份,却不知道是哪个产品的备份。因此只要在status字段存储product_id就可以解决问题。 不过,如果记录备份名称、时间、作者之类的,就会使得产品表字段太多,正常显示的产品也拥有这些不必要的字段了。因此另外新建一个表,用来存储备份信息是比较好的。另外各个附表要添加status字段,标记当前记录是否是备份
sskill 发布于 5小时前 阅读 1

【转】Python协程:从yield/send到async/await

Python协程:从yield/send到async/await http://python.jobbole.com/86069/
袁一刀 发布于 5小时前 阅读 7

smart-socket v1.3.0,不安分的搅局者

smart-socket自发布以来,得到了很多朋友的认可,同时也伴随着的不少的质疑。大部分的质疑是无实际论据支撑的,就是看你不爽,就是你想喷你的项目。对于这样的“朋友”,现在很高兴的通知你们,你们表现的机会又来了,smart-socket又来找骂了。 距离上个版本v1.2.0的发布差不多已经两个月了,这种发布节奏对于新生开源项目算是比较低效的(要多刷刷存在感,混个脸熟啊!!!)。但是本着慢工出精品的原则,过去的两个月smart-socket一直在打磨全新的功能。如果说v1.2.0之前的smart-socket标榜的是极简、易用、高性能的话,那么即将发布的v1.3.0版本又将为smart-socket加上一个新的标签:安全。 整整历时两个月,smart-socket终于支持TLS/SSL通信了。因为工作关系无法全身心投入学习、研究这方面的技术,一直断断续续的用了个把月时间才把SSLEngine消化的差不多,之后又花了个把月时间把TLS/SSL功能接入smart-socket。期间也借鉴了一些优质的开源项目,例如:`https://github.com/alkarn/sslengine.example`(很适合初学者)。支持TLS/SSL对于smart-socket来说是里程碑式的进步,以后若有朋友在犹豫选择Netty还是Mina解决业务问题时,我们可以更有底气的向其推介:考虑一下s...
三刀蜀黍 发布于 6小时前 阅读 18 评论 3

Java项目转web项目

Java项目转web项目,找到.project文件,粘贴
没钱不任性 发布于 6小时前 阅读 4

.c文件和.h文件的关系

.c文件.h文件关系,Linux下gcc编译c程序过程
园客 发布于 6小时前 阅读 2

spring boot 禁用数据源

spring boot 禁用数据源
jingshishengxu 发布于 7小时前 阅读 3

python数据类型转化与字符串操作

一:数据类型相互转化: 数字与字符串: int ----> str str(int) str ----> int int(str) 只能是数字组成的字符串 数字与bool int ----> bool 0 Fasle 非零 True bool ----> True T ---> 1 F --->0 字符串与bool值 str ---> bool 非空 True 空就是False bool ----> str str(True) str(False) ''' i = bool(3) # print(i) # i1 = bool(0) # print(i1) # i = int(True) # print(i) # i = int(False) # print(i) 二:代码运行速度加快   三:切片与索引 s='alex wusir ritian' 分别输出结果: 也可以反着切,加步长 s1 = s[0:3:2] print(s1) s2 = s[-1:-6:-2] print(s2) 结果: 四:字符串用法 字符串的常用方法 s = 'alex wuSir' *capitalize()首字母大写,其他字母小写 print(s.capitalize()) *swapcase()大小写反转 print(s.swapcase()) 非字母隔开的部分,首字母大写,其他小写 s = 'alex wuSir1taibai*ritian' print(s.title()) s = 'alexawuSir' ***upper 全部大写 ***lower 全部小写 print(s.upper()) print(s.lower()) code = 'aeDd' your_code = input('请输入验证码:') if your_code.upper() == code.upper(): print('输入正确') el...
偷笑的骆驼 发布于 7小时前 阅读 2

Java Money与Currency API浅谈

**一、概述** JSR 354 - “金钱和货币”解决了Java中货币和货币金额的标准化问题。 它的目标是为Java生态系统添加一个灵活的可扩展的API,并使货币量更简单,更安全。 JSR没有进入JDK 9,而是未来JDK版本的候选人。虽然在Java9有Currency类简单实现但是实际开发中满足不了需求 **二、引入** 在maven的pom.xml中做如下引入 org.javamoney moneta 最新版本 在gradle中 compile group: 'org.javamoney', name: 'moneta', version: '最新版本' 最新版本依赖,可以查看,[点击这里](https://mvnrepository.com/artifact/org.javamoney/moneta) **三、JSR-354功能** “货币和金钱”API的目标: 1.提供处理和计算货币金额的API 2.定义货币和货币金额的类别,以及货币四舍五入 3.处理汇率 4.处理货币和货币金额的格式化和解析 **四、API分析与使用** 1.规范中提到的类及接口都在javax.money.*包下面。 2.先从核心的两个接口CurrencyUnit与MonetaryAmount开始剖析 3.CurrencyUnit及MonetaryAmount CurrencyUnit 代表的是货币。它有点类似于现在的java.util.Currency类,不同之处在于它支持自定义的实现。从规范的定义来看,java.util.Currency也是可以实现该接口的。CurrencyUnit的实...
ville 发布于 7小时前 阅读 43

JAVA基础--Quartz定时任务调度的简单应用(2)

我们接着来学习Quartz的日历调度: CronTrigger的作用:        基于 日历 的 作业调度器, 而不像 SimpleTrigger 那样精确指定间隔时间,比SimpleTrigger更常用; 应用于每个星期的星期几进行调度,每个月的几号进行调度..等,这种复杂调度; Cron表达式 :          用于配置CronTrigger实例.         是由7个字表达式组成的字符串,描述了时间表的详细信息.         格式: [秒] [分] [时] [日] [月] [周] [年]         特殊字符意义对应表: 字段 是否必填 允许值 允许的特殊字符 秒 是 0~59 , - * / 分 是 0~59 , - * / 时 是 0~23 , - * / 日 是 1~31 , - * / ? L W 月 是 1~12或JAN~DEC , - * / 周 是 1~7或SUN~SAT , - * / ? L # 年 否 empty,1970~2099 , - * /       特殊字符的注释: 符号 注释 * 表示所有值, 例如:在分的字段上设置'*',表示每一分钟都会触发; ?        表示不指定值,使用的场景为不需要关心当前设置这个字段的值,例如需要在每月的10号执行,但不关心是周几;所以可以在周的字段上设置'?'; - 表示区间.例如在小时上设置'10-12',表示10,11,12小时都会执行; , 表示多指定多个值: 例如在周上指定'MON,WED,FRI'表示周一,周三...
ge洋 发布于 7小时前 阅读 1

jvm调优总结(3)-jvm垃圾回收原理

jvm垃圾回收原理 在jvm中堆空间划分为三个代:年轻代(Young Generation)、年老代(Old Generation)和永久代(Permanent Generation)。年轻代和年老代是存储动态产生的对象。永久带主要是存储的是java的类信息,包括解析得到的方法、属性、字段等等。永久带基本 不参与垃圾回收。我们这里讨论的垃圾回收主要是针对年轻代和年老代。具体如下图。 年轻代又分成3个部分,一个eden区和两个相同的survior区。刚开始创建的对象都是放置在eden区的。分成这样3个部分,主要是为了生命 周期短的对象尽量留在年轻代。当eden区申请不到空间的时候,进行minorGC,把存活的对象拷贝到survior。年老代主要存放生命周期比较长的 对象,比如缓存对象。具体jvm内存回收过程描述如下(可以结合上图): 1、对象在Eden区完成内存分配 2、当Eden区满了,再创建对象,会因为申请不到空间,触发minorGC,进行young(eden+1survivor)区的垃圾回收 3、minorGC时,Eden不能被回收的对象被放入到空的survivor(Eden肯定会被清空),另一个survivor里不能被GC回收的对象也会被放入这个survivor,始终保证一个survivor是空的 4、当做第3步的时候,如果发现survivor满了,则这些对象被copy到old区,或者...
Idea 发布于 8小时前 阅读 5

GetPrivateProfileString()函数

GetPrivateProfileString: 为初始化文件中指定的条目取得字串 , 这个字串不区分大小写 GetPrivateProfileString函数的定义形式为: DWORD GetPrivateProfileString(lpszSection, lpszKey, lpszDefault,lpReturnedString, cchReturnBuffer, lpszFile) 未完待续
一个小妞 发布于 8小时前 阅读 2

C++ 中什么时候应该在堆上分配资源,什么时候应该在栈上分配?

首先,不知道堆栈的原理,怎么决定这件事呢? 一个由c/c++编译的程序占用的内存分为以下几个部分 栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式类似于链表。 全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放 程序代码区—存放函数体的二进制代码。 下面是一个例子: //----main.cpp---- int a = 0; //全局初始化区 char *p1;// 全局未初始化区 int main() { int b; //栈 char s[] = "abc"; //栈 char *p2; //栈 char *p3 = "123456"; // 123456\0 在常量区,p3在栈上。 static int c =0; //全局(静态)初始化区 p1 = (char *)malloc(10); p2 = (char *)malloc(20); //分配得来得10和20字节的区域就在堆区。 strcpy(p1, "123456"); ...
代码丽莎的微笑 发布于 8小时前 阅读 3

五年架构师讲述RESTful架构风格

在移动互联网的大潮下,随着docker等技术的兴起,『微服务』的概念也越来越被大家接受并应用于实践,日益增多的web service逐渐统一于RESTful 架构风格,如果开发者对RESTful 架构风格不甚了解,则开发出的所谓RESTful API总会貌合神离,不够规范。 本文是我对RESTful 架构风格的一些理解,和大家分享一下,如果有问题,欢迎讨论。   Outline 1. RESTful架构风格 1.1.1 资源 1.1.2 统一接口 1.1.3 URI 1.1.4 无状态 1.1 RESTful架构风格的特点 1.2 ROA、SOA、REST与RPC 1.3 本真REST与hybrid风格 2. 认证机制 2.1 Basic Auth 2.2 Token Auth 2.3 OAuth 3. 总结   1. RESTful架构风格 RESTful架构风格最初由Roy T. Fielding(HTTP/1.1协议专家组负责人)在其2000年的博士学位论文中提出。HTTP就是该架构风格的一个典型应用。从其诞生之日开始,它就因其可扩展性和简单性受到越来越多的架构师和开发者们的青睐。一方面,随着云计算和移动计算的兴起,许多企业愿意在互联网上共享自己的数据、功能;另一方面,在企业中,RESTful API(也称RESTful Web服务)也逐渐超越SOAP成为实现SOA的重要手段之一。时至今日,RESTful架构风格已成为企业级服务的标配。 REST即Representat...
Java架构分享 发布于 4天前 阅读 2630 评论 5 点赞 8

再见,Netty!你好,smart-socket!

## 再见,Netty Netty,当前最流行的NIO框架,通信领域开发的不二之选。经过多年的发展,已在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,一些业界著名的开源组件也基于Netty的NIO框架构建。目前市面上几乎找不到同类型可以与之媲美的通信框架,但是作为通信技术的爱好者,却向来无法对其产生亲近感。 我并不否认Netty的确是一款优秀的框架,曾经我也自己写过[NIO框架](https://gitee.com/smartdms/smart-socket),深知其实现难度有多大,最终选择了放弃。Netty的出现为广大程序员提供了便利,大大降低了开发高效、稳定服务的难度。至于本人对其无好感,究其原因有以下几点(首先申明一下,本人仅曾经简单使用过netty,并未深入研究): - 复杂;以下代码摘录自[Netty官网](http://netty.io/wiki/user-guide-for-5.x.html),初看代码,应该大部分人对于run方法比较费解。`EventLoopGroup`是干嘛的?`bossGroup`和`workerGroup`是什么关系?`childHandle`入参如此复杂!`ch.pipeline().addLast(new DiscardServerHandler())`实现的是什么功能?等等...。总之,这一个方法会引发你诸多疑惑。 ``` public class DiscardServer { private int p...
三刀蜀黍 发布于 2周前 阅读 5887 评论 69 点赞 10

谈谈ali与Google的Java开发规范

  无规矩不成方圆,编码规范就如同协议,有了Http、TCP等各种协议,计算机之间才能有效地通信,同样的,有了一致的编码规范,程序员之间才能有效地合作。道理大家都懂,可现实中的我们,经常一边吐槽别人的代码,一边写着被吐槽的代码,究其根本,就是缺乏遵从编码规范的意识!多年前,Google发布`Google Java Style`来定义Java编码时应遵循的规范;今年年初阿里则发布`阿里巴巴Java 开发手册`,并随后迭代了多个版本,直至9月份又发布了pdf终极版。这两大互联网巨头的初衷,都是希望能够统一标准,使业界编码达到一致性,提升沟通和研发效率,这对于我们码农无疑是很赞的一笔福利呀。笔者将两份规范都通读了一遍,其中列举的不少细则跟平时的编码习惯基本是符合的,不过还是有不少新奇的收获,忍不住记录在此,供日后念念不忘~ # Java开发规范总览 ## 一、Google Java Style   Google的java开发规范主要分为6大部分:源文件基本规范、源文件结构、代码格式、命名、编程实践和Javadoc,各部分概要如下: >1、源文件基本规范(source file basics):文件名、文件编码、特殊字符的规范要求 >2、源文件结构(source file structure):版权许可信息、package、import、类...
sherlockyb 发布于 2周前 阅读 5217 评论 29 点赞 20

源码级别解读 mybatis 插件

简介: MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。 摘自官网。。 为什么要使用mybatis,相信看这篇文章的童鞋都有所了解,俺这里就多废话几句。在orm框架中,有轻量级的dbutils与mybatis,重量级的有hibernate。 为什么要选择mybatis呢?原因如下: 1.简单,这个无需我多废话。肯定的啊,使用过的童鞋都知道,在dao层定义一个接口,然后定义一个对应的xml(xml中namespace的值对应接口的全限定名就ok。因为mybatis是通过namespaceid去和接口类进行映射,然后使用动态代理创建接口类的实例方法,参见动态代理).   2.结果集映射,我认为这是mybatis做的最牛的一点,也是选择他最大的一个理由 3.完善的缓存机制(mybatis有1级缓存和2级缓存),1级缓存是基于会话的(Session),2级缓存是基于应用级别。这里不做过多阐述,有兴趣的可以参考文章 http://www.iteye.com/topic/1112327/ 4.强大的插件机制。它可以在运行过程中动态...
Autorun 发布于 3周前 阅读 2386 评论 6 点赞 6 打赏 2

Java CompletableFuture 详解

在Java 8中, 新增加了一个包含50个方法左右的类: CompletableFuture,默认依靠fork/join框架启动新的线程实现异步与并发的,提供了非常强大的Future的扩展功能,可以帮助我们简化异步编程的复杂性,提供了函数式编程的能力,可以通过回调的方式处理计算结果,并且提供了转换和组合CompletableFuture的方法。   CompletableFuture类实现了CompletionStage和Future接口,所以可以像以前一样通过阻塞或者轮询的方式获得结果,尽管这种方式不推荐使用。 创建CompletableFuture对象。 以下四个静态方法用来为一段异步执行的代码创建CompletableFuture对象: public static CompletableFuture<Void>              runAsync(Runnable runnable) public static CompletableFuture<Void>              runAsync(Runnable runnable, Executor executor) public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier) public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor) runAsync方法也好理解,它以Runnable函数式接口类型为参数,所以CompletableFuture的计算结果为空。以Async结尾会使用其它...
田心双木 发布于 1个月前 阅读 1545 点赞 3

JVM与字节码——类的方法区模型

介绍一个类从Java编码到Java bytecode再到JVM运行的过程,在介绍过程中分析JVM方法区(非堆)的存储模型。
随风溜达的向日葵 发布于 2个月前 阅读 2668 评论 11 点赞 9

使用Hutool爬取开源中国的开源资讯

## 介绍 为了演示Hutool-http的http请求功能,因此这个栗子用红薯家的开源资讯开刀,在此做个简单的Demo。 ## 开始 ### 分析页面 1. 打开红薯家的主页,我们找到最显眼的开源资讯模块,然后点击“更多”,打开“开源资讯”板块。 ![](https://static.oschina.net/uploads/img/201711/19204312_zJD8.png) 2. 打开F12调试器,点击快捷键F12打开Chrome的调试器,点击“Network”选项卡,然后在页面上点击“全部资讯”。 ![](https://static.oschina.net/uploads/img/201711/19204634_1ahd.png) ![](https://static.oschina.net/uploads/img/201711/19204743_eJBy.png) 3. 由于红薯家的列表页是通过下拉翻页的,因此下拉到底部会触发第二页的加载,此时我们下拉到底部,然后观察调试器中是否有新的请求出现。如图,我们发现第二个请求是列表页的第二页。 ![](https://static.oschina.net/uploads/img/201711/19205000_V7Sj.png) 4. 我们打开这个请求地址,可以看到纯纯的内容。红框所指地址为第二页的内容,很明显p参数代表了页码page。 ![](https://static.oschina.net/uploads/img/201711/19205156_dTb8.png) 5. 我们右键点击后查看源码,可以看到源码。 ![](https://static...
路小磊 发布于 2个月前 阅读 2308 评论 20 点赞 7

jvm - 垃圾回收

# jvm - 垃圾回收 注意 : 本系列文章为学习系列,部分内容会取自相关书籍或者网络资源,在文章中间和末尾处会有标注 ## **垃圾回收的意义** 它使得java程序员不再时时刻刻的关注内存管理方面的工作. 垃圾回收机制会自动的管理jvm内存空间,将那些已经不会被使用到了的"垃圾对象"清理掉",释放出更多的空间给其他对象使用. ## **何为对象的引用?** Java中的垃圾回收一般是在Java堆中进行,因为堆中几乎存放了Java中所有的对象实例 在java中,对引用的概念简述如下(引用强度依次减弱) : - **强引用** : 这类引用是Java程序中最普遍的,只要强引用还存在,垃圾收集器就永远不会回收掉被引用的对象 - **软引用** : 用来描述一些非必须的对象,在系统内存不够使用时,这类对象会被垃圾收集器回收,JDK提供了SoftReference类来实现软引用 - **弱引用** : 用来描述一些非必须的对象,只要发生GC,无论但是内存是否够用,这类对象就会被垃圾收集器回收,JDK提供了WeakReference类来实现弱引用 - **虚引用** : 与其他几种引用不同,它不影响对象的生命周期,如果这个对象是虚运用,则就跟没有引用一样,在任何时刻都可能会回收,JDK提供了PhantomReference类来实现虚引用 **如下为相关示例代码** ```j...
wangkang80 发布于 3个月前 阅读 3267 评论 13 点赞 11

一张思维导图,让正则表达式不再难懂

一张精彩的导图  关注公众号回复“正则导图”即可下载xmind源文件   导图内容解析 语法结构 字符 普通字符:字母、数字、汉字、下划线,匹配与之相同的一个字符 简单转义字符:\n(换行),\t(制表),\\(\本身)和 \^...(\^等有特殊作用的符号如要匹配自己的话要用转义) 标准字符集合 注意区分大小写,大写是相反的意思,匹配相反是不匹配 \d 任意一个数字,0~9 \w 任意一个字母、数字、汉字或下划线,A~Z、a~z、0~9、_和任意一个汉字 \s 任意空白符,包括空格、制表符、换行符 . 小数点可以匹配任意一个字符,换行除外(如果要匹配包括"\n"在内的所有字符,一般用[\s\S]) 自定义字符集合 [ ]方括号匹配方式,能够匹配方括号中的任意一个字符,^表示取反 [ab5@] 匹配"a"或"b"或"5"或"@" [^abc] 匹配a、b、c之外的任意字符 [f-k] 匹配“f"到"k"之间的字符 [^A-F0-3] 匹配“A"-"F","0"-"3"之外的任意一个字符 量词(Quantifier) 修饰前面的一个表达式,如果要修饰多个表达式,就用( )把表达式包起来 {n} 表达式重复n次​ {m,n} 表达式至少重复m次,最多重复n次 贪婪模式 (默认) 匹配符合的最长的字符串 非贪婪模式 (在量词后面加 ? 例:{m,n}? ) 匹配符合的最短的字符...
java思维导图 发布于 3个月前 阅读 12159 评论 25 点赞 46

Java9之HttpClientAPI实战详解

Java9之HttpClientAPI实战详解 前言 相信关注java9的小伙伴们都知道java9版本内置模块提供了Http功能,当然并不是说之前jdk之前并不支持,那么这次更新又多了什么呢?或者是解决了什么问题? 说明 自JDK 1.0以来,Java已经支持HTTP/1.1。 HTTP API由java.net包中的几种类型组成。 现有的API有以下问题: 它被设计为支持多个协议,如http,ftp,gopher等,其中许多协议不再被使用。 太抽象了,很难使用。 它包含许多未公开的行为。 它只支持一种模式,阻塞模式,这要求每个请求/响应有一个单独的线程。 2015年5月,IETF(Internet Engineering Task Force)发布了HTTP/2规范。 有关HTTP/2规范的完整文本,请访问https://tools.ietf.org/html/rfc7540。 HTTP/2不会修改应用程序级语义。 也就是说,对应用程序中的HTTP协议的了解和使用情况并没有改变。 它具有更有效的方式准备数据包,然后发送到客户端和服务器之间的电线。 所有之前知道的HTTP,如HTTP头,方法,状态码,URL等都保持不变。 HTTP/2尝试解决与HTTP/1连接所面临的许多性能相关的问题: HTTP/2支持二进制数据交换,来代替HTTP/1.1支持的文本数据。 HTTP/2支持多路复用和并发,这意味着多个数据交换可以同时发生...
路上有你0314 发布于 4个月前 阅读 3136 评论 6 点赞 6

Java9新特性——module模块系统

官方文档:https://docs.oracle.com/javase/9/index.html 关于 java9的新特性,官方原文:https://docs.oracle.com/javase/9/whatsnew/toc.htm 这玩意就是一个列表,具体的技术细节需要根据官方文档挖一挖。 modular-模块系统 --- java9的模块化,从一个独立的开源项目而来,名为Jigsaw。 项目官网:http://openjdk.java.net/projects/jigsaw/ ### 为什么要使用模块化 java开发者都知道,使用java开发应用程序都会遇到一个问题,Jar hell,他就像windows里的dll hell。 比如我们启动一个不算大的应用,但依赖了很多的jar,如下图: ![输入图片说明](https://static.oschina.net/uploads/img/201709/26094041_w0RP.png "在这里输入图片标题") 摘自:Mark Reinhold的演讲 https://www.youtube.com/watch?v=l1s7R85GF1A 这是很常见的。虽然你可以使用 "java -Djava.ext.dirs=lib xxx" 让命令行小一些,但不可否认,他的classpath就是那么长。顺便说一句,java9中不允许使用extdirs了。 另一方面,jdk本身有很多的api: ![输入图片说明](https://static.oschina.net/uploads/img/201709/26094131_JZAh.png "在这里输入图片标题") 对于一些小设备,它太庞大了。 ### helloworld...
polly 发布于 4个月前 阅读 5647 评论 33 点赞 22 打赏 1

疯狂Activiti6.0连载(1)Activiti介绍

本文节选自《疯狂工作流讲义(第2版)》 京东购买地址:https://item.jd.com/12246565.html 疯狂Activiti电子书:https://my.oschina.net/JavaLaw/blog/1570397 工作流Activiti教学视频:https://my.oschina.net/JavaLaw/blog/1577577 1 Activiti介绍         在计算机尚未普及时,许多工作流程采用手工传递纸张表单的方式,一级一级审批签字,工作效率非常低下,对于数据统计以及生成报表的功能,需要经过大量的手工操作才能实现。随着电脑的普及,这些工作的参与者只需要在电脑的系统中填入工作内容,系统就会按照定义好的流程自动执行,各级审批者可以得到工作的信息并作出相应的审批和管理操作,数据统计和报表的生成均由系统代为完成,这样大大提高了工作效率,在这种背景下,各种的工作流应用以及中间件应运而生。         工作流应用在日常工作中的应用越来越广泛,JavaEE领域出现了许多优秀的工作流引擎,例如JBoss社区的jBPM、OpenSymphony的OSWorkflow等,在2010年5月17日,以Tom Baeyens为首的工作流小组发布了一个全新的工作流引擎——Activiti,该工作流引擎的第一个版本为5.0alpha1,由于Tom Baeyens是jBPM的创始人(由于意见分歧离开JBoss...
杨大仙的程序空间 发布于 4个月前 阅读 3933 评论 30 点赞 10

Java平台,标准版Oracle JDK 9中的新功能

Java平台,标准版 Oracle JDK 9中的新增功能 版本9 E77563-05 2017年9月   JDK 9中的新功能概述 Java Platform,Standard Edition 9是一个主要的功能版本。以下总结了Java SE 9和JDK 9的特点和增强功能,Oracle 对于 Java SE 9的实现。 JDK增强提案(JEP)是对JDK设计和实施非常重要更改的提案。参阅JEP 1:JDK增强提案和路线图流程。Java规范请求(JSR)描述了Java平台的建议和最终规范。请参阅JSR概述。   JDK 9中的重要变化 这些变化影响了多个技术领域。 特征 描述 Java平台模块系统 推出了一种新的Java编程组件--模块,是一个指定的,自描述代码和数据的集合。 模块系统: 引入一个新可选阶段,link time,它在编译和运行时之间,在此期间,可以将一组模块组合并且优化到一个自定义的运行时映像中;在 Java Platform, Standard Edition Tools Reference 中查看 jlink 工具。 添加选项到工具javac,jlink和java,可以指定模块路径在哪里,哪一个定义模块的定位。 引入模块化JAR文件,它是一个在根目录下包含module-info.class的JAR文件。 推出JMOD格式,它是一种类似于JAR的打包格式,除了它可以包含原生代码和配置文件外; 参见jmod工具。 JDK本身已经被分为一组模...
GuoMengYue 发布于 4个月前 阅读 8155 评论 26 点赞 19

LinkedList的实现原理浅析

本文简单分析一下JDK1.7的LinkedList源码,看一下其内部的结构以及典型方法的实现~ LinkedList内部结构 查看LinkedList的源码,发现其继承自AbstractSequentialList,实现了List,Deque,Cloneable以及Serializable接口,如: public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable { } 也就意味着: LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。 LinkedList 实现 List 接口,能对它进行列表操作。 LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用。 LinkedList 实现了Cloneable接口,即覆盖了函数clone(),能克隆。 LinkedList 实现java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。   public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable { transient int size = 0; /** * Pointer to first node. * Invariant: (first == null && last == null) || ...
王孟君 发布于 4个月前 阅读 2273 评论 7 点赞 6

HashMap的实现原理浅析

HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在。  HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 本文使用的是JDK1.7的HashMap源码,因为JDK1.8的HashMap改变还很多,以后再去单一分析。 HashMap内部结构 查看HashMap源代码,可以发现其继承自AbstractMap, 并实现了Map, Cloneable, Serializable接口~ public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable HashMap包含一个数组对象table[], /** * The table, resized as necessary. Length MUST Always be a power of two. */ transient Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE; 数组中包含的元素为Entry对象,Entry是HashMap中定义的静态内部类,内容如下: static class Entry<K,V> implements Map.Entry<K,V> { final K key; V value; Entry<K,V> next; int hash; /** * Creates new entry. */ ...
王孟君 发布于 5个月前 阅读 3443 评论 9 点赞 10

曲线点抽稀算法-Python实现

## 何为抽稀 >在处理矢量化数据时,记录中往往会有很多重复数据,对进一步数据处理带来诸多不便。多余的数据一方面浪费了较多的存储空间,另一方面造成所要表达的图形不光滑或不符合标准。因此要通过某种规则,在保证矢量曲线形状不变的情况下, 最大限度地减少数据点个数,这个过程称为抽稀。 通俗的讲就是对曲线进行采样简化,即在曲线上取有限个点,将其变为折线,并且能够在一定程度保持原有形状。比较常用的两种抽稀算法是:道格拉斯-普克(Douglas-Peuker)算法和垂距限值法。 ## 道格拉斯-普克(Douglas-Peuker)算法 Douglas-Peuker算法(DP算法)过程如下: * 1、连接曲线首尾两点A、B; * 2、依次计算曲线上所有点到A、B两点所在曲线的距离; * 3、计算最大距离D,如果D小于阈值threshold,则去掉曲线上出A、B外的所有点;如果D大于阈值threshold,则把曲线以最大距离分割成两段; * 4、对所有曲线分段重复1-3步骤,知道所有D均小于阈值。即完成抽稀。 这种算法的抽稀精度与阈值有很大关系,阈值越大,简化程度越大,点减少的越多;反之简化程度越低,点保留的越多,形状也越趋于原曲线。 下面是Python代码实现: ```python # -*- coding: utf-8 -*- """ -----------------...
j_hao104 发布于 5个月前 阅读 1229 评论 3 点赞 2

PHP实现依赖注入

控制反转(Inversion of Control,英文缩写为IoC)是框架的重要特征。控制反转(IOC)是一种思想,依赖注入(DI)是实施这种思想的方法。
o0无忧亦无怖 发布于 5个月前 阅读 2263 评论 38 点赞 8

Java使用Hutool实现AES、DES加密解密

在Java世界中,AES、DES加密解密需要使用Cipher对象构建加密解密系统,Hutool中对这一对象做再包装,简化了加密解密过程。
路小磊 发布于 6个月前 阅读 2624 评论 21 点赞 9

SQL注入详解

日前,国内最大的程序员社区CSDN网站的用户数据库被黑客公开发布,600万用户的登录名及密码被公开泄露,随后又有多家网站的用户密码被流传于网络,连日来引发众多网民对自己账号、密码等互联网信息被盗取的普遍担忧。 网络安全成为了现在互联网的焦点,这也恰恰触动了每一位用户的神经,由于设计的漏洞导致了不可收拾的恶果,验证了一句话“出来混的,迟早是要还的”,所以我想通过专题博文介绍一些常用的攻击技术和防范策略。 SQL Injection也许很多人都知道或者使用过,如果没有了解或完全没有听过也没有关系,因为接下来我们将介绍SQL Injection。
暴雪首席执行官 发布于 6个月前 阅读 4324 评论 25 点赞 5

使用Spring自定义注解实现任务路由

在Spring mvc的开发中,我们可以通过RequestMapping来配,当前方法用于处理哪一个URL的请求.同样我们现在有一个需求,有一个任务调度器,可以按照不同的任务类型路由到不同的任务执行器。其本质就是通过外部参数进行一次路由和Spring mvc做的事情类似。简单看了Spring mvc的实现原理之后,决定使用自定义注解的方式来实现以上功能。 ### 自定义TaskHandler注解 ```java @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface TaskHandler { String taskType() default ""; } ``` 以上定义了任务处理器的注解,其中@Component表示在spring 启动过程中,会扫描到并且注入到容器中。taskType表示类型。 ### 任务处理器定义 ```java public abstract class AbstractTaskHandler { /** * 任务执行器 * * @param task 任务 * @return 执行结果 */ public abstract BaseResult execute(Task task); } ``` 以上定义了一个任务执行的处理器,其他所有的具体的任务执行器继承实现这个方法。其中Task表示任务的定义,包括任务Id,执行任务需要的参数等。 ### 任务处理器实现 接下来,我们可以实现一个具体的任务处理器。 ```jav...
wangyan9110 发布于 6个月前 阅读 3585 评论 8 点赞 8
顶部