为什么JAVA很多类都放弃了安全而要速度呢
比如hashmap和hashtable，arrylist和vector这种的，我学的时候都说是xxx不用了，区别是一个安全一个不安全，当然hashtable那个还有个null的区别，为啥要用不安全的呢
什么叫`放弃安全而要速度`。
这认识错的太远了，需要线程安全的情况下当然是`必须`要使用线程安全的类型了，不需要自然是可以不用使用了。
如下代码
```
public void m() {
    int i = 0;
    String s = "string" + i;
    System.out.println(s);
}
```
`JDK`会将字节码编译成如下
```
  public void m();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=3, args_size=1
         0: iconst_0
         1: istore_1
         2: new           #2                  // class java/lang/StringBuilder
         5: dup
         6: invokespecial #3                  // Method java/lang/StringBuilder."<init>":()V
         9: ldc           #4                  // String string
        11: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        14: iload_1
        15: invokevirtual #6                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
        18: invokevirtual #7                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
        21: astore_2
        22: getstatic     #8                  // Field java/lang/System.out:Ljava/io/PrintStream;
        25: aload_2
        26: invokevirtual #9                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        29: return
```
可以很清楚的看到字节码中将字符串连接编译成`StringBuilder`的方式，我们知道`JDK`还提供了一个`StringBuffer`线程安全的字符串操作类。那`JDK`编译时为什么不选择`StringBuffer`来做呢，答案很显然是`不需要`，因为这是在一个方法的内部，一个`局部变量`是不可能会遇到`线程安全`问题的。
而`HashMap`与`HashTable`也是同理，如果你是`局部变量`那只需要选择`HashMap`就可以了。如果是`全局变量`且会有多个线程同时操作该变量的情况当然是不能选择`HashMap`，而是要选择`HashTable`这种线程安全的类型，但是现在`HashTable`被选择的也会很少是因为有了更好的选择如`ConcurrentHashMap`来代替。