java面试题(容器)

在这里插入图片描述
1、ArrayList 和 LinkedList 的区别是什么?
ArrayList是一段内存空间连续的地址,内部实现是通过数组实现的,LinkedList是通过链表的形式将每个元素的关系连接起来的,地址不是连续的,所以对于ArrayList来说,随机访问的效率肯定比ArrayList高,但是一般情况下插入元素和删除元素效率就比LinkedList低很多,因为要做频繁的元素移动操作
2、List,Set,Map之间的区别:
List集合中可以有相同的元素,而且输出的顺序就是我们添加进去的顺序
Set集合中不可以有相同的元素,而且输入顺序和输出顺序没有直接联系
Map集合和上面两者完全不同,继承的接口都不一样,Map是一键值对的形式存放数据。
3、如何实现数组和List之间的转换?

int[] a=new int[]{1,2,5,4,8};
        //将数组转为List集合
        List<int[]> list = Arrays.asList(a);

        //定义一个ArrayList集合
        List<Integer> list1=new ArrayList();
        //向集合中添加元素
        list1.add(1);
        list1.add(2);
        list1.add(4);
        //将ArrayList集合转为数组
        //这里有几个注意点:下面注释的几种都是错误的
        //int[] array=(int[])list1.toArray();
        //int[] array=list1.toArray(new int[0]);
        //int[] array=list1.toArray(new Integer[0]);
        //下面的这种方式才是正确的转换形式
        Integer[] array=list1.toArray(new Integer[0]);
        for(int i=0;i<array.length;i++){
            System.out.print(array[i]+" ");
        }

将数组转换为集合没有多大的问题,但是将集合转为数组,却有一些小问题,最简单的方法就是将每一个元素取出来然后赋值给一个新的数组,但是这样的效率不高,代码也不优雅。int[] array=(int[])list1.toArray();为什么这种方式不可以呢?对于强制类型转换是针对一个对象的,而集合中是一组对象,所以不能直接这样转换。后面的两者情况不可以,我们需要使用的是包装类来实现转换。
那么Integer[] array=list1.toArray(new Integer[0]);怎么理解呢,其实就是指定返回的类型是一个整型的数组类型,如果不这样写,返回的是一个Object[]类型的数组,其实new Integer[0]中的零是随意的,只是创建一个对象而已。
4、ArrayList 和 Vector 的区别是什么?
1、ArrayList是线程不安全的,但是效率很高,Vector是线程安全的,但是效率很低。
2、ArrayList是jdk1.2以后出来的,Vevtor在jdk1,0就出来了,现在通常用的是ArrayList,几乎很少使用到Vector
5、Collection和Collections的区别:
Collection是一个集合的顶级接口,封装了很多集合的操作方法,集合List和集合Set都是直接继承了Collection接口
Collections是集合框架中的一个工具类,在它里面封装了对集合的一些操作,比如sort排序函数
5、在 Queue 中 poll()和 remove()有什么区别?

 //实现Queue的一种方法,它是一个接口,所以要用它的子类来实例化
        Queue<Integer> queue=new LinkedList();
        //往队列中添加元素
        queue.add(1);
        queue.add(2);
        //符合队列的性质,先进先出
        System.out.println(queue.poll());  //1
        System.out.println(queue.poll());  //2
        System.out.println(queue.poll());  //null
        System.out.println(queue.remove());//java.util.NoSuchElementException

对于poll(),如果队列为空,返回值为null
对于remove(),如果队列为空,那么直接报错
6、那些集合类是线程安全的?
Vector:比ArrayList多了一个线程安全,但是效率很低,基本不适用
Statck:栈,先进后出
HashTable:比HashMap多了一个线程安全
7、Iterator是什么,怎么使用?
先通过一段代码来看看怎么使用

 ArrayList<String> list = new ArrayList<>();
        list.add("鲁班");
        list.add("凯");
        list.add("典韦");
        list.add("白起");
        //获取一个Iterator迭代器
        Iterator<String> iterator = list.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }

简单的说,迭代器就是为了集合框架中遍历元素。通过集合对象获取一个迭代器对象
hasNext():是否还有下一个元素
next();下一个元素
remove();虽然有这个删除的函数,但是迭代器就是为了变量元素而产生的,所以最好不要使用这个方法。
8、Iterator 和 ListIterator 有什么区别?
1、Iterator是对Set集合和List集合都存在的,而ListIterator是只有List集合内才有的
2、Iterator只能单向的往后遍历,ListIterator有往前遍历的能力,可以双向的遍历
3、ListIterator功能更加强大,里面包含了跟多的方法,比如添加元素,返回下标位置等等。
9、简单的叙述一下hashmap的实现原理?
HashMap是Map接口的一个实现类,以键值对的形式存在,允许null值和null键。HashMap底层是通过数据和链表两者数据结构组合实现的。首先根据key值计算hash值,根据hash值获取数组下标值,如果这个下标不存在,那么直接将这个key值对于的value值添加到数组中去,如果存在,那么对应数组位置将以链表的形式存在,新添加的元素在链表头,jdk1.8以后,如果链表的长度大于8,就会以红黑树的形式进一步优化实现,时间复杂度O(n)降到O(logn)
(本人能力有限,无法自己实现代码,只是初步的了解实现的原理,在学习中)
10、haspMap和TreeMap的区别:
通过上面的原理理解,我们知道HashMap中可以根据hashCode值获取数组下标值,而且里面的实现有链表,所以对于定位元素,删除,插入元素使用HashMap更加高效,TreeMap里面的元素会进行一定的排序,所以如果对于结果需要一个指定的顺序,那么使用TreeMap高效一些。
11、HashTable和HashMap的区别:
HashMap:是非同步的,所以线程不安全,但是效率更高
HashTable:是同步的,线程安全,但是效率比HashMap低
其它两者都一样使用
总结:对于这一章是难点也是重点,只是掌握初步的使用阶段,但是内部实现原理如果要我们自己手写是很难的(能力有限)数据结构是编程的核心,是以后进步的心法,所以有必要在今后的学习中再一次深入学习
(共勉)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章