集合
1) 集合类型可以归纳为三种
Iterable
->Collection
->List
->ArrayList
->LinkedList
->Vector
->Stack
->Set
->HashSet
->TreeSet
Map
->Hashtable
->HashMap
->LinkedHashMap
Collections,不属于集合,是集合类的工具类
Arrays,不属于集合类,是数据对象的工具类
1) 列表(List)集合区分元素的顺序,且允许包含重复元素。
Collection:顶层接口
|—>List:列表,元素是有序的(元素带角标索引),可以有重复元素,可以有null元素。
|—>ArrayList:底层的数据结构是数组数据结构,特点是查询速度快(因为带角标),但是增删速度稍慢,因为当元素多时,增删一个元素则所有元素的角标都得改变,线程不同步。默认长度是10,当超过长度时,按50%延长集合长度。
|—>LinkedList:底层数据结构式链表数据结构(即后面一个元素记录前一个),
特点:查询速度慢,因为每个元素只知道前面一个元素,但增删速度快,因为元素再多,增删一个只要让其前后的元素重新相连即可,线程是不同步的。|—>Vector:底层数据结构是数组数据结构.特点是查询和增删速度都很慢。默认长度是10,当超过长度时,按100%延长集合长度。线程同步。
一般情况下,使用哪种List接口下的实现类呢?
如果要求增删快,考虑使用LinkedList
如果要求查询快,考虑使用ArrayList
如果要求线程安全,考虑使用Vector。
2)集(Set):Set集合中不区分元素的顺序,不允许出现重复元素。
|—>HashSet:底层数据结构是哈希表、存取速度快、元素唯一、线程不同步。
|—>TreeSet:底层数据结构式二叉树。可以对Set集合中的元素进行排序。元素有序、线程不同步。
3)映射(Map):顶层接口,该集合存储的是键值对,而且键是唯一的,Map和Set很像,Set集合底层就是使用了Map集合。Map集合没有迭代器,要取出元素必须先将Map集合转换成Set集合才能遍历元素
|—>HashTable: 底层是哈希表数据结构;不可以使用null键和null值;用作键的对象必须实现hashCode和equals方法来保证键的唯一性。线程同步效率低
|—>HashMap:底层是哈希表数据结构;允许使用null键和null值;线程不同步,效率高;
|—>TreeMap:底层是二叉树结构;允许使用null键和null值;线程不同步;
2) HashMap的工作原理是什么?
Java 中的 HashMap 是以键值对(key-value)的形式存储元素的。HaspMap的key可以为null
HashMap 需要一个 hash 函数,它使用 hashCode()和 equals()方法来向集合添加和检索元素。
当调用 put()方法的时候,HashMap 会计算 key 的 hash 值,然后把键值对存储在集合中合适的索引上。如果 key已经存在了,value 会被更新成新值。HashMap 的一些重要的特性是它的容量(capacity),负载因子(load factor)和扩容极限(threshold resizing)。当put的时候大于等于容量的0.75时,会进行扩容。
多线程环境下若使用HashMap需要使用Collections.synchronizedMap()方法来获取一个线程安全的集合
3) HashMap,TreeMap,HashTable的区别?
HashTable不允许<键,值>有空值,HashMap允许<键,值>有空值。
HashTable线程同步,但是HashMap非线程同步。
HashTable中hash数组的默认大小是11,增加方式的old*2+1,
HashMap中hash数组的默认大小是16,增长方式一定是2的指数倍。
TreeMap能够把它保存的记录根据键排序,默认是按升序排序。
HashTable使用Enumeration,HashMap使用Iterator。
4) 数组(Array) 和列表(ArrayList) 有什么区别?什么时候应该使用 Array 而不是 ArrayList ?
下面列出了 Array 和 ArrayList 的不同点:
Array 可以包含基本类型和对象类型,ArrayList 只能包含对象类型。
Array 大小是固定的,ArrayList 的大小是动态变化的。
ArrayList 提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等。
对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢
5) ArrayList和Vector的区别
- 线程同步,Vector线程安全,ArrayList线程不安全
- 效率问题,Vector效率低,ArrayList效率高
- 增长数量,Vector以1.5倍增长,ArrayList以2倍增长
6) HashSet和TreeSet有什么区别?
HashSet是由一个 hash 表来实现的,因此,它的元素是无序的。add(),remove(),contains()方法的时间复杂度是 O(1)。
另一方面,TreeSet 是由一个树形的结构来实现的,它里面的元素是有序的。因此,add(),remove(),contains()方法的时间复杂度是 O(logn)。
7) Collections和Collection的区别
Collection是个java.util下的接口,它是各种集合结构的父接口,定义了集合对象的 基本操作方法。Collections是个java.util下的工具类,它包含有各种有关集合操作的静态方法,主要是针对集合类的一个帮助类或者叫包装类,它提供一系列对各种集合的搜索,排序,线程安全化等操作方法。
8) Comparable和Comparator接口是干什么的?列出它们的区别。
Java 提供了只包含一个 compareTo()方法的 Comparable 接口。这个方法可以个给两个对象排序。具体来说,它返回负数,0,正数来表明输入对象小于,等于,大于已经存在的对象。
Java 提供了包含 compare()和 equals()两个方法的 Comparator 接口。compare()方法用来给两个输入参数排序,返回负数,0,正数表明第一个参数是小于,等于,大于第二个参数。equals()方法需要一个对象作为参数,它用来决定输入参数是否和 comparator 相等。只有当输入参数也是一个 comparator 并且输入参数和当前 comparator 的排序结果是相同的时候,这个方法才返回 true。
9) 集合中那些类是线程安全类,哪些是不安全的,哪些是支持排序的类
线程安全类:Vector、Hashtable、Stack。
线程不安全的类:ArrayList、Linkedlist、HashSet、TreeSet、HashMap、TreeMap
支持排序的类有HashSet、LinkedHashSet、TreeSet等(Set接口下的实现都支持排序)
此题主要考查集合框架的知识。在集合框架中Collection接口为集合的根类型,提供集合操作的常用API方法,该接口下派生出两个子接口,一个是不支持排序的List接口,一个是有自身排序的Set接口,所以回答排序与不排序分别从两接口的实现中在作答。线程安全上来说,Vector类比同属于List接口的ArrayList要早,是一个线程安全的类,在JDK1.2以后才推出一个异步的ArrayList类,比Vector类效率高。同理Stack继承自Vector也线程安全的类,另外在在Map接口的实现在Hashtable也是个线程安全的类。