乐趣区

关于java:转经典Java面试题的答案容器


大家好,我是酱油君。这是互联网技术岗的分享专题,废话少说,进入正题:

18.Java 容器都有哪些?

Java 次要包含两种类型的容器,一种是 Collection,存储一列元素,另一种是 Map,存储键 / 值对映射。Collection 接口又有 3 种子类型,List、Set 和 Queue。

19.Collection 和 Collections 有什么区别?

java.util.Collection 是一个汇合接口(汇合类的一个顶级接口)。它提供了对汇合对象进行基本操作的通用接口办法。Collection 接口在 Java 类库中有很多具体的实现。Collection 接口的意义是为各种具体的汇合提供了最大化的对立操作形式,其间接继承接口有 List 与 Set。

java.util.Collections 则是汇合类的一个工具类 / 帮忙类,其中提供了一系列静态方法,用于对汇合中元素进行排序、搜寻以及线程平安等各种操作。此类不能实例化。

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

21.HashMap 和 Hashtable 有什么区别?

hashMap 去掉了 HashTable 的 contains 办法,然而加上了 containsValue()和 containsKey()办法。

hashTable 同步的,而 HashMap 是非同步的,效率上逼 hashTable 要高。

hashMap 容许空键值,而 hashTable 不容许。

22. 如何决定应用 HashMap 还是 TreeMap?

如果你须要失去一个有序的后果时就应该应用 TreeMap(因为 HashMap 中元素的排列程序是不固定的)。除此之外,因为 HashMap 有更好的性能,所以大多不须要排序的时候咱们会应用 HashMap。

起因:

TreeMap<K,V> 的 Key 值是要求实现 java.lang.Comparable,所以迭代的时候 TreeMap 默认是依照 Key 值升序排序的;TreeMap 的实现是基于红黑树结构。实用于按天然程序或自定义程序遍历键(key)。

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

23. 说一下 HashMap 的实现原理?

  • HashMap 基于 Hash 算法实现,通过 put(key,value) 存储,get(key) 来获取 value
  • 当传入 key 时,HashMap 会依据 key,调用 hash(Object key) 办法,计算出 hash 值,依据 hash 值将 value 保留在 Node 对象里,Node 对象保留在数组里
  • 当计算出的 hash 值雷同时,称之为 hash 抵触,HashMap 的做法是用链表和红黑树存储雷同 hash 值的 value
  • 当 hash 抵触的个数:小于等于 8 应用链表;大于 8 时,应用红黑树解决链表查问慢的问题

这个问题答到这里 OK 了,然而你须要了解:不是每个 java 版本里,hashMap 的实现原理都是不变的,酱油君通知你,java 不同的版本在这个如何获取 key 的 hash 值和缩小 hash 值抵触的问题上在一直的优化。

24. 说一下 HashSet 的实现原理?

HashSet 是基于 HashMap 实现的,HashSet 中的元素都寄存在 HashMap 的 key 下面,而 value 中的值都是对立的一个 private static final Object PRESENT = new Object()。

25.ArrayList 和 LinkedList 的区别是什么?

  • ArrayList 是实现了基于动静数组的数据结构,LinkedList 是基于链表构造。
  • 对于随机拜访的 get 和 set 办法,ArrayList 要优于 LinkedList,因为 LinkedList 要挪动指针。
  • 对于新增和删除操作 add 和 remove,LinkedList 比拟占优势,因为 ArrayList 要挪动数据。

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

List 转换成为数组:调用 ArrayList 的 toArray 办法。

数组转换成为 List:调用 Arrays 的 asList 办法。

27.ArrayList 和 Vector 的区别是什么?

线程平安 :Vector 应用了 Synchronized 来实现线程同步,是线程平安的,而 ArrayList 是非线程平安的。

性能 :ArrayList 在性能方面要优于 Vector。起因就是 Vector 是线程平安的,即某一时刻只有一个线程可能写 Vector,防止多线程同时写而引起的不一致性,但实现同步须要很高的破费。

扩容 :ArrayList 和 Vector 都会依据理论的须要动静的调整容量,只不过在 Vector 扩容每次会减少 1 倍,而 ArrayList 只会减少 50%。

28.Array 和 ArrayList 有何区别?

  • Array 能够包容根本类型和对象,而 ArrayList 只能包容对象。
  • Array 是指定大小的,而 ArrayList 大小是固定的。
  • Array 没有提供 ArrayList 那么多功能,比方 addAll、removeAll 和 iterator 等。

29. 在 Queue 中 poll() 和 remove() 有什么区别?

相同点:都是返回第一个元素,并在队列中删除返回的对象。

不同点:如果没有元素 poll() 会返回 null,而 remove() 会间接抛出 NoSuchElementException 异样。

30. 哪些汇合类是线程平安的?

  • vector:就比 arraylist 多了个同步化机制(线程平安),因为效率较低,当初曾经不太倡议应用。在 web 利用中,特地是前台页面,往往效率(页面响应速度)是优先思考的。
  • statck:堆栈类,先进后出。
  • hashtable:就比 hashmap 多了个线程平安。
  • enumeration:枚举,相当于迭代器。

31. 迭代器 Iterator 是什么?

迭代器是一种设计模式,它是一个对象,它能够遍历并抉择序列中的对象,而开发人员不须要理解该序列的底层构造。迭代器通常被称为“轻量级”对象,因为创立它的代价小。

32.Iterator 怎么应用?有什么特点?

Iterator 怎么应用?

  • Iterator() 要求容器返回一个 Iterator。Iterator 将筹备好返回序列的第一个元素。
  • 应用 next() 取得序列中的下一个元素
  • 应用 hasNext() 查看序列中是否还有元素。
  • 应用 remove() 将迭代器早先返回的元素删除。

Iterator 的特点?

  • Iterator 遍历汇合元素的过程中不容许线程对汇合元素进行批改,否则会抛出 ConcurrentModificationEception 的异样。
  • Iterator 必须依附于一个汇合类对象而存在,Iterator 自身不具备装载数据对象的性能。

33.Iterator 和 ListIterator 有什么区别?

  • Iterator 可用来遍历 Set 和 List 汇合,然而 ListIterator 只能用来遍历 List。
  • Iterator 对汇合只能是前向遍历,ListIterator 既能够前向也能够后向。
  • ListIterator 实现了 Iterator 接口,并蕴含其余的性能,比方:减少元素,替换元素,获取前一个和后一个元素的索引,等等。

34. 怎么确保一个汇合不能被批改?

能够应用 Collections. unmodifiableCollection(Collection c) 办法来创立一个只读汇合,这样扭转汇合的任何操作都会抛出 Java. lang. UnsupportedOperationException 异样。

举例:

 List<String> list = new ArrayList<>();
 list.add("A");
 Collection<String> unmlist = Collections. unmodifiableCollection(list);
 unmlist.add("B"); // 运行时此行报错
 System. out. println(list.size());

文章转载自:
经典 Java 面试题的答案——容器

退出移动版