Java 基础
1.1 Collection 和 Map
(1)掌握 Collection 和 Map 的继承体系。
ArrayList 和 LinkList 的区别
ArrayList(数组结构):
优点:get 和 set 调用花费常数时间,也就是查询的速度快;
缺点:新项的插入和现有项的删除代价昂贵,也就是添加删除的速度慢
LinkedList(链表结构):
优点:新项的插入和和现有项的删除开销很小,即添加和删除的速度快
缺点:对 get 和 set 的调用花费昂贵,不适合做查询
==面试中经常问到一些深入的东西,比如:==
-
是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全;
-
底层数据结构: Arraylist 底层使用的是 Object 数组;LinkedList 底层使用的是双向循环链表数据 结构;
-
插入和删除是否受元素位置的影响:
① ArrayList 采用数组存储,所以插入和删除元素的时间复 杂度受元素位置的影响。
比如:执行 add(E e)方法的时候,
ArrayList 会默认在将指定的元素追加到此 列表的末尾,这种情况时间复杂度就是 O(1)。
但是如果要在指定位置 i 插入和删除元素的话(add(intindex, E element))时间复杂度就为 O(n-i)。
因为在进行上述操作的时候集合中第 i 和第 i 个元素之后的(n-i) 个元素都要执行向后位/向前移一位的操作。
② LinkedList 采用链表存储,所以插入,
删除元素时间复杂度不受元素位置的影响,都是近似 O(1)而数组为近似 O(n)。
-
是否支持快速随机访问: LinkedList 不支持高效的随机元素访问,而 ArrayList 实现了 RandmoAccess 接口,所以有随机访问功能。快速随机访问就是通过元素的序号快速获取元素对象(对应于 get(int index)方法)。
-
内存空间占用: ArrayList 的空 间浪费主要体现在在 list 列表的结尾会预留一定的容量空间,而 LinkedList 的空间花费则体现在它的每一个元素都需要消耗比 ArrayList 更多的空间(因为要存放直接后继 和直接前驱以及数据)。
HashMap底层
就是一个数组结构(Entry<K,V>[] table) 可以看出,Entry 就是数组中的元素,每个 Map.Entry 其实就是 一个 key-value 对,它持有一个指向下一个元素的引用,这就构成了链表。
HashMap的数据结构
要知道 hashmap 是什么,首先要搞清楚它的数据结构,在 java 编程语言中,最基本的结构就是两种,一个是 数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,hashmap 也不例外。
Hashmap 实际上是一个数组和链表的结合体(在数据结构中,一般称之为“链表散列“),请看下图(横排表 示数组,纵排表示数组元素【实际上是一个链表】)。
HashMap的工作原理
HashMap 基于 hashing 原理,我们通过 put()和 get()方法储存和获取对象。当我们将键值对传递给 put()方法 时,它调用键对象的 hashCode()方法来计算 hashcode,让后找到 bucket 位置来储存值对象。当获取对象时, 通过键对象的 equals()方法找到正确的键值对,然后返回值对象。
HashMap 使用链表来解决碰撞问题,当发生 碰撞了,对象将会储存在链表的下一个节点中。 HashMap 在每个链表节点中储存键值对对象。
当两个不同的键对象的 hashcode 相同时会发生什么? 它们会储存在同一个 bucket 位置的链表中。键对象的 equals()方法用来找到键值对。
因为 HashMap 的好处非常多,我曾经在电子商务的应用中使用 HashMap 作为缓存。因为金融领域非常多的运用 Java,也出于性能的考虑,我们会经常用到 HashMap 和 ConcurrentHashMap。
常见问答
==Q:== List、Map、Set三个接口,存取元素时,各有什么特点?
==A:==
List: 以特定次序来持有元素,可有重复元素
Set: 无法拥有重复元素,内部排序(无序);
Map: 保存 key-value 值,value 可多值。
HashMap: 不能存重复键,可以重复值,可以为null键 null值 ,线程不安全;
HashTable: 是线程安全的 ,不能存储null键 null值.
==Q:== HashSet 如何保证证元素唯一性的呢?
==A:== 通过元素的两个方法,hashCode 和 equals 来完成。
==Q:== Collection 和Collections的区别
==A:==
Collection 是集合类的上级接口,继承与他的接口主要有 Set 和 List.
Collections 是工具类
==Q:== Comparable 和 Comparator 区别?
==A:==
1:让元素自身具备比较性,需要元素对象实现 Comparable 接口,覆盖 compareTo 方法。
2:让集合自身具备比较性,需要定义一个实现了 Comparator 接口的比较器,并覆盖 compare 方法
==Q:== map 集合的两种取出方式?
==A:==
//第一种:普遍使用
System.out.println("通过 Map.keySet 遍历 key 和 value:");
for (String key : map.keySet()) {
System.out.println("key= "+ key + " and value= " + map.get(key));
}
//第二种:容量大时 推荐使用
System.out.println("通过 Map.entrySet 遍历 key 和 value");
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
--内容整理自 传智播客 面试宝典 http://www.itcast.com/
来源:oschina
链接:https://my.oschina.net/u/4182917/blog/3093260