## java基础知识之——集合 ##
list集合、set集合和Map集合作用以及常用实现类
list、set、Map集合的作用,就是用于存储集合数据的,准确来说,list和set集合用来存储单列集合,Map用来存储双列集合数据的。
list集合常用的实现类有:ArrayList、linkedList、Vector;
他们的区别是: 1、ArrayList底层是数组结构,查询快,增删慢(每次增删需要移动插入点后面一串的数据),是线程不安全的,效率高。 2、Vector和ArrayList结构一样,区别就是,Vector是线程安全的,效率不高,是 JDK1.0的产物,已经被ArrayList取代。
set集合常用的实现类有:HashSet、TreeSet 、linkedHashSet;
他们的区别是: 1、HashSet底层是哈希表结构,由hashCode和equals方法保证元素唯一; 2、TreeSet底层是二叉树结构,根据比较的返回值是否是0来决定; 3、LinkedHashSet底层是由链表和哈希表组成,由链表保证有序,哈希表保证唯一。
Map集合常用的实现类有:HashMap、TreeMap;
他们的区别是: 1、HashMap底层是哈希表结构,存储的结果是无序的; 2、TreeMap底层是二叉树结构,可以对键值进行排序;
是否必须同时重写hashCode 和equal方法,为什么?
是必须的,equal和hashcode的关系是如下的:
1、equal方法比较的是两个对象的地址值,hashCode返回的是对象的地址值。 2、如果两个对象相同,那么他们的HashCode值一定要相同,如果两个对象的HashCode值相同,他们不一定相同; 3、比较两个对象的HashCode值,如果他们的HashCode值相同,再进行equa比较,如果hashCode值不相同, 则这两个对象肯定不一样, 不必进行equal比较了。hashCode先进行比较是为了提高效率;
HashMap的数据结构与hashtable,concurrentHashMap的区别
1、HashMap是线程不同步的,因此存在线程安全问题,但是执行效率要高, 2、hashTable是线程同步的,因此是线程安全的(使用synchronize关键字来同步),但是执行效率低一些, 可以通过Iterator和 Enumeration进行数据遍历,不能接受null值。 3、concurrentHashMap融合了上面两者的优点,提高效率的同时,线程是安全的(引入了分割(Segment)); 4、synchronize会锁定整个数据表,而segment只会锁定需要put操作的同一个segment元素部分。