`
gaojingsong
  • 浏览: 1202416 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Java集合框架基础知识

阅读更多

1、Java集合框架的基础接口有哪些?

 

Collection为集合层级的根接口。一个集合代表一组对象,这些对象即为它的元素。Java平台不提供这个接口任何直接的实现。

 

Set是一个不能包含重复元素的集合。这个接口对数学集合抽象进行建模,被用来代表集合,就如一副牌。

 

List是一个有序集合,可以包含重复元素。你可以通过它的索引来访问任何元素。List更像长度动态变换的数组。

 

Map是一个将key映射到value的对象.一个Map不能包含重复的key:每个key最多只能映射一个value。

 

一些其它的接口有Queue、Dequeue、SortedSet、SortedMap和ListIterator。

 

 

 

 

 

2、HashMap和HashTable有何不同?

 

(1)HashMap允许key和value为null,而HashTable不允许。

 

(2)HashTable是同步的,而HashMap不是。所以HashMap适合单线程环境,HashTable适合多线程环境。

 

(3)在Java1.4中引入了LinkedHashMap,HashMap的一个子类,假如你想要遍历顺序,你很容易从HashMap转向LinkedHashMap,但是HashTable不是这样的,它的顺序是不可预知的。

 

(4)HashMap提供对key的Set进行遍历,因此它是fail-fast的,但HashTable提供对key的Enumeration进行遍历,它不支持fail-fast。

 

(5)HashTable被认为是个遗留的类,如果你寻求在迭代的时候修改Map,你应该使用CocurrentHashMap。

HashMap和Hashtable的区别

都属于Map接口的类,实现了将惟一键映射到特定的值上。   

一.历史原因:

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

二.同步性:

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

三.值:

 HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。 

 Hashtable 类似于 HashMap,但是不允许 null 键和 null 值。

四.效率:

Hashtable 比 HashMap 慢,因为它是同步的。

怎样使HashMap同步

HashMap可以通过Map m = Collections.synchronizedMap(hashMap)来达到同步的效果。

 

 

 

 

3、如何决定选用HashMap还是TreeMap?

 

对于在Map中插入、删除和定位元素这类操作,HashMap是最好的选择。然而,假如你需要对一个有序的key集合进行遍历,TreeMap是更好的选择。基于你的collection的大小,也许向HashMap中添加元素会更快,将map换为TreeMap进行有序key的遍历。

 

 

 

 

 

4、ArrayList和Vector有何异同点?

 

ArrayList和Vector在很多时候都很类似。

 

(1)两者都是基于索引的,内部由一个数组支持。

 

(2)两者维护插入的顺序,我们可以根据插入顺序来获取元素。

 

(3)ArrayList和Vector的迭代器实现都是fail-fast的。

 

(4)ArrayList和Vector两者允许null值,也可以使用索引值对元素进行随机访问。

 

以下是ArrayList和Vector的不同点。

 

(1)Vector是同步的,而ArrayList不是。然而,如果你寻求在迭代的时候对列表进行改变,你应该使用CopyOnWriteArrayList。

 

(2)ArrayList比Vector快,它因为有同步,不会过载。

 

(3)ArrayList更加通用,因为我们可以使用Collections工具类轻易地获取同步列表和只读列表。

 

ArrayList和Vector的区别

ArrayList与Vector主要从二方面来说.  

一.同步性:

   Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的。

二.操作:

    由于Vector支持多线程操作,所以在性能上就比不上ArrayList了。

三.数据增长:

  ArrayList和Vector都有一个初始的容量大小,当存储进去它们里面的元素个数超出容量的时候,就需要增加ArrayList和Vector的存储空间,每次增加存储空间的时候不是只增加一个存储单元,是增加多个存储单元。

  Vector默认增加原来的一倍,ArrayList默认增加原来的0.5倍。

  Vector可以由我们自己来设置增长的大小,ArrayList没有提供相关的方法。

 

 

 

5、LinkedList与ArrayList有什么区别

两者都实现的是List接口,不同之处在于:

(1)、ArrayList是基于动态数组实现的,LinkedList是基于链表的数据结构。

(2)、get访问List内部任意元素时,ArrayList的性能要比LinkedList性能好。LinkedList中的get方法是要按照顺序从列表的一端开始检查,直到另一端

(3)、对于新增和删除操作LinkedList要强于ArrayList,因为ArrayList要移动数据

附加:

   LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。

  注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:

List list = Collections.synchronizedList(new LinkedList(…));

 

 

 

 

 

 

6、Array和ArrayList有何区别?什么时候更适合用Array?

 

Array可以容纳基本类型和对象,而ArrayList只能容纳对象。

 

Array是指定大小的,而ArrayList大小是固定的。

 

Array没有提供ArrayList那么多功能,比如addAll、removeAll和iterator等。尽管ArrayList明显是更好的选择,但也有些时候Array比较好用。

 

(1)如果列表的大小已经指定,大部分情况下是存储和遍历它们。

 

(2)对于遍历基本数据类型,尽管Collections使用自动装箱来减轻编码任务,在指定大小的基本类型的列表上工作也会变得很慢。

 

(3)如果你要使用多维数组,使用[][]比List<List<>>更容易。

 

 

 

 

 

7、ArrayList和LinkedList有何区别?

 

ArrayList和LinkedList两者都实现了List接口,但是它们之间有些不同。

 

(1)ArrayList是由Array所支持的基于一个索引的数据结构,所以它提供对元素的随机访问,复杂度为O(1),但LinkedList存储一系列的节点数据,每个节点都与前一个和下一个节点相连接。所以,尽管有使用索引获取元素的方法,内部实现是从起始点开始遍历,遍历到索引的节点然后返回元素,时间复杂度为O(n),比ArrayList要慢。

 

(2)与ArrayList相比,在LinkedList中插入、添加和删除一个元素会更快,因为在一个元素被插入到中间的时候,不会涉及改变数组的大小,或更新索引。

 

(3)LinkedList比ArrayList消耗更多的内存,因为LinkedList中的每个节点存储了前后节点的引用。

 

 

 

 

 

 

8、哪些集合类提供对元素的随机访问?

 

ArrayList、HashMap、TreeMap和HashTable类提供对元素的随机访问。

 

 

 

 

9、EnumSet是什么?

 

java.util.EnumSet是使用枚举类型的集合实现。当集合创建时,枚举集合中的所有元素必须来自单个指定的枚举类型,可以是显示的或隐示的。EnumSet是不同步的,不允许值为null的元素。它也提供了一些有用的方法,比如copyOf(Collection c)、of(E first,E…rest)和complementOf(EnumSet s)。

 

 

 

10、哪些集合类是线程安全的?

 

Vector、HashTable、Properties和Stack是同步类,所以它们是线程安全的,可以在多线程环境下使用。Java1.5并发API包括一些集合类,允许迭代时修改,因为它们都工作在集合的克隆上,所以它们在多线程环境中是安全的。

 

 

 

 

 

11、并发集合类是什么?

 

Java1.5并发包(java.util.concurrent)包含线程安全集合类,允许在迭代时修改集合。迭代器被设计为fail-fast的,会抛出ConcurrentModificationException。一部分类为:CopyOnWriteArrayList、 ConcurrentHashMap、CopyOnWriteArraySet。

 

 

 

 

 

 

12、BlockingQueue是什么?

 

Java.util.concurrent.BlockingQueue是一个队列,在进行检索或移除一个元素的时候,它会等待队列变为非空;当在添加一个元素时,它会等待队列中的可用空间。BlockingQueue接口是Java集合框架的一部分,主要用于实现生产者-消费者模式。我们不需要担心等待生产者有可用的空间,或消费者有可用的对象,因为它都在BlockingQueue的实现类中被处理了。Java提供了集中BlockingQueue的实现,比如ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue,、SynchronousQueue等。

 

 

 

 

 

13、队列和栈是什么,列出它们的区别?

 

栈和队列两者都被用来预存储数据。java.util.Queue是一个接口,它的实现类在Java并发包中。队列允许先进先出(FIFO)检索元素,但并非总是这样。Deque接口允许从两端检索元素。

 

栈与队列很相似,但它允许对元素进行后进先出(LIFO)进行检索。

 

Stack是一个扩展自Vector的类,而Queue是一个接口。

 

 

 

 

 

 

 

14、Collections类是什么?

 

Java.util.Collections是一个工具类仅包含静态方法,它们操作或返回集合。它包含操作集合的多态算法,返回一个由指定集合支持的新集合和其它一些内容。这个类包含集合框架算法的方法,比如折半搜索、排序、混编和逆序等。

 

 

 

 

 

 

15、Comparable和Comparator接口是什么?

 

如果我们想使用Array或Collection的排序方法时,需要在自定义类里实现Java提供Comparable接口。Comparable接口有compareTo(T OBJ)方法,它被排序方法所使用。我们应该重写这个方法,如果“this”对象比传递的对象参数更小、相等或更大时,它返回一个负整数、0或正整数。但是,在大多数实际情况下,我们想根据不同参数进行排序。比如,作为一个CEO,我想对雇员基于薪资进行排序,一个HR想基于年龄对他们进行排序。这就是我们需要使用Comparator接口的情景,因为Comparable.compareTo(Object o)方法实现只能基于一个字段进行排序,我们不能根据对象排序的需要选择字段。Comparator接口的compare(Object o1, Object o2)方法的实现需要传递两个对象参数,若第一个参数比第二个小,返回负整数;若第一个等于第二个,返回0;若第一个比第二个大,返回正整数。

 

 

 

 

 

16、Comparable和Comparator接口有何区别?

 

Comparable和Comparator接口被用来对对象集合或者数组进行排序。Comparable接口被用来提供对象的自然排序,我们可以使用它来提供基于单个逻辑的排序。

 

Comparator接口被用来提供不同的排序算法,我们可以选择需要使用的Comparator来对给定的对象集合进行排序。

 

 

 

 

 

17、我们如何对一组对象进行排序?

 

如果我们需要对一个对象数组进行排序,我们可以使用Arrays.sort()方法。如果我们需要排序一个对象列表,我们可以使用Collection.sort()方法。两个类都有用于自然排序(使用Comparable)或基于标准的排序(使用Comparator)的重载方法sort()。Collections内部使用数组排序方法,所有它们两者都有相同的性能,只是Collections需要花时间将列表转换为数组。

 

 

 

 

 

 

 

18、当一个集合被作为参数传递给一个函数时,如何才可以确保函数不能修改它?

 

在作为参数传递之前,我们可以使用Collections.unmodifiableCollection(Collection c)方法创建一个只读集合,这将确保改变集合的任何操作都会抛出UnsupportedOperationException。

 

 

 

 

 

19、我们如何从给定集合那里创建一个synchronized的集合?

 

我们可以使用Collections.synchronizedCollection(Collection c)根据指定集合来获取一个synchronized(线程安全的)集合。

 

 

 

 

 

20、集合框架里实现的通用算法有哪些?

 

Java集合框架提供常用的算法实现,比如排序和搜索。Collections类包含这些方法实现。大部分算法是操作List的,但一部分对所有类型的集合都是可用的。部分算法有排序、搜索、混编、最大最小值。

 

 

 

 

21、Java集合框架相关的有哪些最好的实践?

 

(1)根据需要选择正确的集合类型。比如,如果指定了大小,我们会选用Array而非ArrayList。如果我们想根据插入顺序遍历一个Map,我们需要使用TreeMap。如果我们不想重复,我们应该使用Set。

 

(2)一些集合类允许指定初始容量,所以如果我们能够估计到存储元素的数量,我们可以使用它,就避免了重新哈希或大小调整。

 

(3)基于接口编程,而非基于实现编程,它允许我们后来轻易地改变实现。

 

(4)总是使用类型安全的泛型,避免在运行时出现ClassCastException。

 

(5)使用JDK提供的不可变类作为Map的key,可以避免自己实现hashCode()和equals()。

 

(6)尽可能使用Collections工具类,或者获取只读、同步或空的集合,而非编写自己的实现。它将会提供代码重用性,它有着更好的稳定性和可维护性。

 

 

 

 

22、在Java中,HashMap是如何工作的?

 

HashMap在Map.Entry静态内部类实现中存储key-value对。HashMap使用哈希算法,在put和get方法中,它使用hashCode()和equals()方法。当我们通过传递key-value对调用put方法的时候,HashMap使用Key hashCode()和哈希算法来找出存储key-value对的索引。Entry存储在LinkedList中,所以如果存在entry,它使用equals()方法来检查传递的key是否已经存在,如果存在,它会覆盖value,如果不存在,它会创建一个新的entry然后保存。当我们通过传递key调用get方法时,它再次使用hashCode()来找到数组中的索引,然后使用equals()方法找出正确的Entry,然后返回它的值。下面的图片解释了详细内容。

 

其它关于HashMap比较重要的问题是容量、负荷系数和阀值调整。HashMap默认的初始容量是32,负荷系数是0.75。阀值是为负荷系数乘以容量,无论何时我们尝试添加一个entry,如果map的大小比阀值大的时候,HashMap会对map的内容进行重新哈希,且使用更大的容量。容量总是2的幂,所以如果你知道你需要存储大量的key-value对,比如缓存从数据库里面拉取的数据,使用正确的容量和负荷系数对HashMap进行初始化是个不错的做法。

0
0
分享到:
评论

相关推荐

    Java集合框架学习笔记

    本篇将详细探讨Java集合框架的基础知识,包括核心接口、类的层级结构以及Java 5引入的泛型特性。 首先,让我们了解一下`java.lang.Class`。`Class`类在Java中扮演着特殊的角色,它不仅是一个普通类,而且是用于获取...

    Java集合框架常见面试题.pdf

    Java集合框架是Java编程语言中的核心部分,它提供了一组高效、灵活的数据结构,使得开发者可以方便地存储和管理各种类型的...无论是在面试中还是实际开发中,深入理解Java集合框架的知识都能帮助开发者更好地解决问题。

    java集合框架全面进阶

    本篇文章将深入探讨Java集合框架的各个方面,帮助开发者从基础到高级全面掌握这一关键知识。 首先,我们要理解Java集合框架的基础概念。集合是对象的容器,可以容纳多个对象,而框架则是一组接口和实现这些接口的类...

    数据结构和Java集合框架源代码

    《数据结构和Java集合框架》是清华大学出版社出版的一本经典教材,主要涵盖了计算机科学中的核心概念——数据结构以及Java编程语言中的集合框架。这本书通过深入浅出的方式,讲解了如何用Java实现各种常用的数据结构...

    Java_集合框架

    Java基础入门_集合部分_知识点汇总

    数据结构和Java集合框架

    总的来说,数据结构和Java集合框架是Java程序员必备的知识,它们构成了程序设计的基础,对于提升编程技能和解决实际问题有着重要的作用。通过阅读提供的"数据结构和Java集合框架.pdf"文档,你可以系统地学习和复习这...

    05陈柯姗.docx

    Java集合框架基础知识点总结 在本文中,我们将对Java集合框架的基础知识点进行总结,包括Set集合接口、List集合接口和Map集合接口的应用。 Set集合接口 Set集合接口是Java集合框架中的一个基本接口,它定义了一个...

    集合框架List、Map、Set接口及其子类综合对比

    Java基础知识汇总之集合框架List、Map、Set接口及其子类综合对比

    Java集合框架

    Java集合框架是Java编程语言中用于处理数据结构的基础框架,它为程序员提供了大量集合类,用于存储和操作对象集合。Java集合框架不仅提高了数据处理效率,还简化了数据结构的操作,使得Java程序在处理大量数据时能够...

    Java程序员集合框架面试题-java集合框架面试题.docx

    Java集合框架是Java编程语言中的核心部分,它提供了一组高效的数据结构和算法,使得开发者能够方便地管理和操作数据。面试中,对于Java程序员来说,集合框架是必考的知识点,因为它涉及到程序的基础架构和数据处理...

    数据结构和Java集合框架说课稿.doc

    《数据结构和Java集合框架》是一门针对软件技术(Java Web方向)专业的重要专业基础课,同时也是核心课程。这门课程旨在深入探讨非数值计算的程序设计问题,特别是关注数据、它们之间的关系(结构)以及处理数据的...

    Java-collection-frame.rar_Java集合框架

    总之,Java集合框架是Java程序员必备的知识,熟练掌握它可以极大地提高代码质量、可读性和运行效率。在实际开发中,根据需求选择合适的集合类型和操作方式,对于构建高效、可靠的软件系统至关重要。

    java 集合

    本文将深入探讨Java集合框架的基础知识,包括接口、类、以及它们在实际开发中的应用。 首先,Java集合框架由一系列接口和实现这些接口的类组成。主要的接口有`List`、`Set`和`Queue`,它们各自代表了不同特性的数据...

    java集合思维导图

    Java集合框架是Java编程语言中的一个核心部分,它为数据存储和管理提供了高效且灵活的解决方案。本思维导图及总结旨在深入理解并掌握Java集合的相关概念和使用方法。 首先,我们来了解一下Java集合框架的基本构成。...

    Java集合框架面试必备八股文

    这些知识点不仅涵盖了基础概念,还涉及到了高级特性和实际应用,对于初级开发工程师来说,理解和掌握这些内容将有助于在面试中脱颖而出,成功应对关于Java集合框架的问题。通过深入学习和实践,可以进一步提升编程...

    Java基础笔记之集合框架和泛型

    详细的介绍了集合框架的用法,及其语法规则,剖析了使用的使用注意事项,帮助更牢靠的掌握集合框架的知识及泛型内容。谢谢

    Java Web开发基础知识

    总的来说,Java Web开发基础知识包括理解Servlet、JSP、MVC模式、JSTL、JNDI、JTA、EJB、JDBC、ORM和Spring框架等关键概念和技术。学习这些知识将为开发者打下坚实的基础,以构建高效、可维护的Web应用程序。

Global site tag (gtag.js) - Google Analytics