集合总结

重点;

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.并发集合类是什么?

包含线程安全集合类,允许在迭代时修改集合

一部分类为:CopyOnWriteArrayListConcurrentHashMap、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 的区别

  1. ConcurrentHashMap对整个桶数组进行了分割分段(Segment),然后在每一个分段上都用lock锁进行保护,相对于HashTable的synchronized锁的粒度更精细了一些,并发性能更好,而HashMap没有锁机制,不是线程安全的。(JDK1.8之后ConcurrentHashMap启用了一种全新的方式实现,利用CAS算法。)
  2. HashMap的键值对允许有null,但是ConCurrentHashMap都不允许。

 

9.==与equals的区别

  1. ==是判断两个变量或实例是不是指向同一个内存空间 equals是判断两个变量或实例所指向的内存空间的值是不是相同
  2. ==是指对内存地址进行比较 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 在被多个线程访问的时
候需要自己为它的方法实现同步;

 

转载于:https://www.cnblogs.com/StingLon/p/10417684.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值