Java 集合 面试题

Java集合都有哪些?
List集合:(有序,元素可以重复)
  • ArrayList集合:
    1).底层数据结构是数组,查找快,增删慢。
    2). 线程不安全,效率高
  • Vector集合:
    1) 底层数据结构是数组,查询快,增删慢
    2)线程安全,效率低
  • LinkedList集合:
    1) 底层数据结构是链表,查询慢,增删快
    2)线程不安全,效率高
Set集合(元素不可重复,元素唯一)
  • Hashset集合:
    1) 底层数据结构是哈希表,哈希表依赖两个方法hascode ()和equals()方法
    2)两个方法的执行顺序:
    首先判断hascode()值是否相同
    是:继续执行equals()方法,看其返回值
    是true:说明元素重复,不添加
    是false:就直接添加元素
    否:就直接添加到集合
Treeset集合:

1)底层数据结构是二叉树

Collection 和 Collections 有什么区别?
  • collection是java.util下的接口,他是各种集合的父接口,继承于它的接口主要有List和Set 。
  • collections是java.util下的工具类,针对集合的帮助类,提供一系列的静态方法对集合的搜索,排序,线程安全化等操作。
HashMap 和 Hashtable 有什么区别?
  • 首先两者都实现了Map接口,将唯一键映射都特定的值上,底层都是哈希算法,主要区别在于:
  • 1,HashMap没有排序,允许一个null键和多个null值,而HashTable不允许。
  • 2,HashMap是非synchronized的,而HashTable是synchronized的。synchronized是Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。
  • 3,HashMap线程不安全,而HashTable是线程安全的。
  • 4,HashMap是不同步的、效率高的,HashTable是同步的、效率低的。
如何决定使用 HashMap 还是 TreeMap?
  • 如果你需要得到一个有序的结果时就应该使用TreeMap(因为HashMap中元素的排列顺序是不固定的)。除此之外,由于HashMap有更好的性能,所以大多不需要排序的时候我们会使用HashMap。
说一下 HashMap 的实现原理?
  • 通过put(key,value)存储数据,通过get(key)来获取数据,当传入key时,HashMap会根据Key.hashCode()计算出Hash值,根据Hash值将value保存在bucket里 ,当计算出相同的Hash值时,我们称之为Hash冲突,HashMap 的做法是用链表和红黑树存储相同Hash值的value,当hash冲突的个数比较少时,使用链表存储,否则使用红黑树。
说一下 HashSet 的实现原理?
  • HashSet是基于HashMap实现的,HashSet 底层使用HashMap来保存所有元素,因此HashSet 的实现比较简单,相关HashSet 的操作,基本上都是直接调用底层HashMap的相关方法来完成,HashSet不允许有重复的值,并且元素是无序的。
Set中的元素是不可重复的,那么有什么方法来判断重复与否呢?
  • Set 中元素时不能重复的,用equals()方法来区分重复与否。
  • equals()方法来判断对象的内容是否相同,而“==”是用来判断地址是否祥腾,用来决定引用值是否指向同一对象。
ArrayList 和 LinkedList 的区别是什么?
  • ArrayList的实现是基于数组,LinkedList的实现是基于双向链表。
  • 对于随机访问,ArrayList优于LinkedList
  • 对于插入和删除操作,LinkedList优于ArrayList
  • LinkedList比ArrayList更占内存,因为LinkedList的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。
如何实现数组和 List 之间的转换?

数组转list – String[] str=new String[] {“hello”,“world”};

  • 使用for循环把数组元素加进list
  • 使用Arrays.asList(str)
  • 使用Collections.addAll(list ,str)
  • 使用使用Stream中的Collector收集器
    List转数组 – List list=new ArrayList();
  • 使用for循环
  • 使用toArray()方法
ArrayList 和 Vector 的区别是什么?
  • 同步性:Vector是线程安全带的(同步的),而ArrayList是线程不安全的。
  • 数据增长:当需要增长是,Vector默认增长一倍,而ArrayList确实一半。
List、Map、Set 三个接口,存取元素时,各有什么特点?
  • List 一特定次序来持有元素,可有重复元素。
  • Set 无法拥有重复元素,内部排序。
  • Map 保存key-value值,value可多值。
在 Queue 中 poll()和 remove()有什么区别?offer和add有什么区别?peek和element有什么区别?
poll和remove区别:
  • remove() 和 poll() 方法都是从队列中删除第一个元素。remove() 的行为与 Collection 接口的版本相似。poll() 方法在用空集合调用时不是抛出异常,只是返回 null。因此新的方法更适合容易出现异常条件的情况。
offer,add区别:
  • 一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。这时新的 offer 方法就可以起作用了。它不是对调用 add() 方法抛出一个 unchecked 异常,而只是得到由 offer() 返回的 false。
peek和element区别:
  • element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null
哪些集合类是线程安全的?
  • vector:就比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。
  • statck:堆栈类,先进后出
  • Hashtable:就比hashmap多了个线程安全
  • enumeration:枚举,相当于迭代器
迭代器 Iterator 是什么?
  • 迭代器是一种模式、详细可见其设计模式,可以使得序列类型的数据结构的遍历行为与被遍历的对象分离,即我们无需关心该序列的底层结构是什么样子的。只要拿到这个对象,使用迭代器就可以遍历这个对象的内部
  • Iterable 实现这个接口的集合对象支持迭代,是可以迭代的。实现了这个可以配合foreach使用.
  • Iterator 迭代器,提供迭代机制的对象,具体如何迭代是这个Iterator接口规范的。
  • Iterable还有一个默认的方法forEach()
  • 而Iterator接口:包含三个方法:hasNext,next,remove、remove一般很少用到
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值