A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© kongling 中级黑马   /  2013-12-8 23:17  /  1404 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

list的实现类有ArrayList和LinkedList,有什么特点,用在什么场合更合适?
Set的实现类HashSet和TreeSet有什么特点,用在什么场合更合适?

5 个回复

倒序浏览
本帖最后由 依然 于 2013-12-8 23:29 编辑

ArrayList和HashList是有序集合,可以存放重复元素。
    ArrayList底层数据结构是数组结构。适合频繁的查询操作。
    HashList底层使用链表数据结构,适合数据非常多的、频繁的增删的操作。
Set特点:元素无序,不可重复,没有索引,
    HashSet:底层数据结构是哈希表。

    TreeSet:底层数据结构是二叉树,可以对Set集合中的元素进行排序。

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报 1 0
ArrayList其实是包装了一个数组 Object[],当实例化一个ArrayList时,一个数组也被实例化,当ArrayList中添加对象时,数组的大小也相应的改变。这样就带来以下3个缺点:
1,快速随即访问 你可以随即访问每个元素而不用考虑性能问题,通过调用get(i)方法来访问下标为i的数组元素。
2,向其中添加对象速度慢 当你创建数组是并不能确定其容量,所以当改变这个数组时就必须在内存中做很多事情。
3.操作其中对象的速度慢 当你要想数组中任意两个元素中间添加对象时,数组需要移动所有后面的对象。

LinkedList是通过节点直接彼此连接来实现的。每一个节点都包含前一个节点的引用,后一个节点的引用和节点存储的值。当一个新节点插入时,只需要修改其中保持先后关系的节点的引用即可,当删除记录时也一样。这样就带来以下有缺点:
1,操作其中对象的速度快 只需要改变连接,新的节点可以在内存中的任何地方;
2,不能随即访问 虽然存在get()方法,但是这个方法是通过遍历接点来定位的,所以速度慢。
这样子避免各自的缺点,选择相应合适的方法既可以解决问题啦!
至于Set的实现类HashSet和TreeSet 的特点与合适场合讲解,毕老师视频课程那确实是经典!!

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报

ArrayList:支持可随需要而增长的动态数组。
在java中,标准数组是定长的,在数组创建后,它们不能被加长或缩短,这也就意味着开发者必须事先知道数组可以容纳多少元素,但是在一般情况下,只有在运行时才能知道需要多大的数组,为了解决这个问题,类集框架定义了ArrayList类。所以当需要动态地增加或减小其大小时,用ArrayList创建数组。


LinkList:类提供了一个链接列表的数据结构。它定义了一些有用的方法,这些方法主要用于操作和访问列表。


HashSet:它创建一个类集,该类集使用散列表进行存储,而散列表则通过使用称之为散列法的机制来存储信息。散列集合并不能确定其元素的排列顺序,因为散列法的处理通常不让自己参与创建排序集合。

TreeSet:为使用树来进行存储的Set接口提供了一个工具,对象按升序存储,访问和检索是很快的,在存储了大量的需要进行快速检索的排序信息的情况下,TreeSet是一个很好的选择。

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
ArrayList底层是object数组,所以ArrayList具有数组的查询速度快的优点以及增删速度慢的缺点。

而在LinkedList的底层是一种双向循环链表。在此链表上每一个数据节点都由三部分组成:前指针 指向前面的节点的位置 ,数据,后指针 指向后面的节点的位置 。最后一个节点的后指针指向第一个节点的前指针,形成一个循环。

双向循环链表的查询效率低但是增删效率高。所以LinkedList具有查询效率低但增删效率高的特点。

ArrayList和LinkedList在用法上没有区别,但是在功能上还是有区别的。

LinkedList经常用在增删操作较多而查询操作很少的情况下:队列和堆栈。

队列:先进先出的数据结构。

堆栈:后进先出的数据结构。

评分

参与人数 1技术分 +1 收起 理由
贺奕凯 + 1

查看全部评分

回复 使用道具 举报
list集合set集合的区别:
List:元素是有序的,元素可以重复。因为该集合体系有索引。
List集合体系:ArrayList:底层的数据结构使用的数组结构;优点:查询很快,缺点:增删慢;是线程不同步的
                                LinkedList:底层的数据结构使用的是链表结构;优点:增删速度快;缺点:查询速度慢
LinkedListJDK1.6新特性:为了解决如果集合中没有要取出和删除的元素报的NoSuchElementException的异常所以出现了这些新特性,这些新提供的方法如果没有元素则会返回null
        添加:offerFirst(),offerLast()
        取出:peekFirst(),peekLast()
        删除:pollFirst(),pollLast()
                                Vector:底层的数据结构使用的是数组结构,是线程同步的,Vector已经被ArrayList所取代了
Set:元素是无序的,元素不可以重复以便保证唯一性。
        Set接口中的方法和Collection的方法一致
        Set集合体系:HashSet:底层的数据结构是哈希表,是不同步的
        哈希表确定内容是否相同原理:1,判断的是两个元素的哈希值是否相同,如果相同,再判断两个对象的内容是否相同;2,判断哈希值相同其实用的就是用hashCode()方法,判断内容相同,用的是equals方法。3,如果哈希值不同,则不用判断equals方法
                                 LinkedHashSet:和HashSet是相同的用法,区别在于LinkedHashSet是有序的

注意:如果元素要存到HashSet中去,必须覆盖hashcode和equals方法。一般情况下,如果用户自定义的类会产生很大对象,通常都要覆盖equals和hashcode方法。建立判断对象是否相同的依据。

                                 TreeSet:底层使用的二叉树;使用元素的自然排序对元素进行排序,是不同步的;而且只能储存相同类型的对象类型
判断元素唯一性的方式:就是根据比较方法返回结果是否为0,是0就相同,不是就不相同,表示不存在。
排序方式一:
TreeSet对元素的排序方法通常都是实现Comparable接口,覆盖compareTo方法
排序方式二:
如果不要按照元素本身具备的自然排序方式,或者元素本身不具备自然排序怎么解决:这时候可以让集合自身具备比较功能,传入比较器               

评分

参与人数 1技术分 +1 收起 理由
贺奕凯 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马