JAVA 集合一些小知识

 

一 Java 集合类框架的基本接口有哪些

Collection:代表一组对象,每一个对象都是它的子元素。

Set:不包含重复元素的 Collection。无法拥有重复元素,内部排序

List:有顺序的 collection,并且可以包含重复元素。

Map:可以把键(key)映射到值(value)的对象,键不能重复,value可以多值

Collection

├List

│├LinkedList

│├ArrayList

│└Vector

│ └Stack

└Set

└Map

│├Hashtable

│├HashMap

│└WeakHashMap

 

二 ArrayList和Vector和linkedlist的区别,

ArrayList                                       Vector                                             linkedlist

线程序不安全,不同步                线程安全,同步的                      不同步,线程不安全

数组实现                                      数组实现                                    双向链表实现

拓展长度为原来的一半                拓展长度为原来一培

遍历快,插入慢                           遍历快,插入慢                           遍历慢,插入块

 

 拓展1: Array 和 ArrayList 的不同点:

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

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

③ArrayList 提供了更多的方法和特性,比如: addAll(), removeAll(), iterator()等等。对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。

 

拓展2:假如元素的大小是固定的,而且能事先知道,我们就应该用 Array 而不是 ArrayList 。

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

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

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

④编程的时候接口优于实现。底层的集合实际上是空的情况下,返回长度是 0 的集合或者是数组,不要返回 null。

 

拓展3:LinkedList在get任何一个位置的数据的时候,都会把前面的数据走一遍。

假如我有10个数据,那么将要查询1+2+3+4+5+5+4+3+2+1=30次数据,相比ArrayList,却只需要查询10次数据就行了,随着LinkedList的容量越大,差距会越拉越大。其实使用LinkedList到底要查询多少次数据,大家应该已经很明白了,来算一下:按照前一半算应该是(1 + 0.5N) * 0.5N / 2,后一半算上即乘以2,应该是(1 + 0.5N) * 0.5N = 0.25N2 + 0.5N,忽略低阶项和首项系数,得出结论,LinikedList遍历的时间复杂度为O(N2),N为LinkedList的容量。使用迭代器或者foreach循环(foreach循环的原理就是迭代器)去遍历LinkedList即可

 

 

三 HashMap和Hashtable的区别  concurrenthashmap

历史原因:Hashtable是基于陈旧的Dictionary类的, HashMap是Java 1.2引进的Map接口的一个实现

同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的

:只有HashMap可以让你将空值为key或value,hashtable不允许

内存:LinkedList 比 ArrayList 更占内存,因为 LinkedList 为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。

 

拓展1:HashSet 和 TreeSet 有什么区别?

①HashSet 是由一个 hash 表来实现的,因此,它的元素是无序的。

add() , remove(), contains():方法的时间复杂度是 O(1)。

② TreeSet 是由一个树形的结构来实现的,它里面的元素是有序的。

add(),remove(), contains()方法的时间复杂度是 O(logn)。

 

拓展2:Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别

答: Set里的元素是不能重复的,那么用iterator()方法来区分重复与否

equals()是判读两个Set是否相等

equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值

 

 

四 为什么集合类没有实现 Cloneable 和 Serializable 接口?

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

 

1.什么是迭代器(Iterator)?

Iterator 接口提供了很多对集合元素进行迭代的方法。每一个集合类都包含了可以返回迭代器实例的 迭代方法。迭代器可以在迭代的过程中删除底层集合的元素。克隆(cloning)或者是序列化(serialization)的语义和含义是跟具体的实现相关的。因此,应该由集合类的具体实现来决定如何被克隆或者是序列化

 

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

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

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

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

 

拓展1:Enumeration 接口和 Iterator 接口的区别有哪些?

①Enumeration 速度是 Iterator 的 2 倍,同时占用更少的内存。

②Iterator 远远比 Enumeration安全,因为其他线程不能够修改正在被 iterator 遍历的集合里面的对象。

③Iterator 允许调用者删除底层集合里面的元素,这对 Enumeration 来说是不可能的。

 

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

①Iterator 的安全失败是基于对底层集合做拷贝,因此,它不受源集合上修改的影响。

②java.util包下面的所有的集合类都是快速失败的,而 java.util.concurrent 包下面的所有的类都是安全失败的。

③快速失败的迭代器会抛出 ConcurrentModificationException 异常,而安全失败的迭代器永远不会抛出这样的异常。

 

 

 

六 Java 中的 HashMap 的工作原理是什么?

    ①Java 中的 HashMap 是以键值对(key-value)的形式存储元素的。HashMap 需要一个 hash 函数,它使用 hashCode()和 equals()方法来向集合/从集合添加和检索元素。

  ②当调用 put()方法的时候, HashMap 会计算 key 的 hash 值,然后把键值对存储在集合中合适的索引上。如果 key已经存在了,value 会被更新成新值。

  ③HashMap 的一些重要的特性是它的容量(capacity),负载因子(load factor)和扩容极限(threshold resizing)。

 

 

拓展1:hashCode()和 equals()方法的重要性体现在什么地方?

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

 

 

七 Comparable 和 Comparator 接口是干什么的?列出它们的区别。

    1.Java 提供了只包含一个 compareTo()方法的 Comparable 接口。这个方法可以个给两个对象排序。具体来说,它返回负数, 0,正数来表明输入对象小于,等于,大于已经存在的对象。

     2.Java 提供了包含 compare()和 equals()两个方法的 Comparator 接口。

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

 

 

八  什么是 Java 优先级队列(Priority Queue)?

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值