技术知识的整理,也是对自己的一个巩固,如果这个整理能够对大家有所帮助,那也是极好的。如有写的不对的,欢迎指正。
下面就开始正题
1、String,StringBuffer,StringBuilder的区别
String代表字符串,字符串的值一旦被创建后不能被修改。
StringBuffer是线程安全的,可变的字符串序列,字符缓冲区可以看做是一个String。StringBuffer在字符串操作时,不生成新的对象,再改变对象引用,在内存上使用要优于String类,对于需要对字符串进行大量的插入或者删除操作的情况下,建议使用StringBuffer
StringBuilder是非线程安全的,基本用法和StringBuffer相同,效率比StringBuffer要高,单线程场景(通常情况)建议使用StringBuilder。
在很多项目中经常看到通过“+”来往String字符串后面添加一个字符,但是这种方式和使用StringBuffer中的append()方法相比,效率要低,因为使用“+”操作符时,字符串对象都需要寻找一个新的内存空间来容纳更大的字符串,这是一个耗时的过程,但是StringBuffer在字符串操作时时不用生成新的对象的,很好的避免了这个问题。
注意:这里有一个特别的地方,下面举个例子说明
方式一:String str = "this is a" + " simple" + " test";
方式二:StringBuffer sb = new StringBuffer("this is a").append("simple").append("test");
方式三:String str1 = "this is a";
String str2 = " simple";
String str3 = " test";
String str = str1 + str2 + str3;
对比以上三种情况,效率比较 方法一>方法二>方法三。因为方法一JVM会解释成StringBuilder来拼接,对于JVM来说就像是String str = "this is a simple test";方法三是通过String字符串不同对象间的拼接,是要重新分配内存的。
复制代码
2、hashmap与hashtable区别
对于程序员来说,Java代码开发过程中,对于集合关心的问题无非就是线程安全性以及效率问题,那么对于常用的HashMap与HashTable集合类,他们在线程安全性与效率上有什么区别呢?
HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行 )。HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。
另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。
由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。
HashMap不能保证随着时间的推移Map中的元素次序是不变的。
解释:Fail-safe和iterator迭代器相关。如果某个集合对象创建了Iterator或者ListIterator,然后其它的线程试图“结构上”更改集合对象,将会抛出ConcurrentModificationException异常。但其它线程可以通过set()方法更改集合对象是允许的,因为这并没有从“结构上”更改集合。但是假如已经从结构上进行了更改,再调用set()方法,将会抛出IllegalArgumentException异常。
HashMap同步方法
HashMap可以通过下面的语句进行同步:
Map m = Collections.synchronizeMap(hashMap);
讲到这里,我们就需要知道ConcurrentHashMap的原理了,这也是面试官一般都会深挖的内容。这里大家可以在这里看看:
https://www.cnblogs.com/ITtangtang/p/3948786.html
复制代码