Java面试题-day05集合

集合

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的区别

  1. 线程同步,Vector线程安全,ArrayList线程不安全
  2. 效率问题,Vector效率低,ArrayList效率高
  3. 增长数量,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也是个线程安全的类。

猜你喜欢

转载自blog.csdn.net/m0_56368068/article/details/120754468