1.数组和集合的区别:
数组一经初始化之后长度就不可变(final修饰),集合可变;
数组只能存放同一种元素,集合可存多种不同元素;
数组中只能存放有序的元素,可以添加重复元素。集合可以无序,不可以出现无序的元素。
2.Collection下有什么常用的子类集合,说说底层原理 ((1条消息) Java集合类总结,详细且易懂!_WgRui的博客-CSDN博客)详解底层
首先collection是单列集合:
add(E e)添加元素; clear()清空元素; remove(E e)移除元素; size()元素数量;
toArray()集合转数组; contains(E e)判断元素是否存在; isEmpty()判断集合是否为空;
有list和set
list:有索引、元素有序、可以重复\链表结构没有索引
Arraylist:底层是数组,线程不安全,查询快增删慢,高效
Linklist:底层是双向链表,线程不安全,查询慢(头尾除外),增删快,高效
Vector:底层是数组,线程安全,低效
set:元素不可重复、无索引、查询快
hashset:是Set的主要实现类,线程不安全,底层是hashMap。初始容量和加载因子都和hashMap一样、元素无序
treeSet:是SortedSet接口的实现类,可以按照对象的指定属性进行排序、元素有序
LinkedHashSet:是hashset的继承实现类,是按照添加元素的顺序进行遍历,因为底层维护了一张链表用来记录添加的顺序、元素有序
3.说一下map接口中的常用子类。以及底层实现原理
map是双列集合,存值方式是键值对
put(key , value) 添加元素; remove(key) 删除key对应元素;
containsKey(key) 判断是否存在key对应元素;get(key) 获取key对应元素;
KeySet() 获取所有的key,存到Set集合中;entrySet() 获取所有的元素,存到Set集合中;
ps:Map集合必须保证保证key唯一,作为key,必须重写hashCode方法和equals方法,以保证key唯一。
四个实现类:
hashmap:JDK1.8之前:哈希表(数组+单向链表);JDK1.8之后:哈希表(数组+单向链表+红黑树),当链表长度超过阈值(8)时,链表将转换为红黑树。
特点:查询快、无序、key可以为null、是线程不安全的
linkedhashmap:和hashmap一样的底层、查询快、有序、key可以为null、是线程不安全的
hashtable:哈希表、 查询快、无序、key不可为null、是线程安全的
treemap:红黑树、查询快、有序、key不能为null
4..ArrayList 1.7版本和1.8版本底层扩容的实现原理
1.7时直接创建长度为10的数组、第11个增加才扩容1.5倍(饿汉式)
1.8时add时才创建数组(懒汉式)
5.ArrayList 和 Vector 的区别
1. Vector与ArrayList一样,也是通过数组实现的,Vector类的所有方法都是同步的。它也是线程安全的,而Arraylist是线程异步(ASynchronized)的,是不安全的。如果不考虑到线程的安全因素,一般用Arraylist效率比较高。
2. 使用ArrayList时,如果不指定大小,会生成一个空的数组;使用Vector时,如果不指定大小,会默认生成一个10个元素大小的数组
3. 扩容方面。Vector默认在大小为0的时候就会扩容,第一次扩容容量是2倍,如果还达不到要求,则直接扩容到指定容量
6.ArrayList和LinkedList 的区别和联系、Set不能存放重复元素,其底层是如何实现的、HashMap中put方法的过程?
7.HashMap和HashTable有什么区别?
- ①、`HashMap`是线程不安全的,`HashTable`是线程安全的;
- ②、由于线程安全,所以`HashTable`的效率比不上`HashMap`;
- ③、`HashMap`最多只允许一条记录的键为`null`,允许多条记录的值为`null`,而`HashTable`不允许;
- ④、`HashMap`默认初始化数组的大小为16,`HashTable`为11,前者扩容时,扩大两倍,后者扩大两倍+1;
- ⑤、`HashMap`需要重新计算hash值,而`HashTable`直接使用对象的`hashCode`;
8.你知道hash的实现吗?为什么要这样实现?
`JDK1.8`中,是通过`hashCode()`的高16位异或低16位实现的:`(h=k.hashCode())^(h>>>16)`,主要是从速度,功效和质量来考虑的,减少系统的开销,也不会造成因为高位没有参与下标的计算,从而引起的碰撞。