Java经典面试二:java的容器

问题一:Java有哪些容器?
常用容器目录
容器是一个专门存放其他类对象的类;

从图可以看出,顶级接口是Collection,后面分两个子接口Set集、List列表、Queue队列;还有一个Map映射接口,有一个实现类HashMap,HashMap是无序的,以键值对的形式存储,内部采用hash表结构。
其中:
Set接口允许存储重复对象,无序的;有两个实现类HashSet、TreeSet
HashSet内部采用hash表,无序排列;TreeSet内部采用树存储结构,默认升序排列。
因为HashSet基于Hash算法实现,性能优于TreeSet;
List接口允许存储重复对象,有序的;有两个实现类LinkedList、ArrayList
LinkenList内部采用链表结构,有序排列;ArrayList内部采用数组,也是有序。因为List接口就是有序的。

所有可以排序的类都要实现comparable接口;
对于Set和Map来说,如果希望元素放进去有顺序,可以使用treeSet和treeMap。

list和数组类似,动态增长,查找效率高,插入删除效率低,会引起其他元素位置改变。
Set检索效率低,删除插入效率高,不会引起元素改变。
问题二:Collection和Collections的区别?
答:

  • java.util.Collection是集合类的一个顶级接口,提供了对集合对象基本操作的通用接口方法。collection接口有很多具体的实现,直接继承的接口有List、Set.
  • Collections是集合类的一个工具类,提供了一系列静态方法,用于对集合排序、搜索及线程安全等操作。
    问题三:List、Set、Map有什么区别?
    答:在这里插入图片描述
  • List、Set都继承Collection接口,Map存储的是键值对形式;
  • List常见子类是ArrayList、LinkedList、Vector,存储元素可重复元素,有序,其中Vector
  • ArrayList非常相似,但该类同步,线程安全。
  • Set常用子类HashSet、LinkedHashSet、TreeSet,存储元素不重复,无序。但也有有序的。
  • Map常见子类HashMap,Hashtable,元素不可重复,Hashtable线程安全。

问题四:HashMap和Hashtable有什么区别?
答:

  • hashMap去掉了hashtable的contains方法加上了containsValue()和containsKey()方法。
  • hashtable同步,线程安全;hashMap非同步,效率更高;
  • hashMap允许空键值,hashtable不允许。
    问题五:如何决定用HashMap还是TreeMap?
    答:
  • 插入、删除和定位元素这类操作,hashMap更好;
  • 对一个有序的key集合遍历,treeMap更好;
  • 可以向hashmap中添加元素,再将map转换为treemap进行有序key的遍历。

问题六:说一下HashMap的实现原理?
答:HashMap概述:HashMap是基于哈希表的Map接口的非同步实现。此实现提供索引可选的映射操作,允许null值null键,不保证映射的顺序。

HashMap的数据结构:java语言中基本结构有两种一种是数组,另一个是模拟指针也就是引用,所有数据结构都可以用这两个基本结构来构造。HashMap实际是一个‘链表散列’的数据结构,即数组和链表的结合体。
在这里插入图片描述
HashMap 底层就是一个数组结构,数组中的每一项又是一个链表。当新建一个 HashMap 的时候,就会初始化一个数组。

当往HashMap中放put元素时,首先根据key的hashcode重新计算hash值,根据hash值得到这个元素在数组中的下标,如果该位置已经有其他元素,在该位置的元素以链表形式存放,新放的放入链头,最先加入的放在链尾,如果该位置没有元素,直接放到该位置(就相当于替换了)。

jdk1.8以后对HashMap的实现做了优化,当链表的节点数据超过八个后,链表会转为红黑树提高查询效率,从O(n)到O(logn)。O(n),就代表数据量增大几倍,耗时也增大几倍。O(logn),当数据增大n倍时,耗时增大logn倍(这里的log是以2为底的,比如,当数据增大256倍时,耗时只增大8倍,是比线性还要低的时间复杂度)。
问题七:说一下HashSet的实现原理?

  • 底层是由HashMap实现
  • 所有放入 HashSet 中的集合元素实际上由 HashMap 的 key 来保存
  • 而 HashMap 的 value 则统一存储了一个 PRESENT,它是一个静态的 Object 对象。

问题八:ArrayList和LinkedList的区别是什么?

  • ArrayList底层的数据结构是数组,支持随机访问
  • LinkedList的底层数据结构是双向循环链表,不支持随机访问
  • 使用下标访问一个元素,ArrayList时间复杂度是O(1),LinkedList是O(n)。

问题九:数组List之间如何转换?
答:调用ArrayList的toArray方法,转换为数组;
调用ArrayList的asList方法,转换为List。
问题十:ArrayList和Vector的区别?

  • vector是同步的,Arraylist不是。如果在迭代时对列表改变,应该用CopyOnWriteArrayList,它是ArrayList线程安全版本。
  • ArrayList比Vector快,ArrayList在底层数组不够用时在原来的基础上扩展0.5倍,Vector是扩展1倍。
  • ArrayList更通用,因为Collections工具类能轻易获取同步列表和只读列表。
  • ArrayList和Vector是相同的,只是Vector在很多地方都加了synchronized同步关键字

问题十一:Array和ArrayList有什么区别?

  • Array就是Java中的数组,而arraylist就是array的复杂版本
  • Array可以容纳基本类型和对象,ArrayList只能容纳对象。
  • Array指定大小固定,ArrayList动态变化。
  • Array没有ArrayList功能多。比如addAll,removeAll,iterator等。

问题十二:在Queue中poll()和remove()有什么区别?
答:意思相同,都是从队列中取出一个元素,poll在获取元素失败会返回null,而remove则会报异常。
问题十三:哪些集合类线程是安全的?

  • Vector:比ArrayList多了个同步,但效率低,不建议使用;
  • stack:堆栈类,Vector的子类,先进后出。
  • hashtable:就比hashMap多了个线程安全。
  • enumeration:枚举,相当于迭代器。

问题十四:迭代器Iterator是什么?
答:迭代器是一种设计模式,是一个对象,可以遍历并选择序列中的对象。迭代器通常被称为"轻量级"对象,创建代价小。
问题十五:Iterator怎么使用?有什么特点?

  • 迭代器功能简单,并且只能单向移动
  • 使用iterator()方法返回一个Iterator
  • 调用它的next()方法,获得序列的下一个元素
  • 使用hasNext()方法检查序列是否还有元素
  • 使用remove()方法将迭代器返回的元素删除。

问题十六:Iterator和ListIterator有什么区别?

  • Iterator可以遍历Set和List,ListIterator只能遍历List;
  • Iterator对集合只能向前遍历,ListIterator可以从两个方向遍历;
  • Iterator是迭代器最简单的实现,ListIterator实现了Iterator接口,可以从两个方向遍历List,也可以操作元素。比如增加元素、替换元素、获取前一个和后一个元素索引
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值