摘要: 每当你打开的Linux虚拟主机的时候,通常是为了完成工作。但是,一台普通的Linux主机上,有成千上万的开发者开发的软件,你能保证他们都是这么正经的? Linux的软件有加一些有趣的彩蛋的传统。本文主要是介绍一些有趣的命令和选项,让你的生活更多彩一些。这些并非全是彩蛋,不过我相信你多少会喜欢它们的。 文本编辑器 vim和Douglas Adams 熟悉Douglas Adams(也就是The Hitchhiker's Guide to the Galaxy一书的作者)的人,vim编辑器有个帮忙选项会让你赞不绝口。 如果你还没装vim。在Ubuntu/Debian,你可以这样:sudo 阅读全文
posted @ 2014-03-13 11:26 spidercoco 阅读(2374) 评论(0) 推荐(0)
摘要: 本文主要讨论下不同的hashCode()的实现对应用程序的性能影响。hashCode()方法的主要目的就是使得一个对象能成为hashMap的key或者存储到hashset中。这种情况下对象还得实现equals(Object)方法,它的实现和hashCode()必须是一致的: 如果a.equals(b)那么a.hashCode == b.hashCode() 如果hashCode()在同一个对象上被调用两次,它应该返回的是同一个值,这表明这个对象没有被修改过。 hashCode的性能从性能的角度来看的话,hashCode()方法的最主要目标就是尽量让不同的对象拥有不同的hashCode... 阅读全文
posted @ 2014-04-03 15:01 spidercoco 阅读(1876) 评论(0) 推荐(0)
摘要: 时不时的我就会听见有人抱怨说,他的HotSpot JVM不停的在垃圾回收,可是每次回收完后堆却还是满的。当他们发现这是因为JVM的内存已经不够了之后,通常会问这么个问题,为什么JVM不抛一个OutOfMemoryError(OOME)呢?毕竟来说,由于内存不足,我的程序都已经没法继续跑了,对吧?先说重要的,如果你运气好的话,你永远不会发现你的JVM其实在你身上下了个庞氏骗局的套。它会一直告诉你,你的内存是无限的,就只管去用就好了。JVM的垃圾回收器会一直维持这么个错觉,在内存这一亩三分地上,啥事都好着呢。然而在这个领域里可不止这一个庞氏骗局而已。操作系统处理内存也是这么副德性。你会不停的分配本 阅读全文
posted @ 2014-04-03 14:39 spidercoco 阅读(4530) 评论(0) 推荐(0)
摘要: JDBC的保存点(Savepoint)是什么,如何使用?有时候事务包含了一组语句,而我们希望回滚到这个事务的某个特定的点。JDBC的保存点可以用来生成事务的一个检查点,使得事务可以回滚到这个检查点。一旦事务提交或者回滚了,它生成的任何保存点都会自动释放并失效。回滚事务到某个特定的保存点后,这个保存点后所有其它的保存点会自动释放并且失效。可以读下这个了解更多关于JDBC Savepoint的信息。 JDBC的DataSource是什么,有什么好处?DataSource即数据源,它是定义在javax.sql中的一个接口,跟DriverManager相比,它的功能要更强大。我们可以用它来创建数据库. 阅读全文
posted @ 2014-03-19 08:29 spidercoco 阅读(402) 评论(0) 推荐(0)
摘要: 什么是JDBC,在什么时候会用到它?JDBC的全称是Java DataBase Connection,也就是Java数据库连接,我们可以用它来操作关系型数据库。JDBC接口及相关类在java.sql包和javax.sql包里。我们可以用它来连接数据库,执行SQL查询,存储过程,并处理返回的结果。JDBC接口让Java程序和JDBC驱动实现了松耦合,使得切换不同的数据库变得更加简单。 有哪些不同类型的JDBC驱动?有四类JDBC驱动。和数据库进行交互的Java程序分成两个部分,一部分是JDBC的API,实际工作的驱动则是另一部分。A JDBC-ODBC Bridge plus ODBC Dri. 阅读全文
posted @ 2014-03-18 08:09 spidercoco 阅读(1534) 评论(0) 推荐(0)
摘要: Java会将源代码中的字符串常量存储到常量池中。也就是说,当你这么写的时候:{% highlight java %}String a = "I am a string";String b = "I am a string";{% endhighlight %} 变量a和变量b是同一个值。这不只是说它俩的值是一样的,而是说就是同一个字符串对象。用Java的话来说就是a==b的结果是true。然而这个只对字符串以及小的整型或者长整型有效。其它的对象是不会被驻留的,也就是说如果你创建了两个对象而他们的值是相等的,但他们并不是同一个对象。这个问题有时候很讨厌,尤 阅读全文
posted @ 2014-03-17 08:58 spidercoco 阅读(342) 评论(0) 推荐(0)
摘要: 本系列文章译自Venkat Subramaniam的Functional Programming in Java查找元素现在我们对这个设计优雅的转化集合的方法已经不陌生了,但它对查找元素却也是无能为力。不过filter方法却是为这个而生的。我们现在要从一个名字列表中,取出那些以N开头的名字。当然可能一个也没有,结果可能是个空集合。我们先用老方法实现一把。final List startsWithN = new ArrayList();for(String name : friends) {if(name.startsWith("N")) {startsWithN.add(n 阅读全文
posted @ 2014-03-17 08:57 spidercoco 阅读(623) 评论(0) 推荐(0)
摘要: 本系列文章译自Venkat Subramaniam的Functional Programming in Java列表的转化将集合转化成一个新的集合就和遍历它一样简单。假设我们要将列表中的名字转化成全大写的。我们看下都有哪些实现方式。Java中的字符串是不可变的,所以它没法改变。我们可以生成新的字符串,用来替换列表中原有的元素。然而这样做的话,原来列表就没了;还有一个问题,原来的列表可能也是不可变的,比如Arrays.asList()生成的,所以修改原来的列表这招不行。还有一个缺点就是这样做很难并行操作。生成一个新的全大写的列表是个不错的选择。乍听起来这个建议弱爆了;性能是我们都很关注的一个问题 阅读全文
posted @ 2014-03-16 00:34 spidercoco 阅读(1130) 评论(0) 推荐(0)
摘要: 本系列文章译自Venkat Subramaniam的Functional Programming in Java第二章:集合的使用我们经常会用到各种集合,数字的,字符串的还有对象的。它们无处不在,哪怕操作集合的代码要能稍微优化一点,都能让代码清晰很多。在这章中,我们探索下如何使用lambda表达式来操作集合。我们用它来遍历集合,把集合转化成新的集合,从集合中删除元素,把集合进行合并。遍历列表遍历列表是最基本的一个集合操作,这么多年来,它的操作也发生了一些变化。我们使用一个遍历名字的小例子,从最古老的版本介绍到现在最优雅的版本。用下面的代码我们很容易创建一个不可变的名字的列表:final Lis 阅读全文
posted @ 2014-03-15 10:15 spidercoco 阅读(525) 评论(0) 推荐(0)
摘要: 本系列文章译自Venkat Subramaniam的Functional Programming in Java第四节:进化而非革命我们用不着转向别的语言,就能享受函数式编程带来的好处;需要改变的只是使用Java的一些方式。C++,Java,C#这些语言都支持命令式和面向对象的编程。不过现在它们都开始投入函数式编程的怀抱里了。我们刚才已经看到了这两种风格的代码,并讨论了函数式编程能带来的好处。现在我们来看下它的一些关键概念和例子来帮助我们学习这种新的风格。Java语言的开发团队花费了大量的时间和精力把函数式编程的能力添加到了Java语言和JDK里。要享受它带来的好处,我们得先介绍几个新的概念。 阅读全文
posted @ 2014-03-13 23:49 spidercoco 阅读(519) 评论(0) 推荐(0)
摘要: 听到ThreadSafe这个东西我的第一反应就是, ”天啊,又出了一个静态代码分析工具”。在内部开发中引入了像PMD或者FindBugs这类的工具,又花了不少时间优化成零警告后,我感觉已经不再需要其它的工具了。不过我真的错了。ThreadSafe这个工具跟别的代码分析工具一样,但有一点不同,它更专注于Java开发中一个非常重要的领域——并发。Contemplate的小伙伴们太给力了,他们注意到了需要有这么个工具,能快速定位到代码中可能存在的并发,多线程相关的问题。这个工具有两种使用方法——Eclipse插件或者Sonar插件。我用了下它的Eclipse插件去分析了inspectIT的源码,我们 阅读全文
posted @ 2014-03-13 21:29 spidercoco 阅读(881) 评论(0) 推荐(0)