集合框架知识汇总

1. ArrayList 和 Vector 的区别

这两个类都实现了 List 接口, 都是有序集合, 即存储这两个集合中的元素的位置都是有顺序的, 相当于一种动态的数组, 我们可以按位置索引号取出某个元素, 数据是允许重复的.

同步性:

Vector 是线程安全的, 也就是说它的方法之间是线程同步的, 而 ArrayList 是线程不安全的, 它的方法之间是线程不同步的.

数据增长:

ArrayList 与 Vector 都有一个初识的容量大小, 当存储进它们里面的元素个数超过了容量时,  就需要增加 ArrayList 与 Vector 的存储空间, 每次要增加存储空间时, 不是只增加一个存储单元, 每次增加的存储单元都个数在内存空间利用与程序效率之间要取得一定的平衡. Vector 默认增长为原来的两倍, 而 ArrayList 的增长策略为原来的 1.5 倍. ArrayList 与 Vector 都可以设置初始空间大小, Vector 还可以设置增长的空间大小, 而 ArrayList 没有提供设置增长空间的方法.

2. ArrayList, Vector, LinkedList 的存储性能和特性

ArrayList 和 Vector 都是使用数组方式存储数据, 此数组元素数大于实际存储的数据以便增加和擦合一元素, 它们都允许直接按序号索引元素; 但是插入元素要设计数据元素等内存操作, 所以索引数据快而插入数据慢.

Vector 由于使用了 synchronized 方法, 通常性能上较 ArrayList 查.

而 LinkedList 使用双向链表实现存储, 按序号索引数据需要进行前向或后向遍历, 但是插入数据时只需要记录本项的前后项即可, 所以插入速度较快.

ArrayList 在查找时速度快, LinkedList 在插入与删除时更具优势.

3. HashMap 的数据结构

在 Java 编程语言中, 最基本的结构就是两种, 一个是数组, 另外一个是模拟指针(引用), 所有的数据结构都可以用这两个基本结构来构造的, HashMap 也不例外. HashMap 实际上是一个数组和链表的结合体(在数据结构中, 一般称之为 "链表散列")

4. HashMap 什么时候进行扩容呢

当 HashMap 中的元素个数超扩数组大小 loadFactor 时, 就会进行数组扩容, loadFactor 的默认值为 0.75, 也就是说, 默认情况下, 数组大小为 16, 16 * 0.75 = 12,  那么当 HashMap 中元素个数超过 12 的时候, 就把数组的大小扩大一倍, 即 32 , 然后重新计算每个元素在数组中的位置, 而这是一个非常消耗性能的操作, 所以如果我们已经预支 HashMap 中元素的个数, 那么预设元素的个数能够有效的提高 HashMap 的性能. 不如所, 我们有 1000 个元素 new HashMap(1024) 更合适,  当为了让 0.75 * size > 1000, 所以必须 new HashMap(2048) 才最合适.

5. List, Map, Set 三个接口, 存取元素时, 各有什么特点

首先, List 和 Set 具有相似性, 它们都是单列元素的集合, 所以它们有一个共同的父接口 Collettion. Set 里面不允许有重复的元素, 所谓重复就是不能有两个相等(存的值相同) 的对象, 即 Set 集合中有了一个 A对象, 现在要向 Set 集合再存入一个 B 对象, 但 B 对象 与 A 对象 equals 相等, 则 B 对象存不进去, 当成功存入时 add() 方法会返回一个 true, 否则返回 false;

Set 取元素时, 没法说取第几个, 只能一 Iterator 接口取得所有的元素, 在逐一遍历各个元素

Map 与 List 和 Set 不同, 是双列集合, 其中有 put 方法, put(obj key, obj value), 不能重复储存 key, 这个也是按equals进行比较. Map 可以获取所有 key 的集合, 还可以获取所有 value 集合, 还可以获取 key 和 value 组成的 Map.Entry 对象的集合

6. Heap 和Stack 有什么区别

Java内存分两种, 一类是栈内存, 一类是堆内存. 栈内存是指程序进入一个方法时, 会为这个方法单独分配一块单独存储空间, 用于存储这个方法内部的局部变量, 当这个方法结束时, 分配给这个方法的栈会释放, 这个栈中的变量也随之释放

堆是与堆作用不同的内存, 一般用于存放不放在当前方法栈中的那些数据, 例如, 使用 new 创建的对象都放在堆里, 所以, 它不会随当前方法的结束而消失. 方法中的局部变量使用final 修饰后, 放在堆中, 不是栈中.

7, Java 集合类框架的基本接口有哪些

  • Collection: 代表一组对象, 每一个对象都是它的子元素
  • Set: 不包含重复元素的 Collection
  • List: 有顺序的 Collection, 并且可以包含重复元素
  • Map: 可以把键(key) 映射到值(value) 的对象, 键不能重复

8. HashSet 和 TreeSet 有什么区别

HashSet 是由一个 hash 表来实现的, 因此, 它的元素时无序的. add(), remove(), contains() 方法的时间复杂度是 O(1);

TreeSet 是由一个树形的结构来实现的, 它里面的元素是有序的. 因此, add(), remove(), contains() 方法的时间复杂度是 O(logn)

9. HashSet 的底层实现是什么

通过查看源码知道 HashSet 的实现是依赖于 HashMap 的, HashSet 的值都是存储在 HashMap 中的. 在 HashSet 的构造法中会初始化一个 HashMap 对象, HashSet 的值是作为 HashMap 的 key 存储在 HashMap 中的, 当存储的值已经存在时返回 false.

10. Iterator 和 ListInterator 的区别是什么

  • Iterator 可用来遍历 Set 和 List 集合, 但是 ListIterator 只能来遍历 List.
  • Iterator 对集合只能是前向遍历, ListIterator 既可以前向也可以后向
  • ListIterator 实现了一个 Iterator 接口, 并包含其他的功能, 比如: 增加元素, 替换元素, 获取前一个和后一个元素的索引等.

11. 数组(Array) 和 列表(ArrayList) 有什么区别, 什么时候应该用 Array, 什么时候用 ArrayList

  • Array 可以包含基本类型和对象类型, ArrayList 只能包含对象类型
  • Array 大小是固定的, ArrayList 的大小是动态变化的
  • ArrayList 处理固定大小的基本数据类型的时候, 比 Array 慢.

12. Collection 和 Collections 的区别

collection 是集合类的上级接口, 继承与它的接口主要是 set 和 list.

collections 类是针对集合类的一个帮助类, 它提供一系列的静态方法对各种集合的搜索, 排序, 线程安全化等操作.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值