zoukankan      html  css  js  c++  java
  • 集合面试题

    1.请讲下Java里面的容器 

     分两大类,Map和Collection。而Collection又有子接口List(数据存储顺序和插入顺序是一样的)、Set(里面的元素具有唯一性) 

     Map是存储键值对的,里面的健不可以重复,但值可以重复
    a. 对于List主要有ArrayList和LinkedList两种实现。实现的数据结构不同,所以主要的区别也都是和数据结构相关的。 ArrayList基于数组,随机访问快,而对于中间元素的插入删除效率比较低,而且需要考虑扩容问题。LinkedList,则 基于链表,和ArrayList提到的正相反,随机访问慢,但对于中间元素的插入和删除更有效率。
    Set也是一种Collection,和List比起来主要体现在元素唯一性。

    2.请说下Iterator的作用

     迭代器可以实现Collection接口的方法,可以一个一个地获取集合中的元素
    在遍历集合时 可判断是否有下一个元素

    3.说下ArrayList和LinkedList的区别和联系,并说明什么情况下用它们

     区别:ArrayList用于对象的随机访问速度快,没有顺序
    LinkedList实现机制是链表式的,和顺序有关,速度比ArrayList慢
    联系:ArrayList和LinkedList都是List接口的实现类
    当要快速获取一个值时,用ArrayList,用于顺序插入操作时,用LinkedList.

    4.说下List,Set,Map三种集合各有什么特征

     List集合中的元素可以重复,
    Set集合中的元素不可以重复
    Map集合用键-值映射存放对象,Map容器中的键对象不能重复,值对象可以重复

    5.HashSet和TreeSet有什么区别,什么时候用它们

     区别:HashSet中的元素不能重复,没有顺序
    TreeSet中的元素不能重复,但有顺序
    当集合中的元素需要排序时,用TreeSet
    一般情况下用HashSet,因为不需要排序,速度比TreeSet快

    6.什么是泛型,怎么使用的,有什么好处?

    答案

     定义一个集合时,可以知道里面定义的是什么类型
    使用:在集合类型后面加< 数据类型 >
    使用泛型后,从集合中取得元素后就不用再用强转 

    7.什么是for each循环,它可以循环那些数据类型

    答案

     也可以叫增强型循环通过对象拿到集合里的值,因为扩展性比较强,建议多使用
    可以用来循环集合和数组

    8.写一个for each循环看看

    for(Object object : list){
    System.out.println(object);
    }

    9. 什么是强转怎么写的,有什么优缺点,一般要多用还是少用,为什么

     一般在继承的基础上用.一般是范围小的转换成范围大的,譬如byte可以转换成int,还可以子类转换成父类,反之则不行。

    Person person=new Student();

    Student student=(Student)person;

    把运行期的强转为编译期的.

    编译期不会出错.运行期容易出错.所以一般少用

    10.HashMap和Hashtable有什么区别,一 般情况下常用那个?

     HashMap的键-值都可以为空(null)
    Hashtable的键-值都不可以为空(null),线程安全 ,
    一般情况下用HashMap

     11.Hashtable名字为什么没有驼峰命名

     Hashtable的由来比较古老,当时还没有命名规范

    12.Collections和Collection有什么区别

    Collections是一个工具类,可以直接调用List和Set的方法
    Collection是一个接口,是List和Set集合的父接口

    13.写出Collections的6个方法,并详细解释

     sort():对集合进行排序
    shuffle():打乱集合中的元素顺序
    addAll():将一个集合添加到另一个集合中
    max():判断集合中的最大值
    min():判断集合中的最小值
    copy():将一个集合中的元素复制到另一个集合中去
    fill():将一个集合中的元素全部替换成指定的元素

    14.Arrays类是做什么的,写出它的常用6个方法

     Arrays是数组的一个工具类
    sort():对数组进行排序
    binarySearch():搜索数组指定元素的下标
    copyOf():复制数组中指定长度的元素
    deepEquals():比较两个数组的深度
    fill():把数组中的所有元素替换成指定元素
    equals():比较指定两个数组的元素是否相等

    15.比较下集合和数组的优缺点

     集合是多个对象的容器,可以将不同数据类型的多个对象组织在一起
    数组类型是有相同数据类型的数据集合,数组是很多语言都支持的底层数据结构,性能上是最高的

    16.如何对一个对象排序,有几种方法

     把对象放入List集合中,用Collections工具类调用sort()方法进行排序,但是这个类必须实现Compable接口才行
    把对象放在Set集合中,用TreeSet()实现类对集合直接排序

    17.在集合里面怎么判断两个对象相等,要实现什么方法

     equals方法

    18.怎么样把集合转化成数组,或把数组转化为集合

    把集合转为数组,可以用toArray()方法 
    把数组转为集合时, for each循坏,先把数组中的元素转为String型,再放到集合里

    19.分别写出List,Set,Map里面的5个常用方法

     List:add()新增 clear()清除 contains()判断是否包含某个元素 
    indexOf()一个元素在集合中首次出现的位置
    set()把指定下标的元素替换成自定义元素
    Set:add()新增 clear()清除 contains()判断是否包含某个元素
    remove():把集合中指定下标的元素删掉
    size():返回集合长度
    Map: containsKey()是否包含指定key containsValue()是否包含指定value keySet()返回所有key put()添加元素 Remove()移除

    20.HashMap与LinkedHashMap,和TreeMap的区别。

    共同点:HashMap,LinkedHashMap,TreeMap都属于Map的实现类.
    不同点: 1.HashMap里面存入的键值对在取出的时候是随机的,
    2.TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。
    3. LinkedHashMap 是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现.

    21.HashMap怎么实现有序
      可以转化放入TreeMap里面。 

    22.在List里面怎么去掉重复的数?

    通过把List里面的数据放入HashSet可以去除重复

    23.在List里面有几种排序?

    答:两种:实现Comparable<Article>接口,实现里面的CompareTo方法进行排序。还有调用Collections.sort()方法排序!

    24.说一下链表跟数组的区别

    链表:用一组任意储存单元存放线性表的数据元素,并且通过指针链相接结点的序列称为链表。是一种常见的数据组织形式,它采用了动态分配内存的形式实现。需要时可以用new分配内存空间,不需要时用delete将已分配的空间释放,不会造成内存空间的浪费。不靠数组实现,没有下标。
    数组必须事先定义固定的长度,不能适应数据动态增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成数据浪费。在使用的时候还要数组初始化,注意数组的下标越界。

    25.HashSet的理解

    HashSet实现了Set接口,HashSet不保证集合的迭代顺序,允许使用Null元素。HashSet的底层使用了HashMap,使用HashMap实列进行对集合的元素进行操作,然后再封装成HashSet的操作。

    26.什么类可以实现有序存储(除ArrayList以外)?
    一种按照插入的顺序排序,譬如LinkedList,LiskedHashMap,另外一种是插入后重新排序TreeSet,TreeMap 

    27.HashMap和ArrayList是不是都是线程不安全的? 

    ArrayList是线程不安全的;HashMap是线程不安全的;还有我们常见的一些JAVA集合都是线程不安全,这样做是为了提高性能

    在JDK5以后提供了线程安全的并发包java.util.concurrent并发包,譬如里面的类CopyOnWriteArrayList,CopyOnWriteArraySet,ConcurrentHashMap等

    28.ArrayList集合加入1万条数据,应该怎么提高效率

    因为ArrayList的底层是数组实现,并且数组的默认值是10,如果插入10000条要不断的扩容,耗费时间,所以我们调用ArrayList的指定容量的构造器方法ArrayList(int size) 就可以实现不扩容,就提高了性能

    29.你知道HashMap底层是怎么实现的吗?

      简单的说是一个数组,因为数组的性能比较好,数组里面放的是Entry类,HashMap类有一个叫做Entry的内部类。这个Entry类包含了key-value作为实例变量。当存储或者获取对象的时候,就根据哈希算法,对象的hashCode调用得到这个下标,以便实现快速访问.

    30.怎样遍历List Set,Map

     List 和Set可以通过一般for循环,迭代器循环,或者增强型循环来遍历, 其中一般for循环性能最快,迭代器循环可以判断和得到下一个值,for each增强型循环扩展性强,但性能稍低.

    Map循环可以通过keySet得到Key的Set集合,然后遍历这个集合就可以得到所有的Value

    31.Set为什么是不允许重复的。

    set的实现机制不允许重复的

    32.ArrayList为什么要用for循环,为什么要用迭代器,又有什么好处。

    for循环通过对象拿到集合里的值
    迭代器可以实现Collection接口的方法,可以一个一个地获取集合中的元素
    在遍历集合时 可判断是否有下一个元素

    33.你对栈与队列了解多少你是怎么用的。

    答:队列是一种数据结构,FIFO 先进先出有点类似与栈,只是在队列中第一个插入的数据项也会被最先删除,
    队列的两个基本操作:
    一个是插入一个数据项,即把一个数据项放入队尾
    另一个是移除一个数据项,即移除队头的数据项.

    34.如果我要存取很多的数据,但是又不需要重复的,要选择什么容器,说一下为什么使用它,它是哪个的子类?

    答:Set容器,它是不允许重复的,它是collection的子类

    35.哪种方法可以得到Map的Key?

    keySet()方法

     

  • 相关阅读:
    BZOJ 3754 Tree之最小方差树
    【CSS】318- CSS实现宽高等比自适应容器
    【Vuejs】317- 提升90%加载速度——Vuecli下的首屏性能优化
    【H5】316- 移动端H5跳坑指南
    【每周小回顾】2- 一起回顾上周精彩内容
    【Webpack】315- 手把手教你搭建基于 webpack4 的 vue2 多页应用
    【Web技术】314- 前端组件设计原则
    【JS】313- 复习 回流和重绘
    【JS】312- 复习 JavaScript 严格模式(Strict Mode)
    【Canvas】311- 解决 canvas 在高清屏中绘制模糊的问题
  • 原文地址:https://www.cnblogs.com/t0404/p/10291034.html
Copyright © 2011-2022 走看看