返回顶部

集合~面试

为什么在面向对象编程时不用数组用集合?

  • 主要原因:数组长度固定,集合长度可变。
  • 数组可以存放基本数据类型和引用数据类型,集合存储的元素必须是引用数据类型。
  • Java提供了一个集合框架,该框架由 Collection 接口和 Map接口组成,Collection用于存放一组对象,Map存放键值对。

数据结构

  • 堆栈:先进后出
  • 队列:先进先出
  • 数组:通过索引查找速度快,增删元素慢
  • 链表:查找速度慢,增删快
  • 哈希表:查找、存储都比较快

List 接口及实现类

  • List是Collection的子接口,实现一种线性表的数据结构。
  • 所有元素都有下标索引,从0开始,通过索引访问元素。
  • 元素有序,可以重复。
  • ArrayList是最常用的集合,是通过数组实现的集合对象,所以它的查找速度快。
  • Vector集合数据存储也是数组,但是它是同步的也就是线程安全的,也就比ArrayList查找的速度慢,已经被ArrayList取代。
  • LinkedList集合数据存储的结构是链表结构,方便元素增加删除。

泛型:有界类型参数

  • 通配符 ?
//该方法可以传入任意类型的List对象
public sstatic void printList(List<?> list){
  for(Object obj : list){
    sout(obj);
  }
}
  • 有时候需要限制传入参数的类型,例如,要求一个方法只能接收Number类或其子类的实例,这时就需要使用有界类型参数
//上界限定,只能传入Number对象或其子类对象
List<? extend Number> numberList
//下界限定,只能传入Number对象或其父类对象
List<? super Number> numberList

Set 接口及实现类

  • Set接口是Collection接口的子接口,不允许有重复数据

  • HashSet具有最好的存取性能,但元素没有顺序,允许null元素。实际是HashMap实例。

    • String重写hashCode()方法
    • 哈希表:保证 Set 集合没有重复元素。
    • hashCode协定
  • LinkedHashSet是HashSet的子类,元素有顺序

  • TreeSet实现一种树集合,使用红黑树为元素排序,元素必须可比较。

Map 接口及实现类

  • 将键映射到值的对象,关键字和值都必须是对象,键唯一,值可以重复。

  • 常用实现类HashMap,子类LinkedHashMap。

    • 实现原理:
      • JDK7:new HashMap() 底层创建长度16的Entry[]数组。计算 key 的哈希值,找到存储位置,位置上没有元素则添加成功;有元素,比较哈希值是否相等,不等添加成功,相等则调用equals()方法,不相等添加成功,相等则覆盖。
      • JDK8:new HashMap() 底层创建Node[]数组,使用put()方法时指定长度16,底层结构:数组+链表+红黑树,当数组某一索引上链表元素>8且数组长度>64,此索引上数据使用红黑树存储
  • TreeMap类保证键值对按关键字升序排序

  • HashTable已经被HashMap取代,HashMap线程不安全,键值都可以为null,但是HashTable的子类Properties集合还在使用,经常和“流”结合使用

  • 遍历方法keySet(),返回键的Set集合;也可以使用entrySet()方法返回Set<Map.Entry<K,V>>集合,Map.Entry<K,V>的方法getKey()、getValue()。

posted @ 2021-10-31 20:05  凑数的园丁  阅读(24)  评论(0编辑  收藏  举报