Java 中集合几乎随处可见, 是我们开发中遇到最多最多的, 这里列举一些集合的知识点, 希望对大家有帮助!
首先说一下集合:
当你事先不知道要存放数据的个数, 或者你需要一种比数组下标存取机制更灵活的方法时, 你就需要用到集合类.
集合的体系:
List,Set,Map 是这个集合体系中最主要的三个接口. List 和 Set 继承自 Collection 接口. Map 也属于集合系统, 但和 Collection 接口不同.
集合与数组:
一般来说, 数组存取在栈, 集合在堆. 数组的效率比集合高, 但是很多时候我们用集合, 原因是集合更加灵活, 因为你大部分时候并不知道元素的个数.
数组和集合往往可以相互转换:
数组变集合:
- String array[]= {"hello","world","java","C#"};
- List<String> list = new ArrayList<String>(Arrays.asList(array));
集合变数组:
String[] array=list.toArray(new String[list.size()]);
Java 集合类框架的基本接口有哪些?
集合类接口指定了一组叫做元素的对象. 集合类接口的每一种具体的实现类都可以选择以它自己的方式对元素进行保存和排序. 有的集合类允许重复的键, 有些不允许.
Java 集合类提供了一套设计良好的支持对一组对象进行操作的接口和类. Java 集合类里面最基本的接口有:
Collection: 代表一组对象, 每一个对象都是它的子元素.
Set: 不包含重复元素的 Collection.
List: 有顺序的 collection, 并且可以包含重复元素.
Map: 可以把键 (key) 映射到值 (value) 的对象, 键不能重复.
Iterator 和 ListIterator 的区别是什么?
下面列出了他们的区别:
Iterator 可用来遍历 Set 和 List 集合, 但是 ListIterator 只能用来遍历 List.
Iterator 对集合只能是前向遍历, ListIterator 既可以前向也可以后向.
ListIterator 实现了 Iterator 接口, 并包含其他的功能, 比如: 增加元素, 替换元素, 获取前一个和后一个元素的索引, 等等.
Java 中的 HashMap 的工作原理是什么?
Java 中的 HashMap 是以键值对 (key-value) 的形式存储元素的. HashMap 需要一个 hash 函数, 它使用 hashCode()和 equals()方法来向集合 / 从集合添加和检索元素. 当调用 put()方法的时候, HashMap 会计算 key 的 hash 值, 然后把键值对存储在集合中合适的索引上. 如果 key 已经存在了, value 会被更新成新值.
HashMap 的一些重要的特性是它的容量 (capacity), 负载因子(load factor) 和扩容极限(threshold resizing).
HashMap 和 Hashtable 有什么区别?
HashMap 和 Hashtable 都实现了 Map 接口, 因此很多特性非常相似. 但是, 他们有以下不同点:
HashMap 允许键和值是 null, 而 Hashtable 不允许键或者值是 null.
Hashtable 是同步的, 而 HashMap 不是. 因此, HashMap 更适合于单线程环境, 而 Hashtable 适合于多线程环境.
HashMap 提供了可供应用迭代的键的集合, 因此, HashMap 是快速失败的. 另一方面, Hashtable 提供了对键的列举(Enumeration).
一般认为 Hashtable 是一个遗留的类.
数组 (Array) 和列表 (ArrayList) 有什么区别? 什么时候应该使用 Array 而不是 ArrayList?
下面列出了 Array 和 ArrayList 的不同点:
Array 可以包含基本类型和对象类型, ArrayList 只能包含对象类型.
Array 大小是固定的, ArrayList 的大小是动态变化的.
ArrayList 提供了更多的方法和特性, 比如: addAll(),removeAll(),iterator()等等.
对于基本类型数据, 集合使用自动装箱来减少编码工作量. 但是, 当处理固定大小的基本数据类型的时候, 这种方式相对比较慢.
ArrayList 和 LinkedList 有什么区别?
ArrayList 和 LinkedList 都实现了 List 接口, 他们有以下的不同点:
ArrayList 是基于索引的数据接口, 它的底层是数组. 它可以以 O(1)时间复杂度对元素进行随机访问. 与此对应, LinkedList 是以元素列表的形式存储它的数据, 每一个元素都和它的前一个和后一个元素链接在一起, 在这种情况下, 查找某个元素的时间复杂度是 O(n).
相对于 ArrayList,LinkedList 的插入, 添加, 删除操作速度更快, 因为当元素被添加到集合任意位置的时候, 不需要像数组那样重新计算大小或者是更新索引.
LinkedList 比 ArrayList 更占内存, 因为 LinkedList 为每一个节点存储了两个引用, 一个指向前一个元素, 一个指向下一个元素.
来源: https://mp.weixin.qq.com/s/v8b4dFuGsjqOJoCkaa4aRQ