java集合

1.java集合类框架的基本接口有哪些?Collection和Collections的区别?

Collection:单列集合

Set:无序唯一

List:有序可重复

Map:可以把键key映射到值value的对象,键不能重复.(双列集合)

java.util.Collection是一个集合接口,提供了对集合对象基本操作的通用接口方法,Collection接口在java类库中有很多具体的实现,list,ArrayList,linkedList等。

java.util.Collections是一个包装类,它包含了各种有关集合操作的静态多态方法,此类不能够实例化,就像一个工具类服务于java的Collection集合框架。


2.为什么集合类没有实现Cloneable和Serialiable接口

集合类接口指定了一组叫做元素的对象。集合类接口的每一种具体的实现类都可以选择以它自己的方式对元素进行保存和排序,有的集合类允许重复的键,有些不允许。

3.什么是迭代器(iterator)

Iterator接口提供了很对对集合元素进行迭代的方法,每一个集合类都包含了可以返回迭代器实例的迭代方法,迭代器可以在迭代的过程中删除底层集合的元素,

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

4.Iterator和ListIterator的区别是什么?

Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。

Iterator对集合只能向前遍历,ListIterator既可以向前也可以向后。

ListIterator实现了Iterator接口,并包含其它的功能,比如:增加元素,替换元素,获取前一个或后一个元素的索引等。

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

Iterator的安全失败是基于对底层集合做拷贝,因此,它不受源集合上修改的影响。java.util包下的所有集合类都是快速失败的,而java.util.concurrent包下的所有的类都是安全失败的。快速失败的迭代器会抛出ConcurrentModificationException异常,而安全失败的迭代器永远不会抛出这样的异常。

6.HashMap的工作原理?

java中HashMap是以键值对(key-value)的形式存储元素的。HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/重集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value的值会被更新成新的值。HashMap的一些重要特性是它的容量(capacity),负载因子(load factor)和扩容极限(threshold resizing)

7.hashCode()和equal()方法的重要性体现在什么地方?

Java中HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,因此可能会被集合认为是相等的,而且这两个方法也用来发现重复元素。这两个方法对HashMap的精确性和正确性至关重要。

8.HashMap和Hashtable的区别

HashMap和Hashtable都实现了Map接口。

HashMap允许键和值是null,而Hashtable不允许键或值是null。

Hashtable是同步的,线程安全,更适合于多线程环境;而HashMaphashmap不是线程安全的,即不提供同步机制,使用于单线程。

HashMap提供了可供应用迭代的键的集合,因此HashMap是快速失败的,Hashtable提供了对键的列举(Enumeration)。

9.数组Array和列表ArrayList有什么区别?什么时候应该使用array?什么时候使用ArrayList

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

Array大小是固定的,ArrayList的大小是动态变化的。

ArrayList提供了更多的方法和特性:比如addAll(),removeAll(),iterator()等等。

对于基本类型的数据,集合使用自动装箱来减少编码的工作量。但是,当处理固定大小的基本数据的时候,这种方式相对比较慢。

10.ArryList和LinkedList有什么区别?

ArrayList和LinkedList都实现了List接口;不同点:ArrayList是基于索引的数据接口,底层是数组,查询块,增删慢,线程不安全,效率高;LinkedList底层数据结构是链表,每个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素;查询慢,增删快,线程不安全,效率高;)LinkedList
        A:有特有功能    
            a:添加
                addFirst()
                addLast()
            b:删除
                removeFirst()
                removeLast()
            c:获取
                getFirst()
                getLast()

ArrayList适用于查询,LinkedList适用于修改;

Vector
        A:有特有功能
            a:添加
                public void addElement(E obj)        --    add()
            b:获取
                public E elementAt(int index)        --    get()
                public Enumeration<E> elements()    --  iterator()

ArrayList,LinkedList是不同步的,而Vestor是同步的。所以如果不要求线程安全的话,可以使用ArrayList或LinkedList,可以节省为同步而耗费的开销。但在多线程的情况下,有时候就不得不使用Vector了。

11.Comparable和Comparator接口是干什么的?

java提供了一个compareTo()方法的Comparable接口;这个方法可以给对象排序,它返回负数,是根据比较的返回是否是0来决定;

java提供了compare()和equals()两个方法的Comparator接口,compare()用来给两个输入的参数排序,返回负数,0和正数表明第一个参数是小于,等于,大大于第二个参数。equals()需要一个对象作为参数,它用来决定输入参数是否和comparator相等,只有当输入的参数也是一个comparator并且输入参数和当前的comparator的排序结果是相的时候,这个方法才会返回true。

12.什么是java优先级队列(Priority Queue)?

PriorityQueue是一个基于优先级堆的无界队列,它的元素是按照自然排序(natural order)排序的建的时候,我们可以可以给它提供一个负责给元素排序的比较器。PriorityQueue不允许null值,因为null没有自然排序,PriorityQueue线程不安全,入队和出列的时间复杂度是O(log(n))。

13.你了解大O符号(big-Onotation)么?你能给出不同数据结构的例子?

大O符号描述了当数据结构里面元素增加的时候,算法的规模和性能在最坏的情况下有多么好。大O符号也可用来描述其他的行为,比如:内存消耗。因为集合类实际上是数据结构,我们一般使用大O符号基于时间,内存和性能来选择最好的实现。大O符号可以对大量数据的性能给出一个很好的说明。O表示算法的时间或者空间复杂度上界。比如数组的插入时间复杂度为O(N),空间复杂度为O(1),链表的插入时间复杂度为O(1),空间复杂度为O(1).

14.如何权衡使用有序数组还是无序数组?

  • 有序数组最大的好处:在于查找的时间复杂度是O(log n),而无序数组是O(n)。

  • 有序数组的缺点是:插入操作的时间复杂度是O(n),因为值大的元素需要往后移动来给新元素腾位置。相反,无序数组的插入时间复杂度是常量O(1)。

15.java集合类框架的最佳实践有哪些?

根据应用的需要合理的选择集合类型对性能非常重要。

    1)假如元素大小是固定的,而且能够事先知道,我们就该用Array而不是ArrayList。

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

    3)为了类型安全,可读性和健壮性的原因总是要使用泛型,同时使用泛型还可以避免运行时的ClassCastException(转换)异常。

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

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

   6)底层的集合实际情况是空的情况下,返回长度是0的集合或者是数组,不要返回null。

16.Enumeration接口和Iterator接口的区别有哪些?

Enumeration速度是iterator的2倍,同时占用更少的内存。但是iterator远远比Enumeration安全,因为其它线程不能够修改正在被iterator遍历的集合里面的对象。同时Iterator允许调用者删除底层集合里面的元素,Enumeration是不可能实现的。

17.HashSet和TreeSet有什么区别?

set集合的特点:无序唯一

HashSet底层数据结构是哈希表(是一个元素是链表的数组),它的元素是无序的,底层依赖两个方法hashCode()和equals(),执行排序:首先比较哈希值时候相同,相同:继续执行equals()方法,返回true,元素重复了,不添加;返回false:直接把元素添加到集合。如果哈希值不相同就直接把元素添加到结合。由hashCode()和equals()保证的元素的唯一性。add() remove() contains()方法的时间复杂度是O(1)。

TreeSet底层数据结构是红黑树(是一个自平衡的二叉树),它里面的元素是有序的,因此add() remove() contains()方法的时间复杂度是O(logn)。

保证元素的排序方式:
            a:自然排序(元素具备比较性)
                让元素所属的类实现Comparable接口
            b:比较器排序(集合具备比较性)
                让集合构造方法接收Comparator的实现类对象



18.Collection集合总结:

Collection(单列集合)
        |--List    有序,可重复
            |--ArrayList
                底层数据结构是数组,查询快,增删慢。
                线程不安全,效率高
            |--Vector
                底层数据结构是数组,查询快,增删慢。
                线程安全,效率低
            |--LinkedList
                底层数据结构是链表,查询慢,增删快。
                线程不安全,效率高
        |--Set    无序,唯一(指的存储顺序)
            |--HashSet
                底层数据结构是哈希表。
                如何保证元素唯一性的呢?
                    依赖两个方法:hashCode()和equals()
                    开发中自动生成这两个方法即可
                |--LinkedHashSet
                    底层数据结构是链表和哈希表
                    由链表保证元素有序
                    由哈希表保证元素唯一
            |--TreeSet
                底层数据结构是红黑树,是一种自平衡的二叉树。
                如何保证元素排序的呢?
                    自然排序(元素具备比较性)

                          让元素所属的类实现Comparable接口。

                    比较器排序

                          让集合接收一个Comparator的实现类对象

                如何保证元素唯一性的呢?
                    根据比较的返回值是否是0来决
Map(双列集合)

               Map的数据结构仅仅是针对键有效,与值无关。存储的是键值对形式的元素,键唯一,值可重复。

  HashMap

   底层数据结构是哈希表。线程不安全,效率高。
                如何保证元素唯一性的呢?
                    依赖两个方法:hashCode()和equals()
                    开发中自动生成这两个方法即可

    LinkedHashMap  

  底层数据结构是链表和哈希表
                    由链表保证元素有序
                    由哈希表保证元素唯一

Hashtable

底层数据结构是哈希表。线程安全,效率低。
                如何保证元素唯一性的呢?
                    依赖两个方法:hashCode()和equals()
                    开发中自动生成这两个方法即可

TreeMap

  底层数据结构是红黑树,是一种自平衡的二叉树。
                如何保证元素排序的呢?
                    自然排序(元素具备比较性)

                          让元素所属的类实现Comparable接口。

                    比较器排序

                          让集合接收一个Comparator的实现类对象

                如何保证元素唯一性的呢?
                    根据比较的返回值是否是0来决



19.针对Collection集合我们到底使用谁呢?

是否是键值对对象形式:

是:Map

       键是否需要排序?

是:TreeMap

否:HashMap

    唯一吗?
        是:Set
            排序吗?
                是:TreeSet
                否:HashSet
        如果你知道是Set,但是不知道是哪个Set,就用HashSet。
            
        否:List
            要安全吗?
                是:Vector
                否:ArrayList或者LinkedList
                    查询多:ArrayList
                    增删多:LinkedList
        如果你知道是List,但是不知道是哪个List,就用ArrayList。
    
    如果你知道是Collection集合,但是不知道使用谁,就用ArrayList。
    
    如果你知道用集合,就用ArrayList。

    20.在集合中常见的数据结构

ArrayXxx:底层数据结构是数组,查询快,增删慢
    LinkedXxx:底层数据结构是链表,查询慢,增删快
    HashXxx:底层数据结构是哈希表。依赖两个方法:hashCode()和equals()
    TreeXxx:底层数据结构是二叉树。两种方式排序:自然排序和比较器排序

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值