Generics(ジェネリクス(総称))・Type Safe(タイプセーフ(型の安全性))

1.5以降

interface EmpService {
    List<Emp> getEmps(int deptNo);
}
List<Emp> emps = empService.getEmps(10);
for(int i = 0; i < emps.size(); i++) {
    Emp emp = emps.get(i); // キャストの必要なし・コード量減る
    // 処理
}
for(Emp emp : emps) { // 拡張forループ使えばもっとコード量減る
    // 処理
}

1.4以前

interface EmpService {
    List getEmps(int deptNo);
}
List emps = empService.getEmps(10);
for(int i = 0; i < emps.size(); i++) {
    Emp emp = (Emp) emps.get(i); // キャストが必要・ClassCastExceptionになるかどうかは実行時までわからない
    // 処理
}
Object obj = emps.get(i);
if(obj instanceof Emp) { // なのでこんな感じでチェックする必要があり・ロジック増える
    Emp emp = (Emp) obj;
    // 処理
}
see also: Javaプログラマであるかを見分ける10の質問 3.List<Integer>のようにジェネリクス型を使う主たる目的は何か

文字列連結、java.lang.StringBuilder、java.lang.StringBuffer

public static final void main(String[] args) {
        int i = 0;
        String str = String.valueOf(i);
        long start = System.currentTimeMillis();
        while(i < 100000) {
            str = str + "/" + (i++);
        }
        long end = System.currentTimeMillis();
        System.out.println("[+]=" + (end - start));// #1=114719, #2=108078, #3=114188
    }
public static final void main(String[] args) {
        int i = 0;
        StringBuilder builder = new StringBuilder(i);
        long start = System.currentTimeMillis();
        while(i < 100000) {
            builder.append("/").append(i++);
        }
        long end = System.currentTimeMillis();
        System.out.println("[StringBuilder]=" + (end - start));// #1=15, #2=15, #3=16
    }
public static final void main(String[] args) {
        int i = 0;
        StringBuffer buffer = new StringBuffer(i);
        long start = System.currentTimeMillis();
        while(i < 100000) {
            buffer.append("/").append(i++);
        }
        long end = System.currentTimeMillis();
        System.out.println("[StringBuffer]=" + (end - start));// #1=16, #2=47, #3=15
    }
see also: Javaプログラマであるかを見分ける10の質問 「文字列の+演算子による連結とStringBuilderを使った連結の違いを説明せよ。」

==演算子とjava.lang.Object#equals(Object)メソッド

public class Equals {
    public static final void main(String[] args) {
        final String aaa0 = "aaa";
        final String aaa1 = "aaa";
        System.out.println("aaa0 == aaa1 : " + (aaa0 == aaa1));// -> true
        final String aaa2 = new String("aaa");
        final String aaa3 = new String("aaa");
        System.out.println("aaa2 == aaa3 : " + (aaa2 == aaa3));// -> false
        System.out.println("aaa2 equals aaa3 : " + (aaa2.equals(aaa3)));// -> true
        
        final Integer one0 = 1;
        final Integer one1 = 1;
        System.out.println("one0 == one1 : " + (one0 == one1));// -> true
        final Integer one2 = new Integer(1);
        final Integer one3 = new Integer(1);
        System.out.println("one2 == one3 : " + (one2 == one3));// -> false
        System.out.println("one2 equals one3 : " + (one2.equals(one3)));// -> true
        
        final Hoge hoge0 = new Hoge(0);
        final Hoge hoge1 = new Hoge(0);
        System.out.println("hoge0 == hoge1 : " + (hoge0 == hoge1));// -> false
        System.out.println("hoge0 equals hoge1 : " + (hoge0.equals(hoge1)));// -> true
    }
}
class Hoge {
    private int i;
    public Hoge(int i) {
        this.i = i;
    }
    public int getI() {
        return i;
    }
    @Override public boolean equals(Object obj) {
        return obj instanceof Hoge ? ((Hoge) obj).getI() == i : false;
    }
    @Override public int hashCode() {
        return i;
    }
}
see also: Javaプログラマであるかを見分ける10の質問 「==演算子とequalsメソッドの違いは何か?」