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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王虎 中级黑马   /  2012-10-11 09:49  /  1943 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

请赐教,最好举一反三

点评

把毕老师的java基础好好看看,别觉得基础不重要,越往后学,就越会觉得基础才是王道,加油。  发表于 2012-10-11 10:38

评分

参与人数 1黑马币 +10 收起 理由
刘芮铭 + 10 赞一个!

查看全部评分

8 个回复

正序浏览
Set具有与Collection完全一样的接口,因此没有任何额外的功能,不像前面有两个不同的List。实际上Set就是Collection,只是 行为不同。(这是继承与多态思想的典型应用:表现不同的行为。)Set不保存重复的元素
    Set : 存入Set的每个元素都必须是唯一的,因为Set不保存重复元素。加入Set的元素必须定义equals()方法以确保对象的唯一性。Set与Collection有完全一样的接口。Set接口不保证维护元素的次序。
    HashSet : 为快速查找设计的Set。存入HashSet的对象必须定义hashCode()。
    TreeSet : 保存次序的Set, 底层为树结构。使用它可以从Set中提取有序的序列。
    LinkedHashSet : 具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。
回复 使用道具 举报
Set具有与Collection完全一样的接口,因此没有任何额外的功能,不像前面有两个不同的List。实际上Set就是Collection,只是 行为不同。(这是继承与多态思想的典型应用:表现不同的行为。)Set不保存重复的元素
    Set : 存入Set的每个元素都必须是唯一的,因为Set不保存重复元素。加入Set的元素必须定义equals()方法以确保对象的唯一性。Set与Collection有完全一样的接口。Set接口不保证维护元素的次序。
    HashSet : 为快速查找设计的Set。存入HashSet的对象必须定义hashCode()。
    TreeSet : 保存次序的Set, 底层为树结构。使用它可以从Set中提取有序的序列。
    LinkedHashSet : 具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。
回复 使用道具 举报
Set 元素无序(存储顺序和取出顺序不一致),不可重复。
                |--HashSet
                        底层数据结构是哈希表。线程不安全。
                        如果保证元素的唯一性呢?
                        A:首先根据hashCode值判断。
                        B:如果hashCode值不同,那么,这就是不同的元素。直接存储。
                          如果hashCode值相同,那么,会继续根据equals方法进行判断,
                          根据自己的需求来决定元素是否相同。如果相同,就不存储。否则,存储。

                        一般,用HashSet的时候,要重写hashCode和equals方法。
                        |--LinkedHashSet
                                底层数据结构是链表和哈希表。
                                链表用于保证元素有序,哈希表用于保证元素唯一。
                |--TreeSet
                        底层数据结构是二叉树,线程不安全。
                        如何保证元素的排序呢?两种方式
                        A:让元素本身具备比较性
                                实现Compareable接口中的compareTo方法。
                        B:让集合具备比较性
                                实现Comparator接口中的compare方法。

以后到底用哪个集合呢?
A:如果要元素唯一,就用Set。否则,用List。
B:如果元素唯一并且要排序用TreeSet,否则,用HashSet。
C:如果元素可重复,且考虑线程问题,用Vector。
  否则,用ArrayList或者LinkedList。
  如果要求,增删快,那么,考虑LinkedList。
  如果要求,查询快,那么,考虑ArrayList。
D:当你什么都不清楚的时候,就使用ArrayList。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
恩,谢谢~
回复 使用道具 举报
张丽 发表于 2012-10-11 10:09
估计你是想要知道Set在什么时候使用,其实在Map中,其里面存储的是键值对,如果我们要获取里面的所有键,就 ...

你说对了~
回复 使用道具 举报
Set是接口 无法创建实例对象 只能new Set的子类

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
估计你是想要知道Set在什么时候使用,其实在Map中,其里面存储的是键值对,如果我们要获取里面的所有键,就可以把键用Set集合来存储,这样就可以创建Set集合的子类对象,然后再使用迭代器进行元素的取出,就可以获取到全部的键。Set接口是不能直接创建其对象的,一般是创建它的子类对象。并使用子类对象的方法来操作集合元素的。TreeSet可以使集合中的元素有序,这个有序是指存和取的顺序一致,而HashSet是无序的,其底层用的是HashMap.为什么会出现Set集合呢?其实就是为了保证元素的唯一性,并且需要集合中一次存的是单个元素。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 张忠豹 于 2012-10-11 09:58 编辑

当然不对啊,Set是接口,接口不能直接创建对象……
如果你想要创建Set类型的对象,就应该用它的子类来赋值。
例如:Set s  = new HashSet()
在说了,接口里面的方法都是抽象的,如果创建了接口的对象,那么调用接口的方法时,就应该调用接口实现类的方法。
List l = new LinkedList( )跟这差不多
反正在编程里面,现在很流行面向接口编程。因为这种方式非常灵活。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

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