• java--集合框架


    1.ArrayList和Vector的区别?

      1.vector 的所有方法都是同步(Synchronized)的,是线程安全的(thread-safe)的,而ArrayList是线程不安全的,线程安全是会影响性能,ArrayList 比vector的性能好

      2.当Vector或ArrayList元素超过初始大小时,vector会将容量翻倍,而arrayList会扩容50%,因此arrayList或节省空间。

    2.ArrayList,vector,LinkedList的存储性能和特征?

      1.ArrayListhe 和 Vector的底层数据结构都是数组实现,此元素数大约实际存储的数据以便增加和插入元素,他们都是按照索引下标来保存,每当要插入元素时涉及元素移动内存等操作,所以索引数据看而插入数据慢。

      2.Vector的所有方法都是同步的(Synchronized),是最安全的容器,但是性能比ArrayList慢。

      3.LinkedList是双向链表实现数据存储(将内存中的零散的空间通过前后引用关联起来,链式存储与数组连续存储相比,内存使用率更高),再插入数据的使用只需要关联数据的前后节点,所以插入数据比较快。

      4.Vector属于遗留容器(hashtable,Dictionary,BitSet、Stack,Properties)都不推荐使用,有雨arrayList和LinkedList都是线程不安全的,如果遇到多线程操作容器的时候,可以使用工具类collections.synchronizedList方法 转为线程安全的容器在使用(这是对装潢模式的应用,将已有对象传入另一个类的构造器中创建新的对象来增强实现)。

    3.快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?

      1.快速失败(fail-fast)

        再用迭代器遍历集合时,如果对集合中的数据进行修改(增加、删除、修改)则会报出Concurrent Modification Exception

        原理:迭代器在遍历时直接访问集合中的内容,并且在遍历的过程中使用一个modCount变量。集合再被遍历期间如果内容发生变化,就会改变modCount的值,每当迭代器使用hashNext()/next()遍历下一个元素之前,都会监测monCount变量是否为expectedmodCount值,是的话就返回遍历;否则抛出异常,终止遍历。

        注意:这里异常的抛出条件是检测到 modCount!=expectedmodCount 这个条件。如果集合发生变化时修改modCount值刚好又设置为了expectedmodCount值,则异常不会抛出。因此,不能依赖于这个异常是否抛出而进行并发操作的编程,这个异常只建议用于检测并发修改的bug。

            场景:java.util包下的集合类都是快速失败的,不能在多线程下发生并发修改(迭代过程中被修改)。

      2.安全失败(fail-safe)

        采用安全失败机制的集合容器,在遍历的时候不能直接访问集合上的内容,而是先复制原有的集合,在拷贝的集合进行操作。

        原理:由于迭代时是对原集合的拷贝进行遍历,所以在遍历过程中对原集合所作的修改并不能被迭代器检测到,所以不会触发Concurrent Modification Exception。

            缺点:基于拷贝内容的优点是避免了Concurrent Modification Exception,但同样地,迭代器并不能访问到修改后的内容,即:迭代器遍历的是开始遍历那一刻拿到的集合拷贝,在遍历期间原集合发生的修改迭代器是不知道的。

               场景:java.util.concurrent包下的容器都是安全失败,可以在多线程下并发使用,并发修改。

    4.HashMap的数据结构?

      数组+链表 在链表长度为8时自动转为红黑树

    5.HashMap的工作原理是什么?

      hashMap是基于hashing原理,我们使用put(key,value)存储到hashMap对象中,使用get(key)从hashmap中获取对象,我们调用put()方法时,先调用hashCode方法,返回的hashCode用于bucket位置来存储entry对象,当hashCode相同时,在调用equals()对比存入链表中。

    6.HashMap什么时候进行扩容?

      当HashMap中的元素个数超过数组大小loadFactor时,就会进行数组扩容,loadFactor的默认值为0.75,这是一个折中的取值。也就是说,默认情况下,数组大小为16,那么当HashMap中元素个数超过160.75=12的时候,就把数组的大小扩展为 2*16=32,即扩大一倍,然后重新计算每个元素在数组中的位置,而这是一个非常消耗性能的操作,所以如果我们已经预知HashMap中元素的个数,那么预设元素的个数能够有效的提高HashMap的性能

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

      list和set都是单列集合,共同父类接口collection。

      set集合里面 不允许有重复元素

        存元素:add方法有一个boolean的返回值,当集合中没有某个元素,此时add方法可成功加入该元素时,则返回true;当集合含有与某个元素equals相等的元素时,此时add方法无法加入该元素,返回结果为false。

        取元素:没法说取第几个,只能以Iterator接口取得所有的元素,再逐一遍历各个元素。

      List表示有先后顺序的集合,

        存元素:多次调用add(Object)方法时,每次加入的对象按先来后到的顺序排序,也可以插队,即调用add(int index,Object)方法,就可以指定当前对象在集合中的存放位置。

        取元素:方法1:Iterator接口取得所有,逐一遍历各个元素

                    方法2:调用get(index i)来明确说明取第几个。

      Map是双列的集合,存放用put方法:put(obj key,obj value),每次存储时,要存储一对key/value,不能存储重复的key,这个重复的规则也是按equals比较相等。

        取元素:用get(Object key)方法根据key获得相应的value。

                也可以获得所有的key的集合,还可以获得所有的value的集合,

                还可以获得key和value组合成的Map.Entry对象的集合。

    8.Set里的元素是不能重复的,name用什么方法区分重复与否?是用==好事equals()?有何区别?

      ==是比较的对象的地址 equals比较的内容

    9.两个对象值相同(x.equals(y)== true)但却有着不同的hashCode?

      如果equals相等,那么hashCode一定相等,hashCode相等有可能equlas不相等。

    10.heap和stack有什么区别?

      heap 堆 先进先出(fifo first-in-first-out)stack栈先进后出(filo first-in-last-out)

      java中的堆是一个运行时数据区,用来存放对象实例。栈 主要存储基本类型(bit、short、int、long、double、folat、char、boolean )和对象的引用

    11.java集合类框架的基本接口有什么区别?

      

    12.hashSet和treeSet有什么区别

      hashset的数据结构是hash表通过对比对象的hashCode和equlas来判断对象的唯一性

      treeset的是一个有序的set结合,是线程不安全的

        treeset判断元素的唯一性:根据比较方法的返回结果是否为0,如果为0则表示元素相同,不存;不是0则表示元素不相同,存储;

        treeSet对元素的排序:

          元素自身具备比较功能,即自然排序,需要实现Comparable接口,并覆盖其compareTo方法。

          元素自身不具备比较功能,则需要实现Comparator接口,并覆盖其compare方法。

    13.HashSet的底层实现原理

      HashMap

    14.linkedHashMap的实现原理

      linkedHashMap 也是基于hashMap实现的,不同的是他定义了一个entry header,这个header 不是放在table里,他是额外独立出来的。linkedHashMap 是继承了hashMap的entry before,after和header结合起来组成一个双向链表,来实现插入顺序和访问顺序。linkedHashMap定义了排序模式accessOrder,该属性为Boolean变量,对于访问顺序为true,对于插入顺序为false,一般不置顶排序的情况下,迭代器遍历默认是插入顺序。

    15.为什么集合类没有实现cloneable和Serializable接口

      克隆(cloning)或者序列化(serialization)的语义和含义是跟具体的实现相关的。因此应该由集合类的具体实现类来决定如何被克隆或者序列化

    16.什么是迭代器(iterator)

      迭代器就是专门取出集合元素的对象。但是该对象比较特殊,不能直接创建对象(通过new),该对象是以内部类的形式存在于每个集合类的内部。

    17.iterator 和 listIterator有什么区别?

      1.使用范围不同,Iterator可以应用于所有的集合,Set、List和Map和这些集合的子类型。而ListIterator只能用于List及其子类型。

      2.ListIterator有add方法,可以向List中添加对象,而Iterator不能。

      3.ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator不可以。
      4.ListIterator可以定位当前索引的位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。
      5.都可实现删除操作,但是ListIterator可以实现对象的修改,set()方法可以实现。Iterator仅能遍历,不能修改

    18.数组(Array)和列表(arrayList)有什么区别,什么时候应该使用array而不是arrayList?

    存储内容比较:

    • Array数组可以包含基本类型和对象类型,
    • ArrayList却只能包含对象类型。

    但是需要注意的是:Array数组在存放的时候一定是同种类型的元素。ArrayList就不一定了,因为ArrayList可以存储Object。

    空间大小比较:

    • 它的空间大小是固定的,空间不够时也不能再次申请,所以需要事前确定合适的空间大小。
    • ArrayList的空间是动态增长的,如果空间不够,它会创建一个空间比原空间大约0.5倍的新数组,然后将所有元素复制到新数组中,接着抛弃旧数组。而且,每次添加新的元素的时候都会检查内部数组的空间是否足够。(比较麻烦的地方)。

    19.Java集合类框架的最佳实践有哪些?

      1.根据应用需要正确选择要使用的集合类型对性能非常重要,比如:假如知道元素的大小是固定的,那么选用Array类型而不是ArrayList类型更为合适。

      2.有些集合类型允许指定初始容量。因此,如果我们能估计出存储的元素的数目,我们可以指定初始容量来避免重新计算hash值或者扩容等。

      3.为了类型安全、可读性和健壮性等原因总是要使用泛型。同时,使用泛型还可以避免运行时的ClassCastException。

      4.使用JDK提供的不变类(immutable class)作为Map的键可以避免为我们自己的类实现hashCode()和equals()方法。

      5.编程的时候接口优于实现

      6.底层的集合实际上是空的情况下,返回为长度是0的集合或数组而不是null。

    20.comparable和comparator接口是干什么的,他们的区别?

      

    Comparable: 内部比较器,一个类如果想要使用 Collections.sort(list) 方法进行排序,则需要实现该接口

    Comparator: 外部比较器用于对那些没有实现Comparable接口或者对已经实现的Comparable中的排序规则不满意进行排序.无需改变类的结构,更加灵活。(策略模式)

    21.collection 和collections的区别?

       1.collection是java集合的接口

      2.collections是对集合操作的工具类

        1) 排序(Sort)

        2) 混排(Shuffling)
          混排算法所做的正好与 sort 相反: 它打乱在一个 List 中可能有的任何排列的踪迹。  

        

  • 相关阅读:
    tmux commands
    智能指针类HasPtr
    关于Vector中存放指针的问题
    面向对象的理解
    关系模型 超键 候选键 主键
    数据库的三个范式
    static struct QMetaObject const QwtPlot::staticMetaObjec
    static作用(修饰函数、局部变量、全局变量)
    C++全局变量之extern和static
    QTabWidget 使用小记
  • 原文地址:https://www.cnblogs.com/panda777/p/11197009.html
Copyright © 2020-2023  润新知