快捷搜索:  汽车  科技

容器基本概念:容器重点总结

容器基本概念:容器重点总结③ Map以键值对的形式对元素进行存储。Map不允许有重复键,但允许有不同键对应的重复的值;② Set集合不允许元素重复,Set以及所有实现了Set接口的类都不允许插入重复值,若多次插入同一个元素时,在Set集合中只显示一个;3. List、Set、Map 之间的区别是什么?1) 元素重复性:① List允许有重复的元素,任何数量的重复元素都可以在不影响现有重复元素的值及其索引的情况下插入到List集合中;

前言JAVA中的容器作为一个重要的部分,不论是平时学习还是面试时都是必须要会的经典,需要重点掌握的方面。1. JAVA中的容器是什么?

Java中的容器也叫集合,是专门用来管理对象的对象。

容器基本概念:容器重点总结(1)

2. Collection 和 Collections 有什么区别?

Collection是JDK中集合层次结构中最根本的接口,定义了集合类的基本方法

Collections是一个包装类,它包含有各种有关集合操作的静态和多态方法,不能进行实例化操作,类似于Collection集合框架中的工具类。

3. List、Set、Map 之间的区别是什么?

1) 元素重复性:

① List允许有重复的元素,任何数量的重复元素都可以在不影响现有重复元素的值及其索引的情况下插入到List集合中;

② Set集合不允许元素重复,Set以及所有实现了Set接口的类都不允许插入重复值,若多次插入同一个元素时,在Set集合中只显示一个;

③ Map以键值对的形式对元素进行存储。Map不允许有重复键,但允许有不同键对应的重复的值;

2) 元素的有序性:

① List及其所有实现类都保持了每个元素的插入顺序;

② Set中的元素都是无序的,但是某些Set的实现类以某种殊形式对其中的元素进行排序。如:LinkedHashSet按照元素的插入顺序进行排序;

③ Map跟Set一样对元素进行无序存储,但其某些实现类对元素进行了排序。

如:TreeMap根据对其中的元素进行升序排序

3) 元素是否为空值:

① List允许任意数量的空值;

② Set最多允许一个空值的出现。当向Set集合中添加多个null值时,在该Set集合中只会显示一个null元素;

③ Map只允许出现一个空键,但允许出现任意数量的空值。

4. HashMap和HashTable有什么区别?底层实现是什么?(重点)

1) 线程安全性不同。

HashMap线程不安全,HashTable线程安全。HashMap中的方法没有使用Synchronized关键字修饰,而HashTable除了构造方法以外所有的Public方法都有该关键字修饰。

容器基本概念:容器重点总结(2)

2) key、value是否允许为null。

HashMap的key和value都可以为null,Hashtable的key和value都不可为null。

3) 继承的父类不同。

HashMap继承自AbstractMap类,Hashtable继承自Dictionary类。但二者都实现了Map接口。

4) 迭代器不同。

HashMap使用的是Iterator迭代器,Hashtable使用的Enumerator迭代器。

5) 是否包含有contains方法。

HashMap没有contains方法,Hashtable包含contains方法。

6) Hash值的计算方式不同。

HashMap中有个hash方法重新计算了key的hash值,Hashtable通过计算key的hashCode()方法来得到hash值。

容器基本概念:容器重点总结(3)

图3. 计算Hash值的方式

Hashtable在求hash值对应的位置索引时,用取模运算。而HashMap在求位置索引时,则用与运算,而且这里一般先用hash&0x7FFFFFFF后,再对length取模,&0x7FFFFFFF的目的是为了将负的hash值转化为正值,因为hash值有可能为负数,而&0x7FFFFFFF后,只有符号位改变,而后面的位都不变。

容器基本概念:容器重点总结(4)

图4. 计算对应的索引

7) 默认的初始大小和扩容方式不同。

HashMap默认初始大小16,容量必须是2的整数次幂,扩容时将容量变为原来的2倍;Hashtable默认初始大小11,扩容时将容量变为原来的2倍加1

底层实现:

在JDK8中的实现是数组 链表/红黑树,链表长度大于等于8时,数组长度超过64时,链表会转为红黑树进行存储,当链表长度小于6时,红黑树就会转化为链表。

在HashMap中存在一个内部类Entry,包含键、值以及下一个元素的引用,构成一个链表。

容器基本概念:容器重点总结(5)

在HashTable中,都是以链表方式进行存储。

存储过程:

当Key为null的时候,调用putForNullKey()将Value值放在数组的第一个位置。

当Key不为null的时候,根据Key计算Hashcode()值,搜索hashcode()值在对应表中的索引。假如该索引处存在Entry,就将新的Entry存储进去并用新的值替换原来的值,假如该索引不存在Entry,就将Entry放入该位置,直接将该元素存放进去。

5. 如何决定使用HashMap还是TreeMap?

HashMap<K V>的Key值实现了散列的hashCode(),不支持排序。数据结构主要是桶(数组),链表或红黑树。适用于在Map中插入、删除和定位元素。

TreeMap<K V>的Key值实现了Java中lang包下的Comparable方法。TreeMap默认是按照Key值升序排序的,TreeMap的实现是基于红黑树结构,适用于按自然顺序或自定义顺序遍历(key)。

结论:如果你需要得到一个有序的结果时就应该使用TreeMap(因为HashMap中元素的排列顺序是不固定的)。

如果要实现降序排列,定义一个比较类,实现Comparator接口,去重写compare方法,compare方法里面有两个参数,这两个参数通过调用compareTo进行比较大小。

除此之外,由于HashMap有更好的性能,所以大多不需要排序的时候我们会使用HashMap。

6. HashSet的实现原理

HashSet 是基于HashMap实现的,HashSet 底层使用 HashMap 来保存所有元素。

HashSet 的实现比较简单。相关 HashSet 的操作,基本上都是直接调用底层HashMap的相关方法来完成,HashSet 不允许重复的值。

7. ArrayList和LinkedList的区别

区别:

ArrayList基于动态数组,数组存储是连续的,适合进行查询操作,而且具有扩容机制,因为数组的长度是固定的(初始容量为10),超出长度存数据时需要新建数组,然后将老数组的数据拷贝到新数组中。

LinkedList基于链表,可以存储在分散的内存中,适合做数据插入和删除操作,不适合查询操作,需要逐一遍历。

8. Array和ArrayList有什么区别?分别在什么时候使用?

1)Array可以包含基本类型和对象类型,ArrayList只能包含对象类型;

2)Array大小是固定的,ArrayList的大小是动态变化的;

3)ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。

使用场景:

对于基本类型数据时,集合会使用自动装箱来减少编码的工作量。

但是,当处理固定大小的基本数据类型的时候,这种方式相对较慢。这个时候就应该使用Array而不是ArrayList。

9. 迭代器 Iterator 是什么?

Iterator 是可以遍历集合的对象,为各种容器提供了公共的操作接口,隔离对容器的遍历操作和底层实现(主要是解耦合)。

10. Iterator 怎么使用?有什么特点?Iterator 和 ListIterator 有什么区别?

Iterator使用:

1) 使用方法iterator()时要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它会返回集合的第一个元素;

2) 使用next()获得集合中的下一个元素;

3) 使用hasNext()检查集合中是否还有元素;

4) 使用remove()将迭代器新返回的元素删除。

Iterator功能比较简单,并且只能单向移动

ListIterator使用:

ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

1)Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List,Set并不能使用ListIterator来遍历;

2)Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向

3)ListIterator实现了Iterator接口,并包含其他功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引等等。

免费领取有关于java面试题材料和讲解!

猜您喜欢: