Java容器

十八、java 容器都有哪些?

Java容器_第1张图片Java容器_第2张图片

十九、Collection 和 Collections 有什么区别?

  • java.util.Collection 是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection 接口在 Java 类库中有很多具体的实现。Collection 接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有 List、Queue、Set。
  • Collections 则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。

二十、List、Set、Map 之间的区别?

比较 List Set Map
继承接口 Collection Collection  
常见实现类

AbstractList(其常用子类有Array

List,LinkedList,Vector)

 

AbstractSet(其常用子类有HashSet,LinkedHashSet,TreeSet) HashMap,HashTable
常见方法

add(),remove(),clear(),get(),

contains(),size()

add(),remove(),clear(),contains(),size()

put(),get(),remove(),clear(),containsKey(),

containsValue(),keySet(),values(),size()

元素 可重复 不可重复(用equals()判断) 不可重复
顺序 有序 无序(实际上是由HashCode决定)  
线程安全 Vector线程安全   HashTable线程安全

二十一、HashMap 和 HashTable 有什么区别?

  • HashMap 去掉了 HashTable 的contains 方法,但是加上了containsValue()和containsKey()方法。
  • HashTable 是同步的,HashMap是非同步的,效率上比HashTable高。
  • HashMap 允许空键值,而 HashTable不允许。

二十二、如何决定使用 HashMap 还是 TreeMap?

对于在 Map 中插入,删除和定位元素这类操作,HashMap是最好的选择。然而,假如你需要对一个有序的 key 集合进行遍历,TreeMap 是更好的选择,基于你的collection 的大小,也许向 HashMap 中添加元素会更快,将map换为 TreeMap 进行有序 key 的遍历。

二十三、说一下HashMap的实现原理?

HashMap概述:HashMap是基于哈希表的Map接口的非同步实现,此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

HashMap 的数据结构:在 java 编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap 实际上是一个“链表散列”的数据结构,即数组和链表的结合体。

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

需要注意 jdk 1.8 中对HashMap的实现做了优化,当链表中的结点数据超过8个之后,该链表会转为红黑树来提高查询效率,从原来的O(n)到O(logn)。

二十四、说一下 HashSet 的实现原理?

  • HashSet 底层由 HashMap 实现
  • HashSet 的值存放于 HashMap 的 key上。
  • HashMap 的value统一为PRESENT

二十五、ArrayList 和 LinkedList 的区别是什么?

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

二十六、如何实现数组和 List 之间的转换?

  • List转换为数组:调用ArrayList 的toArray方法。
  • 数组转换为List:调用Arrays的asList方法。

二十七、ArrayList和Vector的区别是什么?

  • Vector是同步的,而ArrayList不是。然而,如果寻求在迭代的时候对列表进行改变,你应该使用 CopyOnWriteArrayList。
  • ArrayList比Vector快,它因为有同步,不会过载。
  • ArrayList更加通用,因为可以使用Collections工具类轻易地获取同步列表和只读列表。

二十八、Array和ArrayList有何区别?

  • ArrayList可以容纳基本类型和对象,而ArrayList只能容纳对象。
  • Array是指定大小的,而ArrayList大小是固定的。
  • Array没有提供ArrayList那么多功能,比如addAll()、removeAll()和iterator等。

二十九、在Queue中poll()和remove()有什么区别?

poll()和remove()都是从队列中取出一个元素,但是poll()在获取元素失败的时候会返回Null,但是remove()失败时会抛出异常。

三十、哪些集合类是线程安全地?

  • vector:就比arrayList多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑地。
  • stack:堆栈类,先进后出。
  • hashtable:就比hashmap多了个线程安全。
  • enum:枚举,相当于迭代器。

三十一、迭代器iterator是什么?

迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。

三十二、Iterator怎么使用?有什么特点?

Java中的Iterator功能比较简单,并且只能单向移动:

  1. 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法时java.lang.Iterable接口,被Collection继承。
  2. 使用next()获得序列中的下一个元素。
  3. 使用hasNext()检查序列中是否还有元素。
  4. 使用remove()将迭代器新返回的元素删除。

Iterator是java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

三十三、Iterator和ListIterator有什么区别?

  • Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。
  • Iterator 对集合只能是前向遍历,ListIterator既可以向前也可以向后。
  • ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引等。

 

你可能感兴趣的:(学习笔记)