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方法进行排序