Currently browsing category

编程语言

Effective Java: 使用静态工厂方法

这是 Effective Java 的第一节的标题。本文更多的是摘译该节的内容。

什么是静态工厂方法(static factory methods)

static factory methods 翻译过来就是静态工厂方法。它并不是 GOF 提的设计模式中的一个设计模式。
我们看下面的例子(摘自JDK 1.7)。

public final class Boolean implements java.io.Serializable,
        Comparable<boolean> {

    public static final Boolean TRUE = new Boolean(true);
    public static final Boolean FALSE = new Boolean(false);
        
    public static Boolean valueOf(boolean b) {
        return (b ? TRUE : FALSE);
    }
}</boolean>

我们要获取一个 Boolean 的一个对象,可以使用构造函数 new Boolean(true) 也可以使用里面的静态方法 Boolean.valueOf(true),后者便是静态工厂方法。
阅读全文 “Effective Java: 使用静态工厂方法” »

Scala 数据统计之 Hello World

最近要做一个报表,可是其中有一项 CDN 相关的数据就是不对,差了好几个数量级。于是我从最原始的数据源头开始分析。下面的几行是我们的数据的样本,我们需要统计其中数字部分的总和。
需求有了,那我们应该用什么工具来进行统计呢? 我们有各种的脚本语言可以帮我们完成这个统计任务,甚至我们还可以写 Java 程序来统计。在这篇文章中,我想演示的是如何用 Scala 完成任务。Scala 丰富的 Collection 的类型,及其相应的一些方法,使得 Scala 非常的适合于这类型的数据统计的任务。

下面便是我们要统计的数据的一个片段,每一行都类似于 JSON 的一个 Object,Key 是 CDN 的名称,Value 是对应的 CDN 下载的流量(当然了,这里的 CDN 名称是做过处理的啦~)。我们统计所有的 Value 的总和。这里我用正则表达式的方式去获取 Value。对于每个匹配:(\d+)的 Match,我们取其的 group(1),再toLong就可以得到 CDN 的下载量。
阅读全文 “Scala 数据统计之 Hello World” »

内部匿名类无法访问外面的非 final 的变量的问题

这个题目有点拗口,其实我更多的是想说 Java 内部类的一些特性。

之所以会想起这个题目只要是最近在阅读 JDK 源码中关于 HTTP keepalive 的代码时,其中一个源文件 sun.net.www.protocol.http.HttpURLConnection.java 无意中看到下面这段代码。(注意高亮部分的代码)

final boolean result[] = {false};
java.security.AccessController.doPrivileged(new java.security.PrivilegedAction() {
    public Object run() {
        try {
            InetAddress a1 = InetAddress.getByName(h1);
            InetAddress a2 = InetAddress.getByName(h2);
            result[0] = a1.equals(a2);
        } catch (UnknownHostException e) {
        } catch (SecurityException e) {
        }
        return null;
    }
});

return result[0];

阅读全文 “内部匿名类无法访问外面的非 final 的变量的问题” »

五种不同的 URL 参数解析方法的性能比较

因为在我们的项目中需要解析日志中的 URL 的参数,所以我对比了一下五种不同 的 URL 参数解析方法的性能。

URL 参数解析方法
  1. httpclient org.apache.http.client.utils.URLEncodedUtils
  2. URLEncodedUtils.parse(query, Charset.forName("UTF-8"));
    
  3. jettyUtil org.eclipse.jetty.util.UrlEncoded
  4. MultiMap values = new MultiMap();
    UrlEncoded.decodeTo(query, values, "UTF-8", 1000);
    
  5. tomcat org.apache.catalina.util.RequestUtil
  6. Map values = new HashMap();
    RequestUtil.parseParameters(values, query, "UTF-8");
    
  7. regex 正则表达式
  8. String u = URLDecoder.decode(url, "UTF-8");
    for (String s : parameters) {
        Pattern p = Pattern.compile(s + "=([^&]*)(&|$)");
        Matcher m = p.matcher(u);
        if (m.find()) {
            m.group(1);
        }
    }
    
  9. split 使用String 的split 方法对 URL 进行分割,然后用equals 匹配对应的 参数
  10. String u = URLDecoder.decode(url, "UTF-8");
    for (String s : parameters) {
        String[] a = new String[100];
        if (u.indexOf(s) != -1) {
            a = (u.substring(u.indexOf(s))).split("&");
            a[0].split("=");
        }
    }
    

阅读全文 “五种不同的 URL 参数解析方法的性能比较” »