Currently browsing tag

java

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: 使用静态工厂方法” »

可扩展的中小型推介系统实践

本文的目的是描述如何使用 Mahout 开发/部署一个可扩展的中小型推介系统

我会一步一步的描述如何用 Mahout 搭建一个这样的推介系统。本文假设读者对 Mahout 有所了解,熟悉 Mahout 中的协同过滤(Collaborative Filtering)推介算法。本文不会描述 CF 相关的具体算法。

场景描述

这是最近在做的一个推介系统的实际场景。垂直领域的视频播放网站,用户访问我们的网站观看视频,我们根据用户的观看记录向用户推介其可能感兴趣的视频。

  1. 视频数量:几千或几万
  2. 用户数量:几十万
  3. 用户每播放完一个视频后,在视频播放页面显示用户可能喜欢的其他视频
  4. 所有的播放请求中,20% 是登陆用户,80% 为未登陆的匿名用户(由于版权的原因,有些视频必须登陆付费之后才能观看,所以登陆用户的比例很高)

阅读全文 “可扩展的中小型推介系统实践” »

内部匿名类无法访问外面的非 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 参数解析方法的性能比较” »