List和Map

List是一个接口,继承自Collections接口

一、List特点

元素有序,可重复

二、ArrayList,LinkedList与List的不同

1、List是接口类,ArrayList和LinkedList是List的实现类。
2、ArrayList是动态数组(顺序表)的数据结构。顺序表的存储地址是连续的,所以在查找比较快,但是在插入和删除时,由于需要把其它的元素顺序向后移动(或向前移动),所以比较耗时。
     Vector也是动态数组结构,但是是线程同步的
3、LinkedList是链表的数据结构。链表的存储地址是不连续的,每个存储地址通过指针指向,在查找时需要进行通过指针遍历元素,所以在查找时比较慢。由于链表插入时不需移动其它元素,所以在插入和删除时比较快。

三、List的基本方法

List<String> list = new ArrayList<String>();
list.add("java"); // 向集合追加元素
list.add(2, "hadoop");    // 向集合插入元素
System.out.println(list.get(2)); // 根据下标取出元素
System.out.println(list.size()); // 集合中元素的个数
list.remove(2);    // 根据下标删除某一个元素
list.contains("java"); //true 看集合中是否包含某一个对象,使用equals比较
list.contains(new String("ibm")); //true

equals与==区别:
1.==是比较对象的地址值,即判断是否是同一个对象
2.equals可以重写,这里比较的是内容是否相同
3.equals在Object中,比较的是是否为同一对象,与==相同

四、hashmap工作原理

一、基本概念

HashMap储存的是键值对;
HashMap可以接受null键值和值,而HashTable则不能;
HashMap是非synchronized;

二、工作原理

HashMap是基于hashing的原理,我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。

当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来储存Entry对象

HashMap是在bucket中储存键对象和值对象,作为Map.Entry

三、当两个对象的hashcode相同会发生什么?

因为hashcode相同,所以它们的bucket位置相同,‘碰撞’会发生。因为HashMap使用LinkedList存储对象,这个Entry(包含有键值对的Map.Entry对象)会存储在LinkedList中。

四、如果两个键的hashcode相同,你如何获取值对象?

找到bucket位置之后,会调用keys.equals()方法去找到LinkedList中正确的节点,最终找到要找的值对象

五、为什么hashmap是非线程安全的?

因为多线程会导致HashMap的Node链表形成环形数据结构,一旦形成环形数据结构,Node的next节点永远不为空,就会在获取Node时产生死循环

保证线程安全:

1、HashTable源码中是使用synchronized来保证线程安全的

2、ConcurrentHashMap,在8中CHM摒弃了Segment(包含一个segment数组,将数据分段存储,给每一段数据配一把锁,也就是所谓的锁分段技术)的概念,而是启用了一种全新的方式实现,利用CAS算法

3、SynchronizedMap也是使用synchronized来保证线程安全的

 六、Map的排序问题

TreeMap默认升序,可以用Comparator的compare方法进行排序

如果需要对值进行排序,需要Collections的sort的compare方法进行排序

posted @ 2018-03-12 14:10  不是植物  阅读(2734)  评论(0编辑  收藏  举报