精华内容
下载资源
问答
  • Java 集合常见面试题
    2019-05-19 16:47:21

    1、ArrayList和LinkedList区别?

    ArrayList是容量可以改变的非线程安全集合。内部实现使用数组进行存储,集合扩容时会创建更大的数组空间,把原有数据复制到新数组中。ArrayList支持对元素的快速随机访问,但是插入与删除时速度通常很慢,因为这个过程很有可能需要移动其他元素。

    LinkedList的本质是双向链表。与ArrayList相比,LinkedList的插入和删除速度更快,但是随机访问速度则很慢。测试表明,对于10万条的数据,与ArrayList相比,随机提取元素时存在数百倍的差距。除继承AbstractList抽象类外,LinkedList还实现了另一个接口Deque,即double-ended queue。这个接口同时具有队列和栈的性质。LinkedList包含3个重要的成员:size、first、last。size是双向链表中节点的个数。first和last分别指向第一个和最后一个节点的引用。LinkedList的优点在于可以将零散的内存单元通过附加引用的方式关联起来,形成按链路顺序查找的线性结构,内存利用率较高。【1】

    ......

     

     

     

     

     

     

     

    【1】《码出高效:Java 开发手册》

    更多相关内容
  • java集合常见面试题附带答案解析
  • Java集合常见面试题

    2022-01-15 17:47:16
    集合面试常问Java集合框架继承图综合面试题1.说说List、Set、Queue和Map四者的区别、2.集合的底层数据结构3.如何选取集合结构?4.我们为什么要使用集合?List1.ArrayList和Vector的区别?2.ArrayList与LinkedList的...

    原文链接:https://javaguide.cn

    Java集合框架继承图

    在这里插入图片描述

    综合面试题

    1.说说List、Set、Queue和Map四者的区别、

    • List 存储的元素是有序的、可重复的
    • Set 存储的元素是无序的、不可重复的
    • Queue 按照特定的排队规则来排序,存储的元素是有序的、可重复的
    • Map 使用key-value来进行存储数据,key是无序的、不可重复的,value是无序的、可重复的

    2.集合的底层数据结构

    List

    • ArrayList Object[]数组
    • Vector Object[]数组
    • LinkedList 双向链表(jdk1.6之前是循环链表,1.7取消了循环)

    Set

    • HashSet(无序、唯一) 底层采用HashMap来保存元素
    • TreeSet(有序、唯一) 底层采用红黑树(自平衡的二叉排序树)实现

    Queue

    • ArrayQueue Object[]数组 + 双指针
    • PriorityQueue Object[]数组来实现二叉堆

    Map

    • HashMap jdk1.8之前由数组+链表组成,数组是HashMap的主体,而链表主要是为了解决哈希冲突。jdk1.8之后引入了红黑树。当链表长度大于等于8且数组长度大于等于64,链表就会转化为红黑树。如果只满足一个条件,那么会优先选择数组扩容。
    • TreeMap 红黑树(自平衡的二叉排序树),底层是基于TreeSet实现的。
    • HashTable 数组+链表组成,数组是HashTable的主题,链表则是主要是为了解决哈希冲突而存在的。

    3.如何选取集合结构?

    • 如果我们需要根据键值来获取元素值,就可以选用Map接口下的集合。需要排序就选用TreeMap,不需要排序就选用HashMap,需要保证线程安全就选用ConcurrentHashMap;
    • 如果我们只需要存放元素值,就选择实现Collection接口的集合。需要保证元素唯一时选择Set接口下的集合,比如TreeSet或者是HashSet,不需要就选用List接口下的集合,比如ArrayList或者LinkedList。

    4.我们为什么要使用集合?

    当我们需要保存一组类型相同的数据的时候,由于数据的类型是多种多样的,所以我们使用了集合。集合提高了数据存储的灵活性,还可以保存具有映射关系的数据。

    List

    1.ArrayList和Vector的区别?

    • ArrayList是List的主要实现类,底层使用Object[]数组存储,线程不安全;
    • Vector是List的古老实现类,底层使用Object[]存储,线程安全。

    2.ArrayList与LinkedList的区别?

    ​ (1)是否保证线程安全: ArrayList和LinkedList都是不同步的、线程不安全的。

    ​ (2)底层实现: ArrayList底层使用Object[]数组实现,LinkedList底层使用双向链表实现。(jdk1.6之前是双向循环链表,1.6之后取消了循环)。

    ​ (3)是否支持快速随机访问: ArrayList底层使用数组实现,支持快速访问。而LinkedList底层是链表实现,不支持快速访问。

    ​ (4)空间内存占用:ArrayList的空间浪费主要体现在list列表结尾会预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素存储都需要比ArrayList消耗更多的空间(因为节点要放置前驱和后继)。

    3.System.arraycopy()方法和Arrays.copyOf()方法的区别

    通过查看源码我们可以知道,Arrays.copyOf()方法内部调用了System.arraycopy()方法。

    arraycopy()方法需要目标数组,将原数组拷贝到自定义的数组中或者是原数组,并且可以选择拷贝的起点以及放入新的数组中的位置。

    copyOf()时系统自动在内部新建一个数组,并返回该数组。

    拓展:

    ​ ArrayList实现了RandomAccess接口,只是作为一个标识,说明ArrayList支持快速随机访问功能。

    4.ensureCapacity()方法的作用

    ensureCapacity()方法并不是在ArrayList内部调用的,而是提供给用户来使用的,在向ArrayList里面添加大量元素之前最好先使用ensureCapacity方法,以减少增量重新分配的次数,提高效率。

    ArrayList扩容

    当使用无参构造方法直接创建ArrayList集合时,初始化的数组是一个空的数组,只有在add第一个元素时,数组的大小才会初始化为10,直到添加第11个元素时,ArrayList才会进行扩容操作。

    Set

    1.comparable 和 Comparator 的区别

    • comparable接口实际上是出自java.lang包中的一个CompareTo(Object obj)方法用来排序;
    • comparator实际上是出自java.util包中有一个compare(Object obj1,Object obj2)方法来排序。

    当我们需要对一个集合进行自定义排序后,我们就要重写CompareTo或者是compare方法。

    2.无序性和不可重复性的含义

    (1)无序性?无序性不等于随机性,无序性是指存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据数据的哈希值决定的。

    (2)不可重复性?不可重复性是指添加的元素按照equals判断时,返回false,需要同时重写equals方法和hashCode方法。

    3.比较HashSet、LinkedListHashSet、TreeSet的异同

    • HashSet、LinkedListHashSet、TreeSet三者都是Set集合的实现类,都能保证元素唯一,并且都不是线程安全的。
    • HashSet、LinkedListHashSet、TreeSet的主要区别在于底层数据结构不同。HashSet底层数据结构式HashMap(哈希表);LinkedListHashSet的底层数据结构是链表和哈希表。TreeSet的底层数据结构是红黑树,元素是有序的。
    • HashSet用于不需要保证元素插入和去除顺序的场景;LinkedListHashSet用于保证元素的插入和取出满足FIFO的场景;TreeSet用于支持元素自定义排序规则的场景。

    Queue

    1.Queue与Deque的区别

    Queue是单端队列,只能从一端插入元素,另一端删除元素,遵循FIFO的规则。

    Queue根据容量问题而导致操作失败后的处理方式不同。一种抛出异常,一种返回null。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zzn588QN-1642240006941)(F:\笔记\深入java基础\面试题截图\Queue接口.png)]

    Deque是双端队列,在队列的两端均可以插入或者删除元素。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RQh5h1Ya-1642240006942)(F:\笔记\深入java基础\面试题截图\Deque方法.png)]

    实际上,Deque还提供了其他的方法,可以当作栈来使用。

    2.ArrayDeque和LinkedList的区别

    ArrayDeque和LinkedList都实现了Deque接口,两者都可以当作队列来使用。

    • ArrayDeque是基于可变容量的数组和双指针来实现的,而LinkedList是通过链表来实现的
    • ArrayDeque不支持Null数据,而LinkedLisr可以使用Null数据
    • ArrayDeque是在jdk1.6引入的,而LinkedList早在jdk1.2都已存在
    • ArrayDeque插入时可能存在扩容过程,不过插入的操作时间复杂度仍为O(1),虽然LinkedList不需要扩容,但是每次插入数据时都需要重新申请空间,性能相比更差一点

    从性能上来说,ArrayDeque来实现队列要比LinkedList要好一点,另外,ArrayDeque也可以直接用作栈。

    3.简单说一下PriorityQueue

    PriorityQueue是在jdk1.5被引入的,与Queue得区别在于元素出队顺序是与优先级相关得,即总是优先级高的元素出队列。

    • PriorityQueue利用了二叉堆的数据结构来实现,底层使用可变长的数组来存储数剧
    • PriorityQueue通过堆元素的上浮和下沉,实现了在(logn)的时间复杂度内插入元素和删除堆顶元素
    • PriorityQueue是非线程安全的,而且不支持存储NULL对象
    • PriorityQueue默认是小顶堆,但是可以接收一个comparator作为构造参数,可以自定义元素优先级的先后

    Map

    1.HashMap和Hashtable的区别

    • 线程是否安全:HashMap是非线程安全的,而Hashtable是线程安全的。Hashtable内部的方法基本都经过synchronized修饰。
    • 效率:因为线程安全的问题,HashMap要比Hashtable效率高,而且Hashtable已经快要淘汰了。
    • 初始容量和每次扩充容量的大小:①创建时如果不指定初始容量,Hashtable默认初始容量为11,每次扩充之后,边缘原来的 2n+1 ;而HashMap默认初始化大小为16,每次扩容会变为原来的2倍。②如果给定容量大小,Hashtable就会使用给定容量大小,而HashMap就会将其扩充为大于原来数值的最小的2的n次幂的大小。
    • 底层数据结构:JDK1.8之后HashMap在解决哈希冲突时,当链表长度大于8且数组长度大于64,链表就会转化为红黑树,若有一个条件不满足,那么会优先选择数组扩容。而Hashtable没有这样的机制。

    2.HashMap和HashSet的区别

    HashSet底层就是基于HashMap实现的。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C4FWRos7-1642240006943)(F:\笔记\深入java基础\面试题截图\HashMap和HashSet的区别.png)]

    3.HashMap和TreeMap的区别

    HashMap和TreeMap都继承于AbstractMap,但是TreeMap还实现了NavigableMap接口和SortedMap接口。

    • 实现Navigable接口让TreeMap对集合内元素有了搜索的功能;
    • 实现SortedMap接口让TreeMap有了对集合中的元素根据键排序的能力。

    相比来说,TreeMap多了对集合中元素根据键排序的功能和对集合元素进行搜索的能力。

    4.HashSet如何检查重复?

    当把对象加入到HashSet中时,HashSet会先计算对象的hashCode值来判断对象加入的下标位置,同时也会与其他的对象的hashCode进行比较,如果没有相同的,就直接插入数据;如果有相同的,就进一步使用equals来进行比较对象是否相同,如果相同,就不会加入成功。

    5.HashCode与equals的相关规定

    (1)如果两个对象相等,则hashCode也一定是相等的

    (2)两个对象相等,对两个进行equals也会返回true

    (3)两个对象有相同的hashCode,他们也不一定是相等的

    (4)hashCode和equals方法都必须被同时覆盖

    6.==和equals的区别

    对于基本类型来说,==比较的是值是否相等;

    对于引用类型来说,equals比较的是两个引用是否指向同一个对象地址

    对于引用类型(包括包装类型)来说,如果equals没有被重写,对比他们的地址是否相同,如果被重写,则比较的是地址里的内容是否相同。

    7.HashMap的长度为什么是2的n次方?

    为了能让HashMap存取高效,尽量减少哈希碰撞,尽量把数据均匀分配。

    8.HashMap多线程下操作导致死循环问题

    主要原因是并发下的Rehash会造成元素之间形成一个循环链表。多线程下HashMap会存在数据丢失的问题,并发环境下推荐使用Concurrent Hash Map、

    9.ConcurrentHashMap 和 Hashtable 的区别

    ConcurrentHashmap和Hashtable的区别主要体现在实现线程安全的方式上不同

    • 底层数据结构: jdk1.7的ConcurrentHashMap底层采用分段的数组+链表实现,jdk1.8采用的数据结构跟HashMap1.8的结构是一样的,数组+链表/红黑树。Hashtable和jdk1.8之前的HashMap的底层数据结构类似,都是采用数组+链表的形式, 数组是hashMap的主体,链表则是为了解决哈希冲突。
    • 实现线程安全的方法:①在1.7的时候,ConcurrentHashMap(分段锁)对整个桶数组进行了分割分段(Segment),到1.8直接使用数组+链表+红黑树的实现。

    HashMap

    1.put数据时key与已有数据的HashCode相等时会怎么样?

    会产生哈希碰撞。

    如果Hash码相同,则会通过equals方法进行比较key是否相同:

    ​ 如果key值相同,则使用新的value代替旧的value;

    ​ 如果key值不相同,则会在该节点的链表结构上新增一个节点(如果链表长度>=8并且数组节点数>=64 ,链表结构就会转化成红黑树)。

    2.什么时候会产生hash碰撞?如何解决哈希碰撞?

    只要通过hash函数计算所得到的两个元素的hash值相同就会产生hash碰撞。

    HashMap在jdk8之前采用链表解决哈希碰撞,jdk8之后采用链表+红黑树解决哈希碰撞。

    3.如果hashCode相同,那么如何存储key-value对?

    当hashCode值相同时,就会进一步使用equals方法进行比较key是否相同。

    如果key相同,那么新值覆盖旧值;

    如果key不相同,则将新的key-value添加到HashMap中。

    4.HashMap如何进行扩容?

    当通过put方法不断进行数据添加时,如果元素个数超过了当前阈值就会进行扩容,默认扩容大小是原来的2倍,扩容之后会将原来的数据复制到新的数组中。

    5.如果确定了要存储的元素个数n,设置多少的初始容量可以减少扩容导致的性能损失?

    应该设置初始容量为 n/0.75 + 1 取整即可减少resize导致的性能损失。

    Collections工具类

    常用方法:

    • 排序
    • 查找,替换
    • 同步控制(不推荐)

    排序操作

    void reverse(List list)//反转
    void shuffle(List list)//随机排序
    void sort(List list)//按自然排序的升序排序
    void sort(List list, Comparator c)//定制排序,由Comparator控制排序逻辑
    void swap(List list, int i , int j)//交换两个索引位置的元素
    void rotate(List list, int distance)//旋转。当distance为正数时,将list后distance个元素整体移到前面。当distance为负数时,将 list的前distance个元素整体移到后面
    

    查找,替换

    int binarySearch(List list, Object key)//对List进行二分查找,返回索引,注意List必须是有序的
    int max(Collection coll)//根据元素的自然顺序,返回最大的元素。 类比int min(Collection coll)
    int max(Collection coll, Comparator c)//根据定制排序,返回最大元素,排序规则由Comparatator类控制。类比int min(Collection coll, Comparator c)
    void fill(List list, Object obj)//用指定的元素代替指定list中的所有元素
    int frequency(Collection c, Object o)//统计元素出现次数
    int indexOfSubList(List list, List target)//统计target在list中第一次出现的索引,找不到则返回-1,类比int lastIndexOfSubList(List source, list target)
    boolean replaceAll(List list, Object oldVal, Object newVal)//用新元素替换旧元素
    

    集合注意事项

    集合判空

    集合判断是否为空,使用isEmpty()的方法,而不是size==0的方式

    因为isEmpty()方法的可读性好,而且时间复杂度为O(1)

    集合转化Map

    使用Java.util.stream.Collectors类的toMap()方法转化为map集合时,要注释当value为null时会抛出NPE异常。

    集合遍历

    不要在foreach里面进行元素的remove/add操作,remove请使用Iterator方式,如果并发操作,需要对Iterator对象加锁。

    fail-fast 机制 :多个线程对 fail-fast 集合进行修改的时候,可能会抛出ConcurrentModificationException

    集合去重

    可以利用Set元素唯一的特性,进行集合去重,避免使用List的contains进行遍历去重或者判断包含操作

    集合转数组

    使用集合转数组的方法,必须使用集合的toArray(T[] array),传入的类型完全一致,长度为0的空数组。

    toArray(T[] array) 方法的参数是一个泛型数组,如果 toArray 方法中没有传递任何参数的话返回的是 Object类 型数组。

    数组转集合

    使用工具类Arrays.asList()把数组转化成集合时,不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出UnsupportedOperationException异常。

    展开全文
  • Java集合常见面试题集锦

    千次阅读 多人点赞 2019-11-06 17:32:41
    集合Java中的一个非常重要的一个知识点,主要分为List、Set、Map、Queue三大数据结构。它们在Java中的结构关系如下: Collection接口是List、Set、Queue的父级接口。 Set接口有两个常用的实现类:HashSet和...

    1、介绍Collection框架的结构

    集合是Java中的一个非常重要的一个知识点,主要分为List、Set、Map、Queue三大数据结构。它们在Java中的结构关系如下:

    Collection接口是List、Set、Queue的父级接口。

    Set接口有两个常用的实现类:HashSet和TreeSet。List接口的常用接口有ArrayList和Vector接口。

    Map接口有两个常用的实现类:Hashtable和HashMap。

    2、Collection框架中实现比较要实现什么接口

    要实现比较有两种方式:第一种,实体类实现Comparable<T>接口,并实现 compareTo(T t) 方法,我们称为内部比较器。第二种,创建一个外部比较器,这个外部比较器要实现Comparator接口的 compare(T t1, T t2)。

    第一种,实现Comparable接口:

    www.wityx.com www.wityx.com
    package com.chanshuyi.comparable;
    
    import java.util.*;
    
    public class Student implements Comparable<Student> {
    
        private String name;
    
        private int age;
    
        public Student() {
        }
    
        public Student(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        @Override
        public int compareTo(Student o) {
            if ( getAge() > o.getAge()) {
                return 1;
            } else if ( getAge() < o.getAge()) {
                return -1;
            } else {
                return 0;
            }
        }
    
        //重写toString() 用于输出
        public String toString() {
            return "[" + name + "," + age + "]";
        }
    
        public static void main(String args[]){
            Student s1 = new Student("Tom", 12);
            Student s2 = new Student("Marry", 9);
            Student s3 = new Student("Json", 88);
    
            List<Student> studentList = new ArrayList<Student>();
            studentList.add(s1);
            studentList.add(s2);
            studentList.add(s3);
    
            Collections.sort(studentList);
            System.out.printf("Original  sort, list:%s\n", studentList);
        }
    }
    View Code

    第二种,实现Comparator接口:

    先定义一个Student类,无须实现任何接口。

    www.wityx.com www.wityx.com
    public class Student {
    
        private String name;
    
        private int age;
    
        public Student() {
        }
    
        public Student(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    View Code

    定义一个外部比较器类,实现Comparator接口:

    www.wityx.com www.wityx.com
    public class StudentComparator implements Comparator<Student>{
        @Override
        public int compare(Student o1, Student o2) {
            if (o1.getAge() > o2.getAge()) {
                return 1;
            }else if (o1.getAge() == o2.getAge()) {
                return 0;
            }else{
                return -1;
            }
        }
    
        public static void main(String args[]) {
            Student marry = new Student("marry", 12);
            Student tom = new Student("tom", 3);
            Student jackson = new Student("jackson", 88);
    
            StudentComparator comparator = new StudentComparator();
            System.out.println(comparator.compare(marry, tom)); //1
            System.out.println(comparator.compare(tom, jackson));  //-1
        }
    }
    View Code

    由此可见,如果你希望该实体类在放入集合的时候能按照你希望的方式排序(如果集合支持),那么你需要让实体类实现Comparable接口。如果你只是需要简单比较两个实体类的大小,最后返回一个结果,那么用Comparator接口实现一个外部比较器更合适。

    3、ArrayList和Vector的区别(是否有序、是否重复、数据结构、底层实现)

    ArrayList和Vector都实现了List接口,他们都是有序集合,并且存放的元素是允许重复的。它们的底层都是通过数组来实现的,因此列表这种数据结构检索数据速度快,但增删改速度慢。

    而ArrayList和Vector的区别主要在两个方面:

    第一,线程安全。Vector是线程安全的,而ArrayList是线程不安全的。因此在如果集合数据只有单线程访问,那么使用ArrayList可以提高效率。而如果有多线程访问你的集合数据,那么就必须要用Vector,因为要保证数据安全。

    第二,数据增长。ArrayList和Vector都有一个初始的容量大小,当存储进它们里面的元素超过了容量时,就需要增加它们的存储容量。ArrayList每次增长原来的0.5倍,而Vector增长原来的一倍。ArrayList和Vector都可以设置初始空间的大小,Vector还可以设置增长的空间大小,而ArrayList没有提供设置增长空间的方法。

    4、HashMap和Hashtable的区别

    HashMap和Hashtable都实现了Map接口,并且都是key-value的数据结构。它们的不同点主要在三个方面:

    第一,Hashtable是Java1.1的一个类,它基于陈旧的Dictionary类。而HashMap是Java1.2引进的Map接口的一个实现。

    第二,Hashtable是线程安全的,也就是说是线程同步的,而HashMap是线程不安全的。也就是说在单线程环境下应该用HashMap,这样效率更高。

    第三,HashMap允许将null值作为key或value,但Hashtable不允许(会抛出NullPointerException)。

    5、List 和 Map 区别?(数据结构,存储特点)

    这个要从两个方面来回答,一方面是List和Map的数据结构,另一方面是存储数据的特点。在数据结构方面,List存储的是单列数据的集合,而Map存储的是key、value类型的数据集合。在数据存储方面,List存储的数据是有序且可以重复的,而Map中存储的数据是无序且key值不能重复(value值可以重复)。

    6、List、Map、Set三个接口,存取元素时,各有什么特点?

    List与Set具有相似性,它们都是单列元素的集合,所以,它们有一个功共同的父接口,叫Collection。Set里面不允许有重复的元素,所谓重复,即不能有两个相等(注意,不是仅仅是相同)的对象 ,即假设Set集合中有了一个A对象,现在我要向Set集合再存入一个B对象,但B对象与A对象equals相等,则B对象存储不进去。所以,Set集合的add方法有一个boolean的返回值,当集合中没有某个元素,此时add方法可成功加入该元素时,则返回true,当集合含有与某个元素equals相等的元素时,此时add方法无法加入该元素,返回结果为false。Set取元素时,没法说取第几个,只能以Iterator接口取得所有的元素,再逐一遍历各个元素。

    List表示有先后顺序的集合, 注意,不是那种按年龄、按大小、按价格之类的排序。当我们多次调用add(Obj e)方法时,每次加入的对象就像火车站买票有排队顺序一样,按先来后到的顺序排序。有时候,也可以插队,即调用add(int index,Obj e)方法,就可以指定当前对象在集合中的存放位置。一个对象可以被反复存储进List中,每调用一次add方法,这个对象就被插入进集合中一次,其实,并不是把这个对象本身存储进了集合中,而是在集合中用一个索引变量指向这个对象,当这个对象被add多次时,即相当于集合中有多个索引指向了这个对象,如图x所示。List除了可以以Iterator接口取得所有的元素,再逐一遍历各个元素之外,还可以调用get(index i)来明确说明取第几个。

    Map与List和Set不同,它是双列的集合,其中有put方法,定义如下:put(obj key,obj value),每次存储时,要存储一对key/value,不能存储重复的key,这个重复的规则也是按equals比较相等。取则可以根据key获得相应的value,即get(Object key)返回值为key 所对应的value。另外,也可以获得所有的key的结合(map.keySet()),还可以获得所有的value的结合(map.values()),还可以获得key和value组合成的Map.Entry对象的集合(map.entrySet())。

    List 以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存key-value值,value可多值。

    展开全文
  • java集合常见面试题

    2019-03-05 09:16:37
    1、java集合 首先我们要知道集合有五个接口,一个数组 接口一:collection 第一,我们要知道collection的父类是iterable接口,也就是我们常说的的迭代器。 关于实现iterable接口的类 ,这里有两个说明: 1...

    最近参加了几次java开发面试,有好几个面试官都问了一些基础的问题。我总结了几点,也可以在项目中进行运用

    首先我们要知道集合我们常见有五个接口,一个数组

    接口一:collection

    第一,我们要知道collection的父类是iterable接口,也就是我们常说的的迭代器。

     关于实现iterable接口的类 ,这里有两个说明:
    	 	1、能够增强for循环,例如我们的forEach循环
    		2、必须要提供一个返回值为iterable的iterable()方法。
     3、常用方法:
    		 ①hashNext()  :是否存在下一项			
    		 ②next()  :获取下一项
    		 ③remove(Oject)  :移除
    

    接下就是collection本身的几个方法

     ①add(E):从集合中添加某项
     ②contains(Object):判读是否包含某项
     ③iterator() :集合遍历
     ④remove():移除(重点:关于此方法与其父类接口【iterable】中remove(Object)的区别: )
    

    最后总结:

    collection接口remove()方法与iterable接口remove()方法的区别?
    1、性能方法:
    	collection接口remove()方法采用链表结构,删除某项时有一个遍历集合过程,效率比较低
    	iterable接口remove()方法使用时会结合其next()方法找到下一项,然后直接删除,效率更高
    
    2、容错方面:
    	collection接口remove()方法使用后, 集合对象的个数发生改变,当使用iterator进行遍历时,集合的对象与iterator内部对象的个数不一致会出现异常
    	iterable接口的话,在进行iterator遍历时,原来集合对象个数与iterator内部对象个数一致,不会报错
    

    接口二:List接口

    对于List的话,其特点是:可重复,有顺序
    其子类有两个:

    ①ArrayList(数组结构):get/set速度快,用于查询
    ②LinkedList(链表结构):get/set速度慢,用于增删 
    

    那么对于List的话,要注意ArrayList于LinkedList之间的区别?

    接口三:set接口

    set接口的特点与List接口的特点相反:不重复,无顺序
    子类:

    ①HashSet:常用,速度快,顺序不明显,可有一个null值
    ②TreeSet:按照比较结果顺序保存对象 
    ③LinkedHashSet:按照插入顺序保存结果 
    

    在这里,我们要注意这三种集合的适用的场景

    接口四:queue接口

    说到queue(管道),我们要联想到message(通信)、Looper(循环)、handler(处理器)
    结合项目的话,我们在网上浏览网页的时候,会有两个线程:

    主线程:用于UI(页面数据展示)
    子线程:负责访问数据库
    在子线程访问数据库时:Looper(循环)会将message(通信)会依次添加到queue(管道),然后queue会将数据依次送到子线程中,
    由于有可能会发生子线程与主线程发生矛盾的情况,handler(处理器)作为两者的中介,子线程会将数据传给handler(处理器),
    再由handler(处理器)传到主线程上
    

    我们还可以将queue与队列以及堆栈进行对比:

     queue:同队列一样,数据存取遵循**先进先出**原则
     堆栈:先进后出
    

    接口五:Map接口

    其子类可与Set接口子类对比

    数组:Arrays

    说到Array数组,我们可以将它与它的复杂版本ArrayList进行对比
    1、Array与ArrayList的区别:

     ①储存的数据类型:
    		Array只能放一种数据类型
    		ArrayList可放多种数据类型,可通过泛型进行绑定数据类型,提高安全性
    ②长度:
    		Array不可变
    		ArrayList可变
    

    2、数组与集合之间的相互转换

     数组——>集合:Arrays.asList(数组)
     集合——>数组:list.toArray()
    

    总结

    我们总结一下:
    对于集合,面试官能提到的问题,无非就是以上集合的区别,当面试官问到这类问题的时候,我们可以结合我们的项目加以自己的理解讲给面试官听,一定要记住,不管面试官出什么样的题目,心态不要慌,因为对于程序编程的问题,每个人都有自己的理解,一定要相信自己的答案,但是不能太模棱两可,给面试官以错误的答案
    这里我们来补充一些面试官除了上面提及之外可能会提到的问题:
    1、List、Set、Map之间的区别:

    List:有序,可重复(首页展示页面经常使用,在Controller层转为json格式,再放到页面上)
    Set:无序,不可重复(在解决表格之间一对多和多对多的关系中经常使用)
    Map:键值对存储值,键唯一,值可重复(就好比我们的联系人,电话号码必须一致,但是联系人可以是重复的名字)
    

    2、HashMap与HashSet的区别:
    对于这个问题,我们可以从它们继承的父类进行对比

    3、HashMap的工作原理:

    关于HashMap的工作原理,不知道的话,我们可以很大方告诉面试官我们没有注意到HashMap的工作原理,
    我们只要知道在我们项目中是session的get/set行为就差不多了
    

    关于集合的部分常见面试问题,今天我们就分享到这里(*❦ω❦)

    展开全文
  • Java集合常见面试题(一)

    万次阅读 2018-08-11 20:25:08
    集合和数组的区别: 1:数组是固定长度的;集合可变长度的。 2:数组可以存储基本数据类型,也可以存储引用数据类型;集合只能存储引用数据类型。 3:数组存储的元素必须是同一个数据类型;集合存储的对象可以是...
  • Java集合框架常见面试题.pdf
  • 一、集合容器概述 1、什么是集合 集合框架:用于存储数据的容器。 集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。任何集合框架都包含三大块内容:对外的接口、接口的实现和对集合运算的算法。 ...
  • java集合框架
  • 最新Java面试题,常见面试题及答案汇总

    万次阅读 多人点赞 2019-07-12 08:56:55
    Java最新面试题面试题答案汇总
  • Java集合常见面试题

    2019-03-08 12:14:33
    其次你们也可以看我自己写的关于Java集合面试问题和解决方案。 1,collection是Java.util包下的接口类,它继承了Iterable接口,实现Iterable接口的类可以增强for循环,Iterable接口必须提供一个名为Iterator()的...
  • java集合面试题

    2021-03-10 06:34:09
    一、实例化数组后,能不能改变数组的长度? 不能,数组一旦实例化,他们的长度就是... 标签:黑树,面试题,java,HashMap,直接插入,链表,数组,集合,长度 来源: https://www.cnblogs.com/qingmuchuanqi48/p/13750558.html
  • 2020最新Java常见面试题及答案

    万次阅读 多人点赞 2019-10-26 15:53:35
    Java最新常见面试题 + 答案汇总 1、面试题模块汇总 面试题包括以下十九个模块:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、...
  • 大公司最喜欢问的Java集合面试题.docx 大公司的Java面试题集.doc 就业相关java 广州传智播客JavaEE工程师测试题.doc 广州传智播客JavaEE工程师测试题(带答案的).doc 应聘时最漂亮的回答.docx 当面试官问「你有...
  • 集合容器概述 什么是集合 集合就是一个放数据的容器,准确的说是放数据对象引用的容器 集合类存放的都是对象的引用,而不是对象的本身 集合类型主要有3种:set(集)、list(列表)和map(映射)。 ...
  • 2021刚开始,很多朋友问题...Java常见面试题及答案汇总,2021年最新版 全部答案,整理好了,直接下载吧 其实,博主还整理了,更多大厂面试题,直接下载吧 下载链接:高清172份,累计 7701 页大厂面试题 PDF 1、抽象工厂
  • 二、Java集合容器面试题 1、集合容器概述 2、Collection接口 3、Map接口 4、辅助工具类 三、Java异常面试题 1. Error 和 Exception 区别是什么? 2. 运行时异常和一般异常(受检异常)区别是什么? 3. JVM 是如何处理...
  • Java常见的 200+ 面试题:面试必备

    万次阅读 多人点赞 2019-07-10 17:41:50
    这份面试清单是从我 2015 年做了 TeamLeader 之后开始收集的,一方面是给公司招聘用,另一方面是想用它来挖掘在 Java 技术栈中,还有那些知识点是我不知道的,我想找到这些技术盲点,然后修复它,以此来提高自己的...
  • 【面试题】Java常见面试题集锦

    千次阅读 2020-02-03 08:50:23
    Java常见面试题集锦 面试题模块 这份面试题,包含的内容了十九了模块:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate...
  • Java常见基础面试题:常用的设计模式;抽象类和接口;方法重载和方法重写;封装,继承,多态;集合面试题
  • Java常见面试题.pdf

    2018-02-05 15:33:05
    Java 常见面试题 集合了一部分企业经常面试的题目与答案。共求职者阅读
  • Java开发常见面试题详解(并发,JVM)

    万次阅读 多人点赞 2021-03-12 01:34:57
    - - 01_本课程前提要求和说明 教学视频 一些大厂的面试题 蚂蚁花呗一面: Java容器有哪些?哪些是同步容器,哪些是并发容器? ArrayList和LinkedList的插入和访问的时间复杂度? java反射原理,注解原理? 新生代分为...
  • Java后端常见面试题总结

    千次阅读 多人点赞 2020-07-19 11:42:00
    * FileName: Java后端面试总结 * Author: Marlon * Email: gatesma@foxmail.com * Date: 2020/2/18 * Description: */ 文章目录面试总结(一)Java基础1. wait和sleep的区别2. synchronized底层原理 是可重入...
  • Java 集合基础高频面试题

    千次阅读 2019-11-28 01:02:22
    大家好,很高兴我们可以继续学习交流Java高频面试题。本小节是Java基础篇章的第四小节,主要介绍Java中的常用集合知识点,涉及到的内容包括Java中的三大集合的引出,以及HashMap,Hashtable和ConcurrentHashMap。 ...
  • 本套Java面试题,选取了企业面试最常问到的问题,可以做为Java工程师的面试宝典,也可以做为想要不断完善和扩充自己 java 技术的学习者。主要包含:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、...
  • Java面试题总结 - Java集合篇(附答案)

    千次阅读 多人点赞 2021-05-29 20:25:21
    第二章 Java集合 一、Java容器都有哪些? 1、Collection (1)set HashSet、TreeSet (2)list ArrayList、LinkedList、Vector 2、Map HashMap、HashTable、TreeMap 二、Collection 和 Collections 有什么...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 47,501
精华内容 19,000
关键字:

java集合常见面试题

java 订阅
友情链接: ConceptionBD.zip