JAVA基础面试题
1、请说说Java中的集合类,项目中是怎么使用的?
- Java集合主要是Collection接口和Map接口,以及它们的子接口和实现类。
- Collection接口下有子接口List和Set。
- List接口的实现类主要有ArrayList,Vector,LinkedList。
- ArrayList线程不安全,底层实现是一个Object类型的动态数组。存放的元素是有序的,但是可以重复。ArrayList在逻辑上是顺序结构,所以查询速度快,但是对数据的新增和删除效率低。在jdk1.7中,ArrayList的初始化长度是10,jdk1.8中初始化长度为0。当需要扩容时,是按照原长度的1.5倍进行扩容的。扩容时会复制旧的数据到新的数组中,并将引用指向新的数组。
- Vector是线程安全的容器。Vector里面的方法都用synchronized关键字修饰的。底层实现上也是一个Object类型的数组,初始化长度为10,扩容时按照2倍进行扩容。
- LinkedList实现上双向链表。存放数据时是包装成节点对象存储的,一个节点中除了存放元素之外,还有两个分别指向前一个节点和后一个节点的指针,所以对于LinkedList而言遍历查询效率低,但是对于插入和删除的效率高。
- Set接口的实现类主要有HashSet,TreeSet,LinkedHashSet,这三个都是线程不安全的。
- HashSet存放的元素是唯一且无序的,无序指的是存放元素时不会按照输入的顺序存放,遍历时也不会按照升序或者降序来排列。底层实现上是哈希表,这样就要求存放的元素必须重写equals和hashCode方法。
- LinkedHashSet继承了HashSet,存放的元素是唯一且有序的,这个有序指的是存放元素时按照输入的顺序。在底层的实现上除了哈希表之外,还维护了一个元素的顺序链表,这个链表将存放的元素按照存放顺序链接起来。
- TreeSet(底层是红黑树)存放的元素是唯一有序的。这个有序指的是进行遍历时会按照二叉树的遍历方式进行排序。二叉树本来就是有序的,怎么保证存放的元素时有序的呢?要求存放的元素必须实现内部比较器接口Comparable接口并实现compareTo方法或者实现外部比较器接口Comparator,并重写compare方法。
- Map接口的主要实现有:HashTable,HashMap,TreeMap。其中HashTable是线程安全的,HashMap和TreeMap是线程不安全的。
- HashTable使用时不能存放值为Null的key,但是HashMap可以存放,且只能存放一个。
- HashMap按照键值对的方式存储数据。底层实现是数组+链表,对于存放的key而言必须重写hashCode方法和equals方法。
- LinkedHashMap是HashMap的子类,在实现上还维护了一个元素的顺序链表,链表将存放的元素按照顺序链接起来。
- TreeMap
- List接口的实现类主要有ArrayList,Vector,LinkedList。