java
文章平均质量分 73
aitangyong
成长最快、最好的方式就是交流和总结!
展开
-
java中使用try-catch-finally一点值得注意的事
我们知道,try负责圈定可能会出异常的代码;catch负责处理try中可能异常的处理,如记录错误日志,使业务能够正常运行;finally负责资源释放等善后工作,无论有无异常都必须要执行的代码,一般都是放在finally中的。如果catch和finally也会出现异常,那么会是什么效果呢? try { // java.lang.ArithmeticExce原创 2014-04-22 17:13:52 · 2062 阅读 · 3 评论 -
在并发环境下使用HashMap导致的线程死循环问题
最近和维护的一个同事定位产品的线上问题,遇到了线程卡死的情况。最终的根源就是:缓存是通过HashMap实现的,而且没有使用同步机制。在多线程环境下,更新/获取HashMap的值,导致了线程进入了死循环。JDK文档中明确说了HashMap不是线程安全的,所以在没有任何加锁的情况下,在多线程中使用HashMap本身就是严重的错误。原创 2014-07-09 14:39:12 · 2899 阅读 · 0 评论 -
了解java的序列化与反序列化
序列化是一种对象持久化的手段,普遍应用在网络传输、RMI等场景中。一个Java类必须实现java.io.Serializable接口,这个类的对象才可以被序列化。之后我们可以通过ObjectOutputStream和ObjectInputStream对对象进行序列化及反序列化。在序列化和反序列化的过程中,类不仅路径要完全一致,serialVersionUID也必需相同。在进行反序列化的时候,并没有调用类的构造方法,而是直接根据他们的序列化数据在内存中创建新的对象。原创 2016-03-04 16:15:16 · 780 阅读 · 0 评论 -
引用第三方jar中class,不可不知的java.lang.NoSuchMethodError
最近做项目遇到了NoSuchMethodError,定位了很久,最终才解决。看似诡异的问题,一方面是我们疏忽,导致错误出在了我们最意想不到的地方;还有就是自身知识的匮乏,我们写的代码明明有问题,自己却不知道。事情是这样的:1、我在eclipse中编写自己的类DottingCfgQueryer.java,并引用了1个jar中的类aty.utils.SecurityStrUtil.esca原创 2014-03-26 13:02:00 · 2485 阅读 · 0 评论 -
慎用subList:ArrayList$SubList.add导致的java.lang.StackOverflowError
也就是说:调用A的subList()得到B,调用B的subList()得到C,.....调用n的subList()得到n+1。这样就会得到一个庞大的应用链:n+1 指向n,.....C指向B,B指向A。当调用n+1这个list的add()方法时候,会一直递归调用到A的add()方法,当数据很多的时候自然就栈溢出了。原创 2016-08-27 12:49:10 · 4097 阅读 · 0 评论 -
JDK8新特性:接口的静态方法和默认方法
在jdk8之前,interface之中可以定义变量和方法,变量必须是public、static、final的,方法必须是public、abstract的。JDK8及以后,允许我们在接口中定义static方法和default方法。静态方法,只能通过接口名调用,不可以通过实现类的类名或者实现类的对象调用。default方法,只能通过接口实现类的对象来调用。原创 2017-01-06 10:46:53 · 36700 阅读 · 21 评论 -
JDK8新特性:函数式接口@FunctionalInterface的使用说明
通过JDK8源码javadoc,可以知道这个注解有以下特点:1、该注解只能标记在"有且仅有一个抽象方法"的接口上。2、JDK8接口中的静态方法和默认方法,都不算是抽象方法。3、接口默认继承java.lang.Object,所以如果接口显示声明覆盖了Object中方法,那么也不算抽象方法。4、该注解不是必须的,如果一个接口符合"函数式接口"定义,那么加不加该注解都没有影响。加上该注解能够更好地让编译器进行检查。如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错。原创 2017-01-06 14:03:29 · 120042 阅读 · 18 评论 -
JDK8新特性:使用Optional避免null导致的NullPointerException
Optional实际上是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。原创 2017-01-15 20:00:13 · 112555 阅读 · 9 评论 -
熟练使用java的Enum、EnumSet、EnumMap
对java枚举一直没有系统学习过,之前就是用枚举来替代接口中的常量,今天看到同事写的一段代码使用了EnumSet,不是特别熟悉。于是重新学习了Enum、EnumSet、EnumMap。原创 2017-02-06 19:56:44 · 9327 阅读 · 1 评论 -
遍历java集合或数组的几种方式
以数组为例,基本上有下面4种常见的遍历方式:方式1:多次调用函数,而这些调用是不必要的,浪费。方式2:引入了额外的length变量,而且该变量在整个方法作用域内都可见,有变量作用域污染问题。方式3:不存在方式1的浪费,不存在方式2的作用域污染,唯一不好的地方在于多定义一个变量。方式4:不存在方式1的浪费,不存在方式2的作用域污染,唯一不好的地方在于丢失了索引信息。总之:不需要索引的时候使用方式4,需要索引的时候使用方式3原创 2017-02-06 20:12:32 · 2296 阅读 · 0 评论 -
JDK8新特性:lambda入门
lambda其实就是为@FunctionalInterface服务的,能够用一种全新的、简洁的语法创建函数式接口的对象。当然如果一个接口不符合函数式接口的定义,是不能通过lambda表达式来创建其对象的。lambda其实就是定义入参、函数体、返回值,然后可以生成任意一个接口(符合该函数入参和返回值的函数式接口)的对象。原创 2017-01-11 09:26:39 · 2171 阅读 · 0 评论 -
JDK8新特性:重复注解Repeating Annotations
注解并不是什么新鲜东西了,比如spring中存在大量注解简化我们的配置。但是在JDK8之前,我们是不能使用重复注解的,即某个位置相同注解只能出现一次。这里有个使用@Repeatable( Schedules.class )的注解类Schedule,Schedules仅仅是Schedule注解的数组,但Java编译器并不想让程序员意识到Schedules的存在。这样对使用者而言,Target就拥有了两个Schedule注解,而不是1个Schedules注解。同时,反射相关的API提供了新的函数getAnnot原创 2017-01-12 09:20:28 · 3105 阅读 · 0 评论 -
JDK8新特性:编译器保留方法参数名字
很长一段时间里,Java程序员一直在发明不同的方式使得方法参数的名字能保留在Java字节码中,并且能够在运行时获取它们(比如Paranamer类库)。最终,在Java 8中把这个强烈要求的功能添加到语言层面(通过反射API与Parameter.getName()方法)与字节码文件(通过新版的javac的–parameters选项)中。原创 2017-01-12 13:19:34 · 7746 阅读 · 1 评论 -
SimpleDateFormat不是线程安全的类
SimpleDateFormat不是线程安全的类,可能报各种异常原创 2017-01-13 09:24:32 · 805 阅读 · 0 评论 -
java泛型的一些常见用法
java泛型常见写法原创 2017-02-09 08:57:30 · 4274 阅读 · 0 评论 -
JDK8新特性:使用Method References实现方法复用,简化lambda表达式
之前的文章已经介绍了函数式接口与lambda表达式,这篇文章主要学习下方法引用。使用方法引用,可以减少lambda表达式的书写,在Stream API中很常用。我们想实现整数list的排序,使用lambda我们还得自己编写一个Comparator对象(虽然也很简单),实际上JDK类库已经提供了类似的实现,我们通过Integer::compare就可以引用已经存在的方法。原创 2017-01-18 10:36:19 · 1896 阅读 · 1 评论 -
java中的4种reference的差别和使用场景(含理论、代码和执行结果)
我们知道java语言提供了4种引用类型:强引用、软引用(SoftReference)、弱引用(WeakReference)和幽灵引用(PhantomReference),与引用密切相关的,还有一个引用队列ReferenceQueue。引用和引用队列的关系,对于垃圾回收来说非常重要,学习垃圾回收机制,必须要先了解引用和引用队列的使用方法。本文主要参考网上的一些理论,同时配合自己的一些测试代码,更好的理解这些概念,也解决了之前博客中遗留的问题。原创 2014-09-21 18:31:28 · 13579 阅读 · 3 评论 -
解决java中ZipFile解压缩时候的中文路径和乱码问题
JAVA中对jar文件或zip文件解压的时候,可以使用JDK内置的API:JarFile和ZipFile,在windows下解压这2种格式文件的时候,经常报以下错误:Exception in thread "main" java.lang.IllegalArgumentException: MALFORMED at java.util.zip.ZipCoder.toString(ZipCo原创 2014-10-24 17:56:26 · 16239 阅读 · 0 评论 -
java字节序、主机字节序和网络字节序扫盲贴
java程序员是幸福,因为xiang原创 2014-04-08 21:31:54 · 15379 阅读 · 0 评论 -
java.lang.SecurityException: Prohibited package name
今天在看《深入理解 Java 虚拟机 (JVM 高级特性与最佳实践)》关于垃圾回收的一些知识。自己建立了一个java工程,敲了一下书上写的代码。运行java程序的时候报错:java.lang.SecurityException: Prohibited package name: java.gc.aty我的代码如下:package java.gc.aty;public class原创 2014-05-08 21:50:47 · 6302 阅读 · 2 评论 -
使用javac和java命令编译和执行程序,学习隐藏在IDE背后的知识
学习java的程序员,没有不知道Eclipse的,这个强大的IDE极大的提高我们的开发效率。编写好代码后,我只需要简单的run as就能运行程序了。这种方式很简单快捷,但是让我们对于IDE的依赖更加严重了,甚至不能离开IDE了,以至于很多程序员在linux都不会运行自己的java程序了。这里简单介绍下JDK的2个命令javac和java,来手动编译和运行我们的程序。 首先我们用Ecl原创 2014-04-24 08:23:41 · 2921 阅读 · 0 评论 -
JDK1.6集合框架bug:c.toArray might (incorrectly) not return Object[] (see 6260652)
最近在看JDK的源码:原创 2014-06-12 20:40:12 · 3913 阅读 · 3 评论 -
java文件读取的路径问题解惑和最佳实践,让你远离FileNotFoundException
使用java读取jar或war下的配置文件,是开发者经常需要处理的事情,大家是不是经常遇到FileNotFoundException呢?java读取文件的方式也有很多,比如new File(),Class.getResource(),ClassLoader.getResource(),这些方式的差别是什么呢?开源框架struts2的ClassLoaderUtils和Spring提供ClassPat原创 2014-07-02 23:22:38 · 18079 阅读 · 1 评论 -
java只使用try和finally不使用catch的原因和场景
JDK并发工具包中,很多异常处理都使用了如下的结构,如AbstractExecutorService,即只有try和finally没有catch。class X { private final ReentrantLock lock = new ReentrantLock(); // ... public void m() { lock.lock();原创 2014-07-26 17:19:18 · 21240 阅读 · 1 评论 -
eclipse黄色警告(finally block does not complete normally) ,不建议在finally中使用return语句
在eclipse中编写如下的代码,eclipse会给出黄色告警:finally block does not complete normally。public class Test{ public static void main(String[] args) { System.out.println(m1(null)); } public原创 2014-08-04 14:51:35 · 4298 阅读 · 0 评论 -
java获取Unsafe类的实例和取消eclipse编译的错误和警告
JRE的rt.jar中提供了一个类sun.misc.Unsafe,虽然这个类因为其不其安全性,不建议使用,而且被加了诸多限制;但是在很多场合下我们确实需要这个类提供的强大功能。JDK类库下的NIO和concurrent包下的很多类都使用到了Unsafe类,如AtomicInteger和AbstractQueuedSynchronizer等。 JDK源码中对这个类进行了严格限制,我们原创 2014-07-29 20:01:37 · 5774 阅读 · 0 评论 -
System.gc()和-XX:+DisableExplicitGC启动参数,以及DirectByteBuffer的内存释放
我们知道java代码无法强制JVM何时进行垃圾回收,也就是说垃圾回收这个动作的触发,完全由JVM自己控制,它会挑选合适的时机回收堆内存中的无用java对象。代码中显示调用System.gc(),只是建议JVM进行垃圾回收,但是到底会不会执行垃圾回收是不确定的,可能会进行垃圾回收,也可能不会。什么时候才是合适的时机呢?一般来说是,系统比较空闲的时候(比如JVM中活动的线程很少的时候),还有就是内存不足,不得不进行垃圾回收。我们例子中的根本矛盾在于:堆内存由JVM自己管理,堆外内存必须要由我们自己释放;堆内存的原创 2014-09-19 22:11:44 · 27073 阅读 · 7 评论 -
Effective Java Item7:Avoid Finalizers,解释为什么finalize是不安全的,不建议使用
在讨论如何回收堆外内存的时候,提到“NIO中direct memory的释放并不是通过finalize(),因为finalize不安全而且影响能”。Effective Java一书中也提到:Avoid Finalizers。人都有潜在的叛逆意识,别人给的结论或者制定的规范,除非有足够的理由说服你,除非懂得这么做背后的原因,否则只能是死记硬背,没有形象深入的理解,不能学到真正的东西。本文通过自己的理解和一些实际的例子,和大家一起更形象的理解finalize。还是那句经典的话“talking is cheap,原创 2014-09-21 15:38:03 · 5848 阅读 · 3 评论 -
使用sun.misc.Cleaner或者PhantomReference实现堆外内存的自动释放
之前的一篇博客:System.gc()和-XX:+DisableExplicitGC启动参数,以及DirectByteBuffer的内存释放 文章末尾处:提到java NIO包是通过sun.misc.Cleaner和PhantomReference来实现堆外内存的自动释放的。现在我们来学习下Cleaner和PhantomReference的使用,自己封装实现堆外内存的自动释放。sun.misc.Cleaner是JDK内部提供的用来释放非堆内存资源的API。 Cleaner.create()需要2个参数:第原创 2014-09-21 20:57:36 · 7254 阅读 · 0 评论 -
关于finalize机制和引用、引用队列的一些结论
C++有析构函数这个东西,能够很好地在对象销毁前做一些释放外部资源的工作,但是java没有。Object.finalize()提供了与析构函数类似的机制,但是它不安全、会导致严重的内存消耗和性能降低,应该避免使用。best practice是:像java类库的IO流、数据库连接、socket一样,提供显示的资源释放接口,程序员使用完这些资源后,必须要显示释放。所以可以忘记Object.finali原创 2014-09-22 16:46:54 · 3704 阅读 · 0 评论 -
文章汇总:关于java的finalize,引用和引用队列,自动释放系统外部资源的一些文章
之前写过一篇博客,关于非堆内存如何自动释放的,由此慢慢延伸写了几篇关于垃圾回收、finalize机制、引用和引用队列、sun.misc.Cleaner相关的文章,通过这几篇文章感觉自己收获很大了,对java垃圾回收相关的知识了解更深刻了。这篇博客主要做个汇总和简介,按照自己思路的延伸,把博客汇总下,方便大家阅读和查看。原创 2014-09-22 21:35:32 · 1897 阅读 · 0 评论 -
SQL或HQL预编译语句,能够防止SQL注入,但是不能处理%和_特殊字符
最近项目在做整改,将所有DAO层的直接拼接SQL字符串的代码,转换成使用预编译语句的方式。个人通过写dao层的单元测试,有以下几点收获。dao层代码如下//使用了预编译sqlpublic List selectConfigBySuffix(String suffix){ String hql = "from IndvConfigModel where configKey原创 2014-09-04 14:58:28 · 4101 阅读 · 0 评论 -
使用HashMap需要注意的事儿:不要暴露Map.entry给外部不可信代码Map.entrySet()
通过Map.entrySet()的返回结果,能够删除原始HashMap中存储的键值对。如果我们将Set<Map.Entry<String, String>> allEntrys 作为函数参数传递给不可信代码,那么外部的恶意代码就能删除原始HashMap中存储的数据。所以我们应该避免传递Set<Map.Entry<String, String>>作为函数参数,防止外部代码恶意的或者不小心修改了原始的数据。这个隐藏的功能不是所有的java程序员都知道,所以需要注意下,以免编程出错。原创 2014-09-17 19:30:15 · 2295 阅读 · 0 评论 -
JDK8新特性:使用stream、Comparator和Method Reference实现集合的优雅排序
大家对java接口Comparator和Comparable都不陌生,JDK8里面Comparable还和以前一样,没有什么改动;但是Comparator在之前基础上增加了很多static和default方法。本文主要结合JDK的stream编程,学习下Comparator。stream().sorted()/Comparator.naturalOrder()/Comparator.reverseOrder(),要求元素必须实现Comparable接口。原创 2017-02-05 13:23:55 · 27810 阅读 · 0 评论