HashSet和TreeSet区别:
//主要是两方面:1、底层数据结构的实现;2、如何实现唯一性
HashSet:底层数据结构是哈希表,线程不安全.
HashSet是如何保证元素唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成。
如果元素的HashCode值相同,才会判断equals是否为true。
如果元素的hashcode值不同,不会调用equals。
TreeSet:底层数据结构是二叉树.
保证元素唯一性的依据:compareTo方法return 0.
方法一、实现comparable接口,重写compareTo()方法。
方法二、自定义比较器实现Comparator接口
当元素自身不具备比较性或者具备的比较性不是所需要的,这时,就需要让容器自身具备比较性;在集合初始化时,就具有比较方式。
TreeSet ts =new TreeSet(new MyCompare());
HashSet和HashMap的区别:
*HashMap* | *HashSet* |
HashMap实现了Map接口 | HashSet实现了Set接口 |
HashMap储存键值对 | HashSet仅仅存储对象 |
使用put()方法将元素放入map中 | 使用add()方法将元素放入set中 |
HashMap中使用键对象来计算hashcode值 | HashSet使用成员对象来计算hashcode值,对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性,如果两个对象不同的话,那么返回false |
HashMap比较快,因为是使用唯一的键来获取对象 | HashSet较HashMap来说比较慢 |
Hashtable和HashMap的区别:
1、hashMap允许空键值,而hashTable不允许(因为要根据键来寻找对应的值)。
2、hashTable方法是同步的(synchronized),而hashMap不是。
3、HashTable继承自Dictionary类
public class Hashtable<K,V>extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable {}而 HashMap继承自AbstractMap,是Map 接口的一个实现;
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable{}★ 这也说明了两者的相同点都是Map接口的实现。
HashMap和TreeMap,linkedHashMap的区别:
HashMap是基于哈希表的Map接口的实现,并允许使用null值和null键。此类不保证映射的顺序,特别是他不保证该顺序恒久不变。
TreeMap是基于红黑树的NavigableMap实现。该映射根据其键的自然顺序进行排序,或者根据映射时创建的Comparator进行排序。
LinkedHashMap 是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现。
ConcurrentMap和HashMap的区别:
1、ConcurrentMap 是线程安全的,而hashMap不是线程安全的。
2、hashMap可以有null的键,concurrentMap不可以有。
3、ConcurrentMap的操作都是原子操作,hashMap不是。ConcurrentMap
提供其他原子putIfAbsent、remove、replace 方法的 Map。
keyset 和 entryset的区别:
keyset()迭代后只能通过get()取value.
entrySet():迭代后可以e.getKey(),e.getValue()取key和value。返回的是Entry接口(接口Map的一个内部接口).
Keyset()的速度比entryset()慢。
LinkedList,ArrayList,Vector的区别:
1、LinkedList使用双链表来实现,很适合数据的动态插入、删除,随机访问和遍历速度比较慢。此外,它还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素。
2、 ArrayList 采用数组的形式来保存对象,这种方式将对象放在连续的位置中,最大缺点是插入删除比较麻烦。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。
3、Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。
ArrayList在内存不够时默认是扩展50% + 1个,Vector是默认扩展1倍。