备战BAT面试的学习记录,整理了最近自己查漏补缺的知识点,总结出来和大家分享,如有错误,欢迎指出!
备战BAT面试
容器
容器是我们保存对象的一种手段
说道保存对象,其实最简单的是数组,但是数组具有固定的尺寸。而通常来说,程序总是在运行时根据条件来创建对象,我们无法预知将要创建对象的个数以及类型,所以Java推出了容器类来解决这一问题。
两种不同概念的容器
- Collection,独立元素序列,这些元素都服从一条或多条规则。Collection包括List,Set以及Queue。
-List必须按照顺序保存元素
-Set不能有重复元素
-Queue需要按照排队规则来确定对象的顺序。 - Map是键值对类型,允许用户通过键来查找对象。Hash表允许我们使用另一个对象来查找某个对象。
Collection代表的是单个元素对象的序列,(可以有序/无序,可重复/不可重复 等,具体依据具体的子接口Set,List,Queue等);Map代表的是“键值对”对象的集合(同样可以有序/无序 等依据具体实现)
注:这两个接口都不能直接被实现(意思就是不能直接继承Collection类,只能继承Collection的子接口,Map同理)。
Collection和Map的更多细节
Collection
-
为什么要有集合?直接用数组不香吗?
数组定长,无法像集合一样动态扩展;
集合在增加、删除、修改操作上占有优势; -
List
- 特点:特点是有索引有序可重复
- 常用方法:add();get();ListIterator();remove();set()
- ArrayList类:数组实现,因为可以直接通过数组下标访问指定位置,所以查询和赋值操作速度快。但是修改元素效率低,线程不安全。
- LinkedList类:双向链表的实现,可以高效操作元素因为可以直接通过修改Node节点中分变量,查询速度慢,操作不安全。
- Vector:线程安全,效率低下
-
Set
- 无序不可重复。
值得注意的是,无序是指按照哈希值来存的所以取数据也是按照哈希值取得,所以无序只是单纯表示不按照输入顺序,实际上是某种意义上的有序。不可重复的实现是经过对比对象的hashCode,如果对象的hashCode值不同那对象绝对不同。如果对象的hashCode值相同则用equals进行比较
Map
Map也是一个接口,一个map不能包含重复的key,每个key只能映射唯一一个value。
- 常用方法:put();remove();clear();get();isEmpty();containsKey();containsValue()
- HashMAP
底层是哈希表数据结构,线程是不同步的,可以存入null键,null值。 - LinkedHashMap
该子类基于哈希表又融入了链表。 - TreeMap
底层是二叉树数据结构。可以对map集合中的键进行排序。需要使用Comparable或者Comparator 进行比较排序。
HashMap与HashSet的比较
HashSet实际是由HashMap实现的。然而我们只能向HashSet中添加Key,原因在于HashSet的Value其实都是同一个对象,这是HashSet添加元素的方法,可以看到辅助实现HashSet的map中的value其实都是Object类的同一个对象。
HashMap | HashSet |
---|---|
实现Map接口 | 实现Set接口 |
储存键值对 | 仅存储对象 |
put()添加 | add()添加 |
直接使用Key来计算HashCode | 使用成员对象来计算,先比hashcode再用equals() |
较快 | 较慢 |