Java面试之集合框架篇

1.ArrayList和LinkedList异同
答:1.是否线程安全:ArrayList和LinedList都是不同步的,也就是不保证线程安全的。
2.底层数据结构:ArrayList底层使用的是Object数组;LinkedList底层使用的是双向链表。
3.插入和删除是否收元素位置的影响:ArrayList是用数组储存元素的,也就是说插入和删除的时间复杂度是收元素位置影响的。如果插入的是在末尾,因为不用挪动元素,所以时间复杂度为O(1),但是如果要在指定位置i插入和删除元素的话,那么i位置后面的元素都要往后挪一位(删除往前挪),所以时间复杂度是O(n-i)。LinkedList采用双向链表存储,所以插入删除的是啊金复杂度不受元素位置的影响,都是近似O(1)。
4.是否支持快速随机访问:LinkedList不支持高效的随机元素访问,而ArrayList实现了RandomAccess接口,所以有随机访问功能。快速随机访问就是通过元素的序号快速获取元素对应的对象(对应于get(int index)方法)。
5.内存空间占用:ArrayList的空间浪费主要体现在list列表结尾都会预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都有前后两个节点,所以更加的耗费内存。

2.ArrayList和Vector的区别
答:Vector类的所有方法都是同步的。因此是线程安全的,可以由两个线程安全的访问一个Vector对象,但是一个线程。ArrayList不是同步的,所以在不需要吧保证线程安全的情况下建议使用ArrayList。

-------------------------2019.7.2后续更新--------------------

3.HashMap和Hashtable的区别
答:HashMap是基于哈希表实现的,每一个元素都是key-value对,其内部通过单链表解决冲突问题,容量不足时,就是超过阀值,会自动增长。HashMap非线程安全的,只能用于单线程,多线程中采用concurrent([kənˈkʌrənt])并发包下的concurrentHashMap。HashMap实现了Serializable接口,所以它支持序列化,实现了Cloneable接口,能被克隆。
HashTable同样是基于哈希表实现的,同样每个元素都是一个Key-Value对,其内部也是通过单链表解决冲突问题,容量不足时,也会自动增长。不过,HashTable是线程安全的,可以用于多线程。HashTable同样也是实现了Seriailizable接口,支持系列化。实现了Cloneable接口,可以被克隆。
区别:
1.继承的父类不同:HashTable继承自Dictionary类,而HashMap继承自AbStractMap类。但两者都实现了Map接口。
2.线程安全性不同:HashTable是线程安全的,HaspMap是线程不安全的。
3.key和value是否允许null值:HaspTable中,key和value都不允许出现null值,HaspMap中null可以作为键,但是这样的键只能有一个,但是可以有多个value值为null。
4.hash值不同: 哈希值的使用不同,HashTable直接使用对象的HashCode,而HashMap重新计算hash值。hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值。HashTable计算hash值是直接用key的hashCode。而HashMap重新计算hash值。(key的hash值对长度取模,也就是hash(key)% len-1)
5.内部实现的初始化和扩容方式不同:HashTable初始容量是11,扩容是两倍+1。HashMap初始容量是16,扩容是两倍。而且HaspMap要求底层数组的容量一定要是2的整数次幂。因为这样能减少key之间的碰撞,效率更高

4.List 和Map的区别?
答:List:是存储单列数据的集合,存储的数据是有序并且可以重复的。
Map:存储双列数据的集合,通过键值对来存储数据,存储的数据是无序的,Key值不能重复,value值可以重复。

5.List,Set, Map是否继承自Collection接口?
答:List,Set是继承自Collection接口,Map不是。

6.Collection和Collections的区别
答:Collection是一个集合接口,List和Set就是继承这个接口的。而Collections是只是一个包装类,是java.util下面的一个工具类,里面主要是包含很多集合操作的方法。

7.List、Map、Set三个接口,存取元素时,各有什么特点?
答:List和Set都是单列元素的集合,他们都有一个共同的父类接口Collection。
Set不允许有重复的元素,而且是无序的。Set在存元素的时候,add方法有一个boolean返回值,当集合中没有add的那个元素时,可以加入该元素,返回true;反之返回false。在取元素的时候,只能用迭代器iterator接口取得所有的元素,再遍历各个元素找到想要的。
List允许有重复元素,而且是有序的。List在存元素时调用add方法,每次加入的对象按原来先来后到的顺序排列,也可以插队。取元素时调用get方法准确定位到要取的元素。List支持快速随机访问(因为实现了randomaccess接口)。
Map是双列的集合,是以键值对存放数据的,存放用put(key,value),每次存储时,要存储一对key/value,不能储存重复的key。取元素的话用get(key)方法根据key获得相应的value。也可以获得所有key的集合,还可以获取所有value的集合。还可以获得key和value组成成的Map.Entry对象的集合

8.说出ArrayList,Vector,LinkedList的存储性能和特性
答:首先是ArrayList和Vector,这两个都是使用数组的方式存储数据,这两个实现了快速随机访问,所以他们在取数据的时候很快,时间复杂度是O(1),但是插入或删除元素的时候,如果是在末尾就不用挪动元素,如果是在其他位置。那么后面的元素都要挪动位置,时间复杂度就是O(总的-所在位置)。Vector是用来synchronized方法,所以它是线程安全的,所以性能上比ArrayList差。而LinkedList底层是使用双向链表,在插入数据的时候,只要把要插入位置元素截断插入即可,时间复杂度也是O(1),但是查询的话只能遍历整个链表,那么时间复杂度将会是O(n)。所以,如果从安全角度考虑的话,那么选择Vector,如果从效率来说,经常要查询的选择ArrayList,经常要插入删除的使用LinkedList。

9.去掉一个Vector集合中重复的元素
答:可以通过Vector.contains()方法,遍历每一个数然后把、看是否存在如果存在就跳过,不存在就写入。还有就是用Set集合,新建一个HashSet把vector放进去然后遍历Set即可。

10.Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用==还是equals()?它们有何区别?
答:用equal(),因为equal()比较的是值,而==比较的是地址。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值