1)Set接口

set接口的父接口-Collection

set接口的重要子类-HashSet

set接口的重要子类 -TreeSet

set 接口的特别子类-LinkedHashSet

2)HashSet

内部数据结构:哈希表(散列表)

哈希表的一种典型结构是数组和链表的结合体

添加:园内的元素上的数字表示哈希值,简单起见,决定元素在数组上的位置,算法:index=hashCode%length;

元素的hashCode()方法决定元素在数组中位置,元素添加到链表是,会一次和链表的每个元素判断是否相等,如果有相等情况就丢弃,否则,添加到链表的末尾

1.确定在数组中的位置

2.判断元素在链表上有没有出现过(equals),hashSet中不能存相同的元素

删除:remove(obj) 会先根据元素的hashCode方法定位此对象所在数组的索引位置,依次比较次位置链表的每一个元素,如果相等,则把链表中的此元素删除

特点://元素无序:添加顺序和取出顺序不同
 //不能添加重复的数据
 //可以添加null
 //添加方法效率高

//删除方法效率高

/、HashSet 不支持get获取方法,因为没有索引

3)TreeSet

内部数据结构:二叉树

二叉树特点:一个节点最后只有两个子节点左<父>右,没有重复元素

取出顺序:左-父-右,3,8,10,15,18,20,24(元素在集合中就已排好序)从小到大

按照终序遍历

先找根节点左边的节点

TreeSet的方法和Collection接口的方法一致

TreeSet集合的元素无序(取出顺序和添加顺序不一致)

元素不可重复

元素具有排序性

TreeSet取出元素只能通过迭代器

TreeSet各种操作的效率分析:

添加:只需要定位添加位置,效率很快

删除:只需要定位元素位置,效率很快

4)Comparable

TreeSet元素排序规则:

Comparable接口用来标明元素自身的排序规则,也就是说只有实现此接口才具有比较性,才可以添加到TreeSet中

java常见类如String ,Integer 等都已实现Comparable接口,都有自己独特的排序规则,但我们定义的类Person由于没有实现Comparable接口,因此不具备排序性(比较性)

如果我们想按照Person的姓名排序,我们可以实现Comparable接口,实现此接口的comparable方法,在此方法中按照姓名排序的代码

元素自身所具有的排序规则称为自然排序

只对TreeSet 有效:添加到TreeSet中的元素实现了Comparable接口,实现CompareTo方法后,自身就具有排序性,自然排序

5)Comparator比较器

和元素排序有关的两个接口:Comparable,Comparator

Comparable要求元素本身实现Comparable接口,本身具有比较性

public class Person implements Comparable{

.

.

.

//按照姓名字符串的字典顺序排序
        public int compareTo(Object o){
         //如果返回值等于0,就说明要比较的两个对象相等
         //如果返回小于0的数呢?
         
         if(name==null){
          return 1;
         }
         Person other=(Person)o;
         return name.compareTo(other.getname());
        }

}

Comparator元素并不需要实现接口,接口和集合对象相关

MyComparator mycomparator=new MyComparator();
  TreeSet treeSet=new TreeSet(mycomparator);

。。。

//专门用来比较Person对象
class MyComparator implements Comparator{
 public int compare(Object o1,Object o2){
  Person p1=(Person)o1;
  Person p2=(Person)o2;
  //为了简单起见,不考虑p1,p2为null的情况
  int age1=p1.getage();
  int age2=p2.getage();
  if(age1==age2){
   String name1=p1.getname();
   String name2=p2.getname();
   //String类型本身就具有比较性.name1不为null
   return name1.compareTo(name2);
  }else{
   return age1-age2;
  }
 }

6)Set接口综述

特点:元素无序,不可重复

Set接口没有提供特殊的方法:Collection Set接口,HashSet,TreeSet类方法都是一样

7)LinkedHashSet

LinkedHashSet是哈希表和链表的结合体

结合后的特点:元素有序,元素不可重复,添加删除效率高

8)Set练习

1.去除集合中的重复元素

//1.使用迭代器一个一个添加
//  Iterator it=list.iterator();
//  while(it.hasNext()){
//   Object element=it.next();
//   set.add(element);
//   
//  }
//  System.out.println(set);
  //2.HashSet 中可以添加一个Collection类的参数
//  Set set2=new HashSet(list);
//  System.out.println(set2);
  //3.SetAll(Collection)
  Set set3=new HashSet();

2.把一个字符串数组中的元素按字符串的长度降序排序,如果长度一样,按照字符串的自然顺序排序

HashSet set= new HashSet(new Comparator{

public int compare(Object o1,Object o2){

String str1=(String)o1;

String str2=(String)o2;

if(str1==null){

return 1;

}

if(str2==null){

return -1;

}

int len1=str1.length();

int len2=str2.length();

if(len1==len2){

return len1.compare(len2);

}else{

return len1-len2

}

}

})

3. 简单实现自己的HashSet类-MyHashSet,简单实现add(obj),remove(obj)方法,实现自己的printAllElement()方法,此方法打印出所有的元素(不用实现其他接口)

1.创建一个LinkedList 数组,在add方法中添加链表,LinkedList linkedList=datas[index];

2.if(linkedList==null){

linkedList=new LinkedList();

data[index]=linkedList();

}

Iterator it=linkedList.iterator();

while(it.hasNext()){

Object element=it.next();

if(obj.equals(element)){

return;

}

linkedList.add(obj);

}

java 深入技术四(Set)的更多相关文章

  1. developerWorks 中国 技术主题 Java technology 文档库 Java 性能测试的四项原则

    转-https://www.ibm.com/developerworks/cn/java/j-lo-java-performance-testing/?cm_mmc=dwchina-_-homepa ...

  2. Java线程间通信方式剖析——Java进阶(四)

    原创文章,同步发自作者个人博客,转载请在文章开头处以超链接注明出处 http://www.jasongj.com/java/thread_communication/ CountDownLatch C ...

  3. Java Web技术总结(目录)

    来源于:http://www.jianshu.com/p/539bdb7d6cfa Java Web技术经验总结(一) Java Web技术经验总结(二) Java Web技术经验总结(三) Java ...

  4. Java加密技术

    相关链接: Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC Java加密技术(二)——对称加密DES&AES Java加密技术(三)——PBE算法  ...

  5. Java多线程技术学习笔记(二)

    目录: 线程间的通信示例 等待唤醒机制 等待唤醒机制的优化 线程间通信经典问题:多生产者多消费者问题 多生产多消费问题的解决 JDK1.5之后的新加锁方式 多生产多消费问题的新解决办法 sleep和w ...

  6. 浅谈Java分页技术

    话不多言.我们要实现java分页技术,我们首先就需要定义四个变量,他们是: int  pageSize;//每页显示多少条记录 int pageNow;//希望现实第几页 int pageCount; ...

  7. Java进阶(七)Java加密技术之非对称加密算法RSA

    Java加密技术(四)--非对称加密算法RSA 非对称加密算法--RSA 基本概念 非对称加密算法是一种密钥的保密方法. 非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(priv ...

  8. 深入浅出Java探针技术1--基于java agent的字节码增强案例

    Java agent又叫做Java 探针,本文将从以下四个问题出发来深入浅出了解下Java agent 一.什么是java agent? Java agent是在JDK1.5引入的,是一种可以动态修改 ...

  9. [转]Java工程师技术栈--成神之路

    一.基础篇 1.1 JVM 1.1.1. Java内存模型,Java内存管理,Java堆和栈,垃圾回收 http://www.jcp.org/en/jsr/detail?id=133http://if ...

随机推荐

  1. LeetCode:Merge k Sorted Lists

    题目链接 Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexi ...

  2. 也谈面试必备问题之 JavaScript 数组去重

    Why underscore (觉得这部分眼熟的可以直接跳到下一段了...) 最近开始看 underscore.js 源码,并将 underscore.js 源码解读 放在了我的 2016 计划中. ...

  3. Swagger+AutoRest 生成web api客户端(.Net)

    简介 对于.net来说,用web api来构建服务是一个不错的选择,都是http请求,调用简单,但是如果真的要在程序中调用,则还有些工作要做,比如我们需要手写httpClient调用,并映射Model ...

  4. 软件工程(FZU2015)赛季得分榜,第七回合

    目录 第一回合 第二回合 第三回合 第四回合 第五回合 第6回合 第7回合 第8回合 第9回合 第10回合 第11回合 积分规则 积分制: 作业为10分制,练习为3分制:alpha30分: 团队项目分 ...

  5. .pop ----remove 删除

    s = {1,2,3,4,5,6,'sn','7'} s.pop()#删除随机值 print(s)#{2, 3, 4, 5, 6, '7', 'sn'} s.remove('sn')#删除值 prin ...

  6. 一次kibana小问题排查的过程记录

    起因 中午业务组同事报告说kibana服务不能正常使用,登录kibana前端查看,网站能够访问,但是页面显示仅有title部分而无内容部分. 排查 首先确认kibana服务是否正常,登录kuberne ...

  7. ssh项目将搜索条件进行联动

    <s:form namespace="/tb" action="tenderList" name="searchForm" id=&q ...

  8. mui事件绑定和可以用的js dom操作方法

    <script> //事件绑定 对象 方法 子元素 回调函数 mui('body').on('shown', '.mui-popover', function(e) { //console ...

  9. ubuntu使用doxygen

    1.安装 sudo apt-get install doxygen按tab键 doxygen        doxygen-dbg    doxygen-doc    doxygen-gui    d ...

  10. VS2013单元测试 的安装、创建与执行

    1.要运行 vs2013单元测试 ,那么打开VS2013,选择工具-扩展和更新,搜索并安装Unit Test Generator. 如果不安装是不会出现Generate Unit Test的选项的,也 ...