1.集合和数组区别?
- 数组不可变,集合可变。
- 数组可以存取基本数据类型和引用数据类型,集合只能存储引用数据类型,如果要存储基本数据类型,存储基本数据类型的包装类。
2.集合分类?
3.List和Set都是单列集合
- List集合存储有序,可重复,有索引。
- Set集合存储无序,不可重复,无索引。
4.ArrayList底层是数组,查询快,增删慢;LinkedList底层是链表,查询慢,增删快。
5.HashSet底层数据结构是哈希表,存储无序且不重复,存入的字符底层会自动根据哈希值(jdk根据对象地址或字符串或数字计算出来的int类型的数值)进行排序,排序规则:jdk1.8之前使用数组+链表+哈希算法,jdk1.8之后使用数组+链表+红黑树+哈希算法(当链表长度大于8时,链表将转化为红黑树)。(至于hash表是如何实现扩容的,参考我另一篇博客:hash表扩容机制)
6.TreeSet没有索引且不能存储重复元素,存入的元素会根据一定规则排序
- 自然排序:自定义对象时实现Comparable接口,重写compareTo方法,根据返回值进行排序(默认使用自然排序)
- 比较器排序:创建TreeSet对象的时候传递Comparator的实现类对象,重写compare方法,根据返回值进行排序
两种排序的排序规则
- 如果返回值为负数,则表示要存入的元素是较小的值,存左边
- 如果返回值为0,则表示要存入的元素和集合中的元素重复了,不存储
- 如果返回值为正数,则表示要存入的元素是较大的值,存右边
7.map是双列集合,由键和值构成键值对,一个键对应一个值,键不能重复,值可以重复。遍历map集合有两种方式,1:获取所有键的集合,遍历键的集合根据键获取每个值。2:获取所有键值对对象的集合,然后遍历键值对对象,获取每个键值对的键和值
8.HashMap和TreeMap都是双列集合
- HashMap底层是哈希表结构,根据hashCode和equals保证键的唯一性,如果存储自定义对象,需要重写hashCode和equals方法,HashMap是线程不安全的,Hashtable和CurrentHashMap是线程安全的
- TreeMap底层是红黑树结构,根据自然排序和比较器排序对键进行排序