集合总结
重点;
Arraylist、LinkedList、HashMap、ConCurrentHashMap
1.ArrayList和Vector的区别
共同点:都实现了List接口,有序的集合,底层是数组,允许元素重复和为null
区别: 同步性:ArrayList是非同步,Vector是同步的。 扩容大小:Vector增长原来的一倍,ArrayList增长原来的0.5倍。
2. List和Map的区别
共同点:Java常用的容器,都是接口
不同点: 存储结构不同:List是存储单列的集合,Map存储的是key-value键值对的集合
元素是否可重复:List允许元素重复,Map不允许key重复
是否有序: List集合是有序的(存储有序),Map集合是无序的(存储无序)
3.Collection和Collections的区别
Collection是集合的上级接口,继承它的有Set和List接口
Collections是集合的工具类,提供了一系列的静态方法对集合的搜索、查找、同步等操作
4.ArrayList,LinkedList的存储性能和特性
ArrayList的底层是数组,LinkedList的底层是双向链表。都是不同步的,也就是不保证线程安全
LinkedList 不支持高效的随机元素访问,而 ArrayList 支持。快速随机访问就是通过元素的序号快速获取元素对象(对应于get(int index)
方法)。
- ArrayList它支持以角标位置进行索引出对应的元素(随机访问),而LinkedList则需要遍历整个链表来获取对应的元素。因此一般来说ArrayList的访问速度是要比LinkedList要快的
- ArrayList由于是数组,对于删除和修改而言消耗是比较大(复制和移动数组实现),LinkedList是双向链表删除和修改只需要修改对应的指针即可,消耗是很小的。因此一般来说LinkedList的增删速度是要比ArrayList要快的
5.并发集合类是什么?
包含线程安全集合类,允许在迭代时修改集合
一部分类为:CopyOnWriteArrayList、ConcurrentHashMap、CopyOnWriteArraySet
6.ArrayList集合加入1万条数据,应该怎么提高效率
ArrayList的默认初始容量为10,要插入大量数据的时候需要不断扩容,而扩容是非常影响性能的。因此,现在明确了10万条数据了,我们可以直接在初始化的时候就设置ArrayList的容量!
7.List,Set,Map三者的区别及总结
-
List:对付顺序的好帮手
List接口存储一组不唯一(可以有多个元素引用相同的对象),有序的对象
-
Set:注重独一无二的性质
不允许重复的集合。不会有多个元素引用相同的对象。
-
Map:用Key来搜索的专家
使用键值对存储。Map会维护与Key有关联的值。两个Key可以引用相同的对象,但Key不能重复,典型的Key是String类型,但也可以是任何对象。
8.HashMap 和 ConcurrentHashMap 的区别
- ConcurrentHashMap对整个桶数组进行了分割分段(Segment),然后在每一个分段上都用lock锁进行保护,相对于HashTable的synchronized锁的粒度更精细了一些,并发性能更好,而HashMap没有锁机制,不是线程安全的。(JDK1.8之后ConcurrentHashMap启用了一种全新的方式实现,利用CAS算法。)
- HashMap的键值对允许有null,但是ConCurrentHashMap都不允许。
9.==与equals的区别
- ==是判断两个变量或实例是不是指向同一个内存空间 equals是判断两个变量或实例所指向的内存空间的值是不是相同
- ==是指对内存地址进行比较 equals()是对字符串的内容进行比较3.==指引用是否相同 equals()指的是值是否相同
10如何对Object的list排序
- 对objects数组进行排序,我们可以用Arrays.sort()方法
- 对objects的集合进行排序,需要使用Collections.sort()方法
11.如何实现数组与List的相互转换
List转数组:toArray(arraylist.size()方法;数组转List:Arrays的asList(a)方法
12.集合框架底层数据结构总结
- Collection
1. List
- Arraylist:数组(查询快,增删慢 线程不安全,效率高 ) 常用方法:add()、get()、set()、remove()、
- Vector:数组(查询快,增删慢 线程安全,效率低 )
- LinkedList:链表(查询慢,增删快 线程不安全,效率高 ) 常用方法:add()、get()、set()、remove()、
2. Set
- HashSet(无序,唯一):哈希表或者叫散列集(hash table)
- LinkedHashSet:链表和哈希表组成 。 由链表保证元素的排序 , 由哈希表证元素的唯一性
- TreeSet(有序,唯一):红黑树(自平衡的排序二叉树。)
- Map
- HashMap:基于数组+链表(散列表)+红黑树(哈希表对键进行散列,Map结构即映射表存放键值对) 常用方法:put()、get()、remove()
- LinkedHashMap:HashMap 的基础上加上了链表数据结构 常用方法:put()、get()、remove()
- HashTable:哈希表
- TreeMap:红黑树(自平衡的排序二叉树)
- ConCurrentHashMap 数组+链表(支持高并发的访问和更新。它是线程安全的,因为Segment 数组的原因。value都不允许为null) 常用方法:put()、get()
13.HashSet 和 HashMap 区别
14.Set里不允许插入重复的元素。对于HashSet和TreeSet,如果我们要插入自定义的类,我们该往自定义的类里加入什么方法来保证“不重复”?
对于HashSet,它是基于Hash表的,我们需要重写其中的hashCode和equals方法;对于TreeSet,我们需要重写compareTo方法(当然还得实现Compareable接口)
15.在使用HashMap时,你有没有重写hashCode和equals方法,如果不重写,会有什么问题?如果候选人对此一脸雾水,那么我会给点提示:如果我们要在HashMap的Key部分放入自定义的类,而不是基本数据结构,那么我们该在这个自定义的类里重写什么方法?
如果大家被问到这个问题,可以好好利用这个机会来展示你对此的深入了解。
要点1,HashMap是基于hash表这个数据结构来实现的,所以其中的get或containsKey的效率相当高(接近于1)。
要点2,描述一下Hash表的数据结构,重点说说如何通过hash算法把待存入的数据和存储位置绑定到一起了,同时还可以说出HashMap表里是通过链地址法来解决冲突。
要点3,hashCode方法其实是对应hash表里的hash算法,由此我们可以计算出待存储元素的存放位置。如果我们不重写,将会用到Object里的hashCode方法,它是返回该对象的内存地址;而如果我们不重写equals方法,那么在冲突的情况下,就无法定位到具体的对象了。总之,如果不重写hashCode和equals方法,在调用containsKey和get方法时,就无法得到“看上去一致”的对象了。
如果面试官(也包括笔者)看到应试者能清晰地说出上述的意思,就认为此人对技术细节非常了解,就有可能减少集合部分(或者乃至Java Core部分)的面试题。
16Collections和Collection有什么差别?
Collections 是一个集合的一个类,其中包含有一些和集合操作相关的静态多态方法。Jave集合里则有另外一个和它非常相似的接口Collection(不带s),它是线性表类集合的父接口,List和Set等接口都是通过实现这个接口来实现的。
17.如果我们要给自定义的类排序,可以怎么做?
我们可以通过重写Collections.sort的方法来实现。
18.HashTable 是线程安全的一个集合,不允许 null 值作为一个 key 值或者 Value 值;
HashTable 是 sychronize,多个线程访问时不需要自己为它的方法实现同步,而 HashMap 在被多个线程访问的时
候需要自己为它的方法实现同步;