小记

1、 ArrayList 和Vector的区别
2、 说说ArrayList,Vector,LinkedList的存储性能和特性

Vector : 数组 线程安全
ArrayList : 数组 非线程安全
LinkedList:双向链表 非线程安全

都实现了List接口,也就是说都实现了get(int location)、remove(int location)等“根据索引值来获取、删除节点的函数”。数组结构根据下标取值很容易,LinkedList双向列表的实现,通过计数索引值实现,从链表长度的1/2开始查找,下标大了就从表头开始查找,小了就从表尾开始找。

1、数组:可以根据下标快速查找,所以大部分情况下,查询快。但是如果要进行增删操作的时候,会需要移动修改元素后面的所有元素,所以增删的开销比较大,数组的对增删操作的执行效率低。
数组查询快,增删慢。
链表:增加和删除元素方便,增加或者删除一个元素,仅需处理节点间的引用即可。
但是查询不方便,需要一个个对比,无法根据下标直接查找。
链表结构存储的LinkedList,增删方便,查询慢(值的是随机查询,不是顺序查询)
2、ArrayList和Vector都是基于数组实现的。
ArrayList、Vector的实现原理是采用一个动态对象数据实现的。ArrayList默认构造方法创建一个空数组,Vector默认构造方法创建一个大小为10的对象数组。
3、 ArrayList采用懒加载策略(第一次add时才初始化内部数组,默认初始化大小为10)? ?扩容为原先数组大小的1.5倍。
采用异步处理,线程不安全,性能较高,ArrayList在大部分场合(80%,频繁查找、在集合末端插入与删除)都采用ArrayList
4、Vector在实例化对象时就初始化内部数组(大小为10),增量capacityIncrement默认为0,扩容为原先数组大小的2倍,而当增量>0的时候,扩充为原来的大小加增量。
采用synchronized修饰增删改查方法,线程安全,性能较低(锁的粒度太粗,将当前集合对象锁住,读读都互斥),即使要用性能安全的集合,也不推荐使用Vector
5、LinkedList采用异步处理,线程不安全。频繁在任意位置的插入与删除考虑使用LinkedList, LinkedList是Queue接口的常用子类
如果你的程序更多的是进行元素的查找或者从集合末端插入或删除元素,建议使用ArrayList;如果更多的是进行随机插入和删除操作,LinkedList会更优。

4、 快速失败(fail-fast)和安全失败(fail-safe)的区别是什么
Fail-fast,即快速失败机制,它是java集合中的一种错误检测机制,当多个线程(单个也可以),在结构上对集合进行改变时,就有可能会产生fail-fast机制。
集合上的插入和删除就是结构上的改变,但是,如果是对集合中某个元素进行修改的话,并不是结构上的改变

当我们在遍历集合元素的时候,经常使用迭代器,但在迭代器遍历元素的过程中,如果集合的结构被改变的话,就会抛出异常,防止继续遍历。这就是所谓的快速失败机制。
当Iterator这个迭代器被创建后,除了迭代器本身的方法(remove)可以改变集合的结构外,其他的因素如若改变了集合的结构,都被抛出ConcurrentModificationException异常。
注意:remove()方法会让expectModcount和modcount 相等,所以是不会抛出这个异常。
迭代器在遍历过程中是直接访问内部数据的,因此内部的数据在遍历的过程中无法被修改。为了保证不被修改,迭代器内部维护了一个标记 “mode” ,当集合结构改变(添加删除或者修改),标记"mode"会被修改,而迭代器每次的hasNext()和next()方法都会检查该"mode"是否被改变,当检测到被修改时,抛出Concurrent Modification Exception

1、如果我们不希望在迭代器遍历的时候因为并发等原因,导致集合的结构被改变,进而可能抛出异常的话,我们可以在涉及到会影响到modCount值改变的地方,加上同步锁(synchronized),或者直接使用 Collections.synchronizedList来解决。

2、当我们对集合结构上做出改变的时候,fail-fast机制就会抛出异常。但是,对于fail-safe机制来说,就不会抛出异常。
当集合的结构被改变的时候,fail-fast机制会在复制原集合的一份数据出来,然后在复制的那份数据遍历。
因此,fail-safe不会抛出异常,但存在以下缺点:
1、 复制时需要额外的空间和时间上的开销
2、 不能保证遍历的是最新内容。

5、 HashMap的数据结构
6、 HashMap的工作原理是什么
7、 HashMap什么时候进行扩容
1、 JDK7中的HashMap 底层维护一个数组table,数组中的每一项是一个key,value形式的Entry。
Transient Entry<K,V>[] table;

8、 List、Map、Set三个接口,存取元素时,各有什么特点?
9、 Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?使用还是equals()?它们有什么区别?
10、 两个对象值相同(X.equal(y) == true),但却可有不同的hash code,对不对
10、heap和stack有什么区别
11、java集合类框架的基本接口有哪些
12、HashSet 和TreeSet有什么区别
13、HashSet的底层实现是什么
14、LinkedHashMap 的实现原理
15、为什么集合类没有实现Cloneable 和Serializable接口
16、什么是迭代器(Iterator)
17、Iterator和ListIterator的区别是什么
18、数组(Array)和 列表(ArrayList)什么区别?什么时候应该使用Array而不是ArrayList?
19、java集合类框架的最佳实践有哪些?
20、Set里的元素是不能重复的,那么用什么方法来区分重复与否?使用
还是equal()?他们有什么区别
21、Comparable 和 Comparator接口是干什么的?列出他们的区别

22、Collection 和Collections的区别
Collection是集合类的上级接口,继承与他有关的接口主要有List(LinkedList、ArrayList、Vector)和Set
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全等操作。
Collections的主要方法有:混排(Shuffle)、反转(Reverse)、替换所有元素(fill)、拷贝(copy)、返回Collections中最小的元素(min)、返回Collections中最大元素(max)、返回指定源列表中第一次出现指定目标列表的起始位置(IndexOfSubList)、根据指定的距离循环

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值