解惑

解己之惑,解人之惑

2006年11月 (第3页共6页)

Java正则表达式的性能问题

在编写EJB-QL的解析器的时候偶然发现的。
假设要解析的EJB-QL的值为:
SELECT OBJECT(al) FROM AppLibraryConfig al WHERE al.id=?1 AND al.status=true

下面看看不同的表达式Pattern所需要的执行时间,解析的伪代码为:
long start=System.currentTimeMillis();
Pattern pattern = Pattern.compile(getPatternText(), Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(query);
if (matcher.matches()) {
        int groupCount = matcher.groupCount();
        for (int i = 0; i <= groupCount; i++)
        {
            System.out.println("Group " + i + " :[" + matcher.group(i) + "]");
        }
}
System.out.println(System.currentTimeMillis()-start);

现在看看不同的getPatternText()的值得到的不同结果。
阅读全文

Session ID

下午一个朋友问我HttpServletRequest.getSession().getId()和HttpServletRequest.getRequestedSessionId()的差异,其实我以前也没有研究过这个差异,看了下API的说明,前者应该是属于服务器端的概念,这个值是存在于服务器的,后者是客户端的概念,也就是那个值是浏览器提交的。我们知道HTTP连接是无状态的,那么如何维护一个Session呢?其实就是通过这个HttpServletRequest.getRequestedSessionId(),如果大家细心一些,有时候会发现有时候浏览器的地址栏或者状态栏里面的地址后面会带一个sessionId的参数值,这个应该就是那个HttpServletRequest.getRequestedSessionId()的返回值了。而且这个值一般也会存在cookie里面,这样就避免了在每次请求的时候都带在请求的URL里面或者FORM里面,它是随着浏览器和服务器端的Cookie进行交流,对于用户和开发人员是透明的。

Java的日期的缺省格式

在做那个单元测试框架的时候要进行类型转换,对于日期型的值,先转换为String然后可能会转换回Date类型,但是转换回Date类型的时候一直出错,后来没有办法看JDK的源代码,才知道日期的缺省格式比较变态,你要把那种格式的字符串转换回Date需要使用:

new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);

很纳闷为什么不把new SimpleDateFormat()的时候就设置为这种格式,非要在Date类的toString方法中使用这样的格式。

过正常的生活

可以这么说,我以前的生活好像都不是很正常,每天想的都是和技术有关的东西,在公司的时候上班,下班以后马上回家,但是回去后还是打开电脑做自己感兴趣的事情,连吃饭都是填饱肚子就行。可以说,每天只有三种事情:用电脑、睡觉和吃喝拉撒行,没用娱乐,没用运动。
去年年底的时候开始感觉腰、脖子和手腕经常的酸痛,然后因为一些事情也就开始减少用电脑了,特别是下班回家以后,原来每天回家以后差不多至少还要用3个小时,后来就改为半个小时或者完全不用,看书、看电视或者看电影,有时候也会和老婆一起出去转转,现在酸痛的现象已经很大的好转了,只是偶尔还会疼。
开始感觉正常生活的重要性了,一个人,除了自己感兴趣的东西外,还是应该参与一些自己可能不是很感兴趣的活动,毕竟身体更重要,健康更重要。事业和理想确实也很重要,但是失去身体的依托,注定是失败。事业不必急于求成。

好用的工具会造成思维懒惰?

现在下载一直用迅雷,感觉非常不错,充分利用了服务器方式和P2P方式两种的优点又巧妙的避免的各自的缺点。当然,这个对于服务器提供者是不利的,这个不是今天的主题,暂且不谈。
其实想说的是由于它很好用,因此每次下载什么东西都是先搜索,那怕是一个电视剧,也差不多是点击搜索出来的结果一个一个的加。
今天在下载一个东西的时候突然想到了原来用FlashGet的时候是批量处理的,既然迅雷会自动搜索相关资源,那么为什么不能找到一个地址之后然后只修改一下文件名一次性把那些都加上呢?试了一下,效果非常的不错,所以说,好用的工具可能会造成思维的懒惰,慢慢的变成工具的奴隶。
当然,公欲善其事,必先利其器。

Java参数传递方式

其实这个问题我原来翻译(破除java神话之二:参数是传址的 )、转帖别人的详细解释(Java 应用程序中的按值传递语义 )和专门解释( 我对《Java 应用程序中的按值传递语义》的理解 )过,不过现在看来,原来翻译或者解释的角度是有问题的,从底层的角度解释并不直观,在交流的时候也容易引起误解,最终不能达成一致意见。下面以最终的效果来解释参数的传递方式:

1、对于原始数据类型,也就是int、 long、char之类的类型,是传值的,如果你在方法中修改了值,方法调用结束后,那个变量的值没用改变。
2、对于对象类型,也就是Object的子类,如果你在方法中修改了它的成员的值,那个修改是生效的,方法调用结束后,它的成员是新的值,但是如果你把它指向一个其它的对象,方法调用结束后,原来对它的引用并没用指向新的对象。
阅读全文

Java类的完整构造执行顺序

这里只说一个完整的结果,至于为什么是这样的顺序,可以参考我以前的文章:深入剖析java类的构造方式

  1. 如果父类有静态成员赋值或者静态初始化块,执行静态成员赋值和静态初始化块
  2. 如果类有静态成员赋值或者静态初始化块,执行静态成员赋值和静态初始化块
  3. 将类的成员赋予初值(原始类型的成员的值为规定值,例如int型为0,float型为0.0f,boolean型为false;对象类型的初始值为null)
  4. 如果构造方法中存在this()调用(可以是其它带参数的this()调用)则执行之,执行完毕后进入第7步继续执行,如果没有this调用则进行下一步。(这个有可能存在递归调用其它的构造方法)
  5. 执行显式的super()调用(可以是其它带参数的super()调用)或者隐式的super()调用(缺省构造方法),此步骤又进入一个父类的构造过程并一直上推至Object对象的构造。
  6. 执行类申明中的成员赋值和初始化块。
  7. 执行构造方法中的其它语句。

阅读全文

临城作弊大法

个人感觉模拟城市里面最大的两个BUG就是临城和垃圾焚烧厂,如果把这两个BUG利用起来,就可以利用一个小城市解决整个地图的垃圾问题,这样其它的城市的环境就可以大大的缓解。详细方法如下:

  1. 选择一个小城市开局,城市就叫垃圾城,先划街道,宽度为4,程度不限,但是为4的倍数,例如16,然后把路全部连好,然后全部盖垃圾焚烧厂,开始可能只能建三个钱就用得差不多了,注意把焚烧厂得经费调整为0。
  2. 然后建一排低密度住宅,旁边丢一个风力发电厂。
  3. 在旁边建一个其它得城市,注意和垃圾城有道路连接。
  4. 回到垃圾城进行临城交易,把进口量调到最大,全速运行城市,慢慢的把焚烧厂建满。
  5. 现在就可以开始其它的城市的建设了,注意要一个挨着一个的发展。

计划添加的功能

有了刚才的前车之鉴,把刚刚想到的两个功能记下来:

  • 一个是利用自定义的特性实现一个插件,可以自己设定日志为推荐日志,因为有些日志可能就是自己发牢骚的,而有些是自己感觉比较好的,这样可以在那些什么最新日志、热门日志和随机日志之外给出一个推荐日志
  • 第二个是实现一个像keso的昨日新闻类似功能的自动发帖功能,将自己当天收录在delicious上的书签自动发布一下。

灵感稍纵即逝

刚才去上厕所的时候突然有一个灵感,是关于那个单元测试框架的,但是回来刚刚准备记下来的时候却忘记了,到现在也没有想起来,很遗憾。

如果手边有个电脑什么的,随便记一下都可以,但是在上厕所的时候怎么办?回到电脑前想了一下其他的事情,结果就忘记了,不知道有没有什么好的办法解决这个问题。

好像不止一次出现这个问题了,难道是真的老了?

更早的文章 更新的文章

© 2025 解惑

本主题由Anders Noren提供向上 ↑