Java集合框架详解之继承set接口

Java集合框架详解

趁着最近比较闲,静下心来准备把关于集合框架的东西好好整理一下,边学边整理。近阶段先是整理整体的知识点,一些接口,一些继承类以及它们的特性,用法,后续还会有一些常用的,比较重要的类的jdk源码剖析。

首先在集合框架的类继承体系中包含两个最顶层的接口:collection和map接口
1)collection表示纯数据;map表示key-value键值对
2)集合框架的两个“标准”的构造函数:
-没有参数的构造函数,创建一个空的集合类
-有一个类型与基类(Collection或Map)相同参数的构造函数,创建一个与给定参数具有相同元素的新集合类

collection接口:

这里写图片描述
有三个接口继承自collection:
-set:表示数据不能有重复的集合
-list:表示的集合可以数据重复,有序的collection
-queue:jkd1.5新增,用于存储数据,不能处理数据(不常用)
jdk不提供直接继承collection接口的类,必须继承子接口,有的类支持元素重复,有的支持排序,继承自collection的子类都有一个iterator方法,该方法返回一个迭代子,可以逐一访问collection中每一个元素。

Java集合框架详解之继承set接口:http://blog.csdn.net/JasonZhangOO/article/details/55807103
Java集合框架详解之继承list接口:http://blog.csdn.net/JasonZhangOO/article/details/55807177
Java集合框架详解之继承queue接口:http://blog.csdn.net/JasonZhangOO/article/details/55807197
Java集合框架详解之继承map接口:http://blog.csdn.net/JasonZhangOO/article/details/55807685
Java集合框架详解之一点小总结:http://blog.csdn.net/JasonZhangOO/article/details/55808011

Collection 接口提供的主要方法:
boolean add(Object o) 添加对象到集合;
boolean remove(Object o) 删除指定的对象;
int size() 返回当前集合中元素的数量;
boolean contains(Object o) 查找集合中是否有指定的对象;
boolean isEmpty() 判断集合是否为空;
Iterator iterator() 返回一个迭代器;
boolean containsAll(Collection c) 查找集合中是否有集合 C 中的元素;
boolean addAll(Collection c) 将集合 C 中所有的元素添加给该集合;
void clear() 删除集合中所有元素;
void removeAll(Collection c) 从集合中删除 C 集合中也有的元素;
void retainAll(Collection c) 从集合中删除集合 C 中不包含的元素。

继承set接口

set中不包含重复元素,有m,n,则m.equals(n)=false,可以有null元素,最多一个。
HashSet:
HashSet低层是基于HashMap实现的set,用HashMap保存数据,和HashMap一样的性能,消耗较多内存。
-hashCode和equal()是HashMap用的,因为无需排序所以只需要关注定位和唯一性即可。
-hashCode是用来计算hash值的,hash值是用来确定hash表索引的。
-hash表中的一个索引存放的是一张链表,所以还要通过equal方法循环比较链上的每一个对象才可以真正定位到键值对应的Entry。
-put时,如果hash表中没定位到,就在链表前加一个Entry,如果定位到了,则更换Entry中的value(值)并返回旧value(值)
-(关于HashMap)覆写key的hashCode()和equal()时不要关联可变属性,否则属性变了hashCode会变,equal也会为false,这样在Map中就找不到它了,而且这样的对象因为找不到它,所以得不到释放,这样就变成了一个无效引用。(相当于内存泄漏)

Hashset的使用:

    HashSet hashSet= new HashSet();
    String s1 = "hello";
    String s2 = "abc";
    String s3 = "edf";

    hashSet.add(s1); //在集合末尾添加
    hashSet.add(s2); //计算hashcode,hello排在abc后面
    hashSet.add(s3); //计算hashcode,edf排在hello前面

    hashSet.add(s1); //重复的元素会覆盖     
    Object[] object = hashSet.toArray();//返回包含全部键的object类型数组

    System.out.println(object[0].toString());

TreeSet:
treeset底层是基于treemap实现的一个tree形有序set,需要实现comparable接口可以实现定位,按升序排列。
treeset和HashSet访问元素都是使用iterator。

treeset的使用:

    TreeSet treeSet = new TreeSet();
    String s1 = "hello";
    String s2 = "abc";
    String s3 = "edf";

    treeSet.add(s1);
    treeSet.add(s2);
    treeSet.add(s3);

    for(Iterator it = treeSet.iterator(); it.hasNext();){  //使用iterator访问元素
        String tmp = it.next().toString();
        System.out.println(tmp + "--");
    }

    treeSet.floor(s2); //返回此 set 中小于等于s2的最大元素;不存在返回 null        
    treeSet.ceiling(s2); //返回此 set 中大于等于s2的最小元素;不存在返回 null
    treeSet.lower(s2);  //返回此 set 中小于s2的最大元素;不存在返回 null
    treeSet.higher(s2); //返回此 set 中大于s2的最小元素;不存在返回 null
    treeSet.pollFirst(); //获取并移除最小的元素
    String string=(String)treeSet.pollLast(); //获取并移除最大的元素
    System.out.println(string);

HashSet和treeset比较:
1)HashSet是基于hash算法的,底层使用HashMap保存数据;treeset使用tree树形结构,treemap实现。
2)HashSet性能优于treeset,通常使用HashSet,需要排序时使用treeset。

参考文章:
http://www.codeceo.com/article/java-collection-summary.html
http://www.codeceo.com/article/java-collection-class.html
http://www.imooc.com/article/1893
http://blog.csdn.net/softwave/article/details/4166598

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值