为什么JAVA很多类都放弃了安全而要速度呢
本文介绍了为什么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
来代替。
这篇关于为什么JAVA很多类都放弃了安全而要速度呢的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文