为什么JAVA很多类都放弃了安全而要速度呢

查看:114
本文介绍了为什么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来做呢,答案很显然是不需要,因为这是在一个方法的内部,一个局部变量是不可能会遇到线程安全问题的。

HashMapHashTable也是同理,如果你是局部变量那只需要选择HashMap就可以了。如果是全局变量且会有多个线程同时操作该变量的情况当然是不能选择HashMap,而是要选择HashTable这种线程安全的类型,但是现在HashTable被选择的也会很少是因为有了更好的选择如ConcurrentHashMap来代替。

这篇关于为什么JAVA很多类都放弃了安全而要速度呢的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆