面试——Java 容器


容器有哪些?

Java 容器分为 Collection 和 Map 两大类,下面还有多个子类:

  • Collection
  • Set
    • HashSet
    • LinkedHashSet
    • TreeSet
  • Map
    • HashMap
    • LinkedHashMap
    • TreeMap
    • ConcurrentHashMap
    • HashTable
  • List
    • ArrayList
    • LinkedList
    • Vector
    • Stack

Collection 和 Collections 有什么区别吗?

前者是一个集合接口,它提供了对集合对象进行的基本操作的通用接口方法,所有集合都是它的子类;(List、Set…)
后者是一个封装包,它包含了多个静态方法且无法实例化,像个工具类(排序方法:Collections.sort(list)…)。


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

元素是否有序、是否允许元素重复入手。

元素有序允许元素重复
List
SetAbstractSet
HashSet
TreeSet是(用二叉树排序)
MapAbstractMapvalue 可重复,但 key 值必须唯一
HashMap
TreeMap是(用二叉树排序)

HashMap 和 HashTable 有什么区别?

存储、安全性、单、多线程环境

HashMap 在存储中 key 和 value 可以为 null,HashTable 不行;
HashMap 是非线程安全的,HashTable 是线程安全的;
HashTable 是保留类不建议使用,单线程下推荐使用 HashMap 替代,多线程下则使用 ConcurrentHashMap 替代。


哪些集合类是线程安全的?

Vector、HashTable、Stack 是线程安全的;
在 JDK.1.5 以后随着java.util.concurrent并发包的出现,一些非线程安全的类也有了自己对应的线程安全类了。(HashMap —> ConcurrentHashMap)


怎么决定如何去使用 HashMap 和 TreeMap?

在 Map 中对一个元素进行插入、删除、定位操作,应使用 HashMap 较好,因为它插入快;若是对一个 key 集合进行有序的遍历,应使用 TreeMap。


HashMap 的实现原理是什么?

它是基于 Hash 算法实现的,通过 put(key,value) 存储、get(key) 获取。
当传入 key 值时,HashMap 会根据 key.hashCode() 算出 hash 值,并以 hash 值将 value 存在 bucket。
当 hash 值相同时(hash 冲突),HashMap 是用链表和红黑树来存储相同 hash 值的 value,当 hash 冲突的数量较少时使用表链,反之使用红黑树。


HashSet 的实现原理是什么?

它是基于 HashMap 实现的,其底层使用了 HashMap 来存储元素。它的简单,操作基本上是直接调用底层 HashMap 的方法去完成的。


Array 和 ArrayList 的区别是什么?

前者可存储基本数据类型和对象,后者只能存储对象;
前者是指定固定大小,后者能自动扩容;(扩容容量为之前的50%)
addAll、removeAll、iteration 等方式是 ArrayList 的。


ArrayList 和 LinkedList 有什么区别?

  • 数据结构实现: ArrayList 是动态数组,LinkedList 是双向链表的;
  • 随机访问率: ArrayList 比 LinkedList 在随机访问时效率要高,因为 LinkedList 是线性存储方式,指针需要从前往后移动依次的查找。
  • 增加和删除效率: 在非头尾的增删操作时,LinkedList 要比 ArrayList 效率高,因为 ArrayList 的增删操作将会影响数组内的其他数据下标。

读取集合元素频繁用 ArrayList,增删操作频繁用 LinkedList 。


数组和 List 间的转换如何实现?

  • 数组转 List:用 Arrays.asList(array)
  • List 转数组:用 list.toArray()

ArrayList 和 Vector 有什么区别?

  • 扩容: 两者都能根据实际的需要动态的调整容量。ArrayList 只增加之前的 50%,Vector 每次扩容都增加1倍。
  • 线程安全: Vector 用了 Synchronized 来实现线程同步,ArrayList 是非线程安全的。
  • 性能: ArrayList 比 Vector 好。

Iterator 是什么?

Iterator —— 迭代器
iterator 接口提供遍历任何 Collection 的接口。iterator 取代了 Java 集合框架中的 Enumeration,它允许调用者在迭代的过程中移除元素。

List<String> list = new ArrayList<>();
Iterator<String> i = list.iterator();
while(it.hashNext()) {
	String o = i.next();
	System.out.prinln(o);
}

特点:更安全。可确保在当前遍历的集合元素被更改的时候,便会抛出ConcurrentModificationException异常。


Iterator 和 ListIterator 有什么区别?

前者能遍历 Set 和 List 集合,后者只能遍历 List 集合;
前者是单向遍历,后者是双向遍历(向前向后);
后者是从前者继承过来的,并额外添加了些功能(添加、替换一个元素,获取前面 / 后面元素的索引位置)。


如何确保一个集合不能被修改?

使用Collections.unmodifiableColletion(Collection c)方法创建一个只读集合,如此改变集合的任何操作都会抛出java.lang.UnsupportedOperationException异常。

List<String> list = new ArrayList<>();
list.add("aa");
Collection<String> c = Collections.unmodifiableCollection(list);
c.add("gg"); // 运行时这行报错
System.out.println(list.size());
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值