Java

关注java基础,jdk新动态等

透露下JDK9中的一些新东西 Java

透露下JDK9中的一些新东西

随着标准Java的版本更新,开发者总是可以从升级后的版本中获取想要的功能。那么Java 9的发布为什么会让开发者如此的兴奋?下面列出了一些主要原因: 1、模块化的源代码 JDK源代码将以模块化的形式组织起来,生成系统将会在模块化编译上得到增强,并且在生成的时候模块之间的边界也将被强制区分开来。“Jigsaw的目标是为Java SE平台设计并实现标准的模块化系统,并将该系统应用到自身平台和JDK当中去。它的主要目标是为一些小型设备提供可简单扩展的实施方案,并且提高安全性和可维护性,提高应用系统的性能,以及为开发者提供更多的开发工具。”JDK优化建议中是这么描述的。 2、轻量级的JSON API 这是利用JSON数据交换格式生成文档和数据流的一个接口,某些时候,JSON完全可以替代XML。“JSON可以在Web服务中用得上了,Java SE也将采用JSON数据格式,同时这也是Java 9中提供的最需要的功能了。” 3、系统进程管理 这次升级将对管理操作系统进程的API作一些提高和完善,目前的API只能强制开发者使用本地代码,然而这次升级也克服了这一限制。在Java SE 7中,对本地操作系统进程的操作有很大的限制,但是Java 9中新的API也需要考虑不同操作系统的差异,尤其是Windows。“API的设计需要适应不同操作系统的移动设备,并且要能在这些设备上部署和应用。同时也应该要考虑同一个操作系统中多个Java虚拟机的情况。”JEP文档中是这么描述的。 4、完善竞争锁 该目标是为了提升访问对象时的线程竞争处理,文档中是这样说的:“完善锁之间的竞争对现实中的应用系统是非常有益的。” 5、分段代码缓存 这主要是将代码缓存分割成几块,每一块都包含编译好的代码,这样不仅可以提高程序运行时的性能,而且还更容易扩展。 6、智能Java编译器 该项目主要是为了提高Java编译器的性能,使其能够在编译大型项目上超越JDK,当前的实施方案确实非常棒,不仅提高了编译速度,而且还有增量编译的功能。但是由于代码质量和稳定性还尚未令人满意,所以该项目还未对外发布,敬请期待。 本文是码农网原创翻译,转载请看清文末的转载要求,谢谢合作!
linux环境下java之证书生成与安装自动脚本 Java

linux环境下java之证书生成与安装自动脚本

在开启tomcat的https时,是需要提供https证书的,一般在本机或自己的服务器上测试都是使用jdk的keytool自行生成证书进行测试,在测试通过之后再才到专业的证书提供商处购买证书. 由于每次生成证书都需要自己去输入命令,很是麻烦,就写成一个自动的脚本,方便生成证书. 注: 使用此脚本时,需要配置JAVA_HOME环境变量, 这样才能方便找到JDK的命令. 证书名称和码请自行修改.
单例模式:一种更好的实现方法 Java

单例模式:一种更好的实现方法

饿汉式单例类不能实现延迟加载,不管将来用不用始终占据内存;懒汉式单例类线程安全控制烦琐,而且性能受影响。可见,无论是饿汉式单例还是懒汉式单例都存在这样那样的问题. 有没有一种方法,能够将两种单例的缺点都克服,而将两者的优点合二为一呢?答案是:Yes!下面我们来学习这种更好的被称之为Initializationon Demand Holder (IoDH)的技术。 在IoDH中,我们在单例类中增加一个静态(static)内部类,在该内部类中创建单例对象,再将该单例对象通过getInstance()方法返回给外部使用,实现代码如下所示: 编译并运行上述代码,运行结果为:true,即创建的单例对象s1和s2为同一对象。由于静态单例对象没有作为Singleton的成员变量直接实例化,因此类加载时不会实例化Singleton,第一次调用getInstance()时将加载内部类HolderClass,在该内部类中定义了一个static类型的变量instance,此时会首先初始化这个成员变量,由Java虚拟机来保证其线程安全性,确保该成员变量只能初始化一次。由于getInstance()方法没有任何线程锁定,因此其性能不会造成任何影响。 通过使用IoDH,我们既可以实现延迟加载,又可以保证线程安全,不影响系统性能,不失为一种最好的Java语言单例模式实现方式(其缺点是与编程语言本身的特性相关,很多面向对象语言不支持IoDH)。
[转]eclipse下远程调试linux下tomcat Java

[转]eclipse下远程调试linux下tomcat

1. 找到linux下的tomcat文件路径,修改bin下面的catalina.sh,找到jpda配置处 修改JPDA_SUSPEND="y",修改JPDA_ADDRESS="8000"端口号,然后关闭掉tomcat JPDA_SUSPEND 可以不修改为y,修改为n是需要等待客户机连接,如果可以等待程序启动后再进行调试,可以不需要修改为y,直接修改为n 2.配置JAVA环境变量 3.关闭linux下防火墙,不然远程客户机可能无法连接上该tomcat,注意不直接关闭防火墙,而是将远程客户机与端口添加到防火墙上,关闭主要是最简单。 service iptables stop 4.启动tomcat 命令行下运行:./catalina.sh jpda start 5.启动eclipse,选择 run->open debug dialog,在弹出的对话框中,双击Remote JAVA Application新建一个remote java application 如下图所示: Project为你需要进行调试的工程,可以再Source里面添加调试工程引用到的代码 Host:为远端需要调试的tomcat服务器IP 端口为1 中你修改的JPDA_ADDRESS 对应的端口,然后点击debug就可以进行远程调试了。 注意: 1. 你点击调试后,可能无法连接上tomcat服务器端,可以适当连几次,如果还是连不上,建议修改下端口号,因为端口号可能会被占用;还有就是注意tomcat服务器的防火墙注意关闭掉。 2. 启动顺序为:先启动tomcat端,然后再在客户端配置5步骤启动。
在ActiveMQ中使用VM transport connector Java

在ActiveMQ中使用VM transport connector

在ActiveMQ使用中,可以再VM中内嵌一个broker来作为传输的中间件,这样可以简化开发流程。具体如下: 先运行Consumer,再运行Publisher,测试成功. 系统中需要引进的jar包如下图: 原文链接: 在ActiveMQ中使用VM transport connector
验证码识别与反识别技术 Java

验证码识别与反识别技术

1 验证码识别技术 验证码识别技术属于模式识别的范畴,具体来讲它属于模式识别中的文字识别。验证码识别技术与手写体字符识别技术比较接近,但是一方面验证码比手写体字符多了许多干扰,一方面验证码字符的变化又不如手写体字符丰富,所以它们之间还是有一定的区别。模式识别系统一般具有如图1所示结构,主要包括预处理、特征提取、训练和识别几个部分,验证码识别系统也不例外。根据验证码的特点,研究表明验证码识别的难点和重点在于预处理,即去除噪声、干扰和字符分割。 图1 模式识别系统原理结构框图 本文以下图所示验证码的识别为例来介绍验证码识别技术。 1.1预处理 预处理是在验证码学习和识别之前对验证码图片进行前期处理,主要包括Jpeg解码、二值化、去除噪声和干扰、字符分割、归一化等。预处理的好坏极大地影响到识别性能,其中去除干扰和字符分割尤为重要。 Jpeg解码 :并非所有验证码的识别都需要进行Jpeg解码,但是本验证码图片为Jpeg格式,只有先经过Jpeg解码才能进行处理。本程序采用GDI++进行Jpeg解码,通过调用相关函数,使Jpeg格式的验证码图片首先转换为bmp格式,暂存于临时文件CodeBmp.bmp中,然后再打开CodeBmp.bmp文件进行处理。Jpeg解码的相关函数调用如下: 二值化:二值化是将验证码图片的灰度值,以某一阈值为限,转换为0或255,即黑和白,以便于处理。因为本验证码的字符灰度偏白,所以在进行二值化之前先进行了灰度反置,即让背景变白,让字符变黑。二值化阈值根据具体验证码分析所得,选择合理的阈值可消除很多背景、噪声,同时不损伤字符笔画。本程序的二值化阈值设为120,可以很好的去除背景。 去除噪声和干扰:二值化后大部分噪声都已经去除,但是还有很多干扰线,不去除这些干扰线就不可能进行后续的处理。通过对本验证码干扰线的特点进行分析,发现干扰线很细,比字符笔画细很多,干扰线的高度为1个象素,干扰线相交处的高度一般为2个象素。本程序首先去除了所有高度为1的点线,然后去除了高度为2且与高度为1的象素相通的点线。 字符分割:字符分割即把验证码图片分割成单个的字符,这是有效识别的基础。本程序先利用种子填充算法得到几个连通线,这样未粘连的字符即可分割。对于粘连字符,还需要进一步分割。粘连字符的判别主要依据字符的点数和宽高比特征,大于某一阈值则初步判断为字符粘连。阈值根据验证码特征统计分析所得。对于初步判断为粘连的字符,为了防止判断错误,还用预识别的方法进行了进一步判断,如果能很好地识别也不认为是粘连字符。对于粘连字符的分割,本程序采用在垂直投影图中找谷点的方法进行分割。 归一化:验证码字符存在位置偏移、大小不一、旋转不定的特点,如果不进行归一化就不能很好识别。本程序采用质心对齐和线性插值放大的方法进行归一化,使字符变为统一的规格,以便于进行匹识别。 1.2 特征提取 特征提取是从经过预处理的字符图片中,提取出一定维数的特征向量,这样能提高字符匹配和识别的存储量和运算速度。字符有很多特征,选用合适的特征才能达到正确识别的目的。本程序采用了字符的区域密度的特征,即将字符分为5*5的25个方格区域,计算每个方格中的点数与字符总点数之比,以得到25维特征向量。该特征反映了字符笔画的空间分布情况,并且对字符笔画的粗细不敏感。 1.3 训练 训练是从训练集验证码中提取出标准模板,即标准特征库的过程。本程序采用了1500个验证码进行训练,使每个字符都有200个左右的标准模板。通过预处理和特征提取后,将训练集验证码的特征向量存入文件std.inf中。训练时需要指明各验证码的正确值。为了不出现错误的标准模板,对于分割时发现有字符粘连的训练集验证码不加入模板库。 1.4 识别 本程序采用最近邻判别法进行识别,即将每个字符的特征向量与标准特征库中的特征向量进行匹配,与哪个字符的匹配最好就判别为哪个字符。具体匹配方法是计算特征向量之间的欧几里德距离,如以下公式所示: 其中CurrPara为待识别字符的特征向量,StdPara为标准模板的特征向量,i=0,1,2,…,24。待识别字符与哪个标准模板的欧几里德距离最小,就表示和哪个模板最匹配,即判别为哪个字符。依次对验证码的各个字符进行识别,即可识别出验证码字符串。本程序还返回了识别结果的可信度reliability。可信度依据验证码的最大最近邻距离计算所得,最大最近邻距离指验证码中各字符最近邻距离的最大值。本程序根据多个阈值对最大最近邻距离进行分段,每个分段返回一个可信度。最大最近邻距离的阈值根据验证码识别情况统计分析所得。Reliability=80表示识别结果80%可信。测试表明Reliability≥80时有很高的可信度。 2 验证码反识别方法 结合笔者的研究,提出一些验证码反识别的方法。 ①使字符粘连,或加干扰线使字符无法分割,一旦字符无法分割将大大增加识别难度。 ②验证码中加入的背景、干扰点、干扰线等要与字符的灰度交错重叠,使程序无法提取出干净的字符。 ③验证码中的字符应该采用非标准字体,并使字符随机缩放、旋转、偏移。 ④增加字符分类数,增加字符个数,字符个数随机,可以增大识别难度,使程序识别率降低。 欢迎大家与我交流验证码识别与反识别技术 个人主页:http://protected.game78.net/ocr QQ:726373005 原文链接:http://61.132.27.102/ocr/post/2.html
JAVA的八种排序之二(希尔排序,最小增量排序) Java

JAVA的八种排序之二(希尔排序,最小增量排序)

(1)基本思想 算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。当增量减到1时,进行直接插入排序后,排序完成。 (2)实例 (3)用java实现
JAVA的八种排序之一(直接插入排序) Java

JAVA的八种排序之一(直接插入排序)

本文主要详解了Java语言的8大排序的基本思想以及实例解读,详细请看下文: 8种排序之间的关系: (1)基本思想 在要排序的一组数中,假设前面(n-1)[n
一起看看JDK5带给我们哪些新特性 Java

一起看看JDK5带给我们哪些新特性

JDK1.5新特性: 1. 自动装箱与拆箱(Autoboxing/unboxing) 2. 枚举(常用来设计单例模式) 3. 静态导入 4. 可变参数 5. 内省 6. 泛型 泛型是JDK1.5中一个最“酷”的特征。通过引入泛型,我们将获得编译时类型的安全和运行时更小地抛出ClassCastExceptions的可能。在JDK1.5中,你可以声明一个集合将接收/返回的对象的类型。 在JDK1.4中,创建雇员名字的清单(List)需要一个集合对象: List listOfEmployeeName = new ArrayList(); 在JDK1.5中,你将使用下面语句: 最“酷”的是,如果你试图插入非string类型的值,你将在编译时发现并且修正这类问题。没有泛型,你会发现这样一个bug,当你的客户调用后会告诉你,你所编写的程序抛出ClassCastException异常而崩溃。 另外,当你从集合中得到一个元素时你无需进行强制转换。故原先为: 而下面的语句将比上面的更加简单:
一起看看JDK7带给我们哪些新特性 Java

一起看看JDK7带给我们哪些新特性

JDK7对Java语法有少量更新,重点是在易用性和便捷性的改进。 1.二进制字面量 JDK7开始,终于可以用二进制来表示整数(byte,short,int和long)。使用二进制字面量的好处是,可以是代码更容易被理解。语法非常简单,只要在二进制数值前面加 0b或者0B 2.数字字面量可以出现下划线 对于一些比较大的数字,我们定义起来总是不方面,经常缺少或者增加位数。JDK7为我们提供了一种解决方案,下划线可以出现在数字字面量。 注意:你只能将下划线置于数字之间,以下使用方法是错误的 1.数字的开头或者结尾 2.小数点的前后 3.‘F’或者‘f’的后缀 4.只能用数字的位置 3.switch 语句可以用字符串了 这个功能千呼万唤,终于出来了 4.泛型实例的创建可以通过类型推断来简化 以后你创建一个泛型实例,不需要再详细说明类型,只需用,编译器会自动帮你匹配 5.在可变参数方法中传递非具体化参数(Non-Reifiable Formal Parameters),改进编译警告和错误 有些参数类型,例如ArrayList 和 List,是非具体化的(non-reifiable).在编译阶段,编译器会擦除该类型信息。 Heap pollution 指一个变量被指向另外一个不是相同类型的变量。例如 回到我们的主题,在jdk7中,当你定义下面的函数时,你会得到一个warning warning: [varargs] Possible heap pollution from parameterized vararg type 在jdk7之前,当你调用一个含有非具体化参数的可变参数方法,你必须自行保证不会发生“heap pollution”。这有一个问题,如果调用者对方法不熟悉,他根本无法判断。JDK7对此做了改进,在该方法被定义时久发出警告 要消除警告,可以有三种方式 1.加 annotation @SafeVarargs 2.加 annotation @SuppressWarnings({"unchecked", "varargs"}) 3.使用编译器参数 –Xlint:varargs; 6.try-with-resources 语句 jdk7提供了try-with-resources,可以自动关闭相关的资源(只要该资源实现了AutoCloseable接口,jdk7为绝大部分资源对象都实现了这个接口)···