第二部分 容器

81 阅读3分钟

第二部分 容器

18 常用的Java容器有哪些?

19 Collection和Collections有什么区别?

  • java.util.Collection是集合类的顶级接口,提供了对集合对象进行基本操作的通用接口方法,直接继承接口有List和Set,它的意义是为各种具体的集合对象提供最大化的统一操作方法
  • Collections是集合类的一个工具类,其中提供了许多静态方法,用于对集合中元素进行排序,搜素和线程安全等操作

20 List,Set, Map的区别是什么?

21 HashMap和HashTable有什么区别?

  • HashMap删去了HashTable的contains(),但是添加了containsKey()containsValue()
  • HashMap是非同步的,HashTable是同步的
  • HashMap允许空键值,HashTable不允许有键值

22 HashMap和TreeMap

TreeMap默认按键值进行排序

23 HashMap的实现原理

HashMap是数组加链表的实现

当我们put一个元素的时候,会先根据该元素的hashcode值找到对应的下标,如果当前没有元素,则直接存放该元素,如果已经有元素了,则使用头插法插入到链表中

在JDK1.8中,如果链表的长度超过8,则会将链表转化为红黑树

24 HashSet的实现原理

  • HashSet的底层是HashMap
  • HashSet的值存在HashMap的键上
  • HashMap的值都为PRESENT

25 ArrayList和LinkedList的区别

  • ArrayList是基于数组实现的,随机访问块,增删慢
  • LinkedList是基于链表实现的,随机访问慢,增删快

26 如何实现List和数组的转换

  • List转换为数组:List.toArray()
  • 数组转换为List:Arrays.asList()

27 ArrayList和Vector的区别

Vector是线程安全的,ArrayList不是

28 Array和ArrayList的区别

  • Array中元素可以是对象和基本数据类型,ArrayList的元素只能是对象
  • Array是固定大小的,而ArrayList不是固定大小的
    • ArrayList的扩容机制
      1. 当ArrayList的容量为0时,扩容取决于声明时的构造函数,如果使用的是无参构造,则扩容后的容量为10, 如果使用传容量为参数构造,且一开始传的参数为0,或者使用传列表为参数构造,且一开始传入的列表为空的话,则扩容后的容量为1
      2. 当ArrayList的容量不为0,且已经满了,每次扩容都按1.5倍扩容

29 在Queue中pollremove的区别

pollremove都是从队列中取出一个元素,区别在于poll在队列为空时返回的是null,remove在队列为空时会抛出异常

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

  • Vector
  • Stack
  • HashTable
  • Enumeration

31 迭代器Iterator是什么

迭代器是一种设计模式,它用于遍历集合中的元素,而开发人员不需要了解其底层的数据结构。迭代器被称为轻量级的对象,创建它的代价较小

32 Iterator如何使用

  1. 使用iterator()获取容器中的Iterator对象
  2. 使用next()获取元素
  3. 使用hasNext()判断是否有下一个元素
  4. 使用remove()删除元素

33 Iterator和LinkIterator的区别

  • Iterator可以遍历List和Set,LinkIterator只能用来遍历List
  • Iterator只能单向遍历,LinkIterator可以双向遍历
  • LinkIterator继承了Iterator,还添加了一些新的功能:增加,修改元素,返回前一个和后一个的索引