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. 用CSS正确显示人民币符号的HTML转义字符

    做电子商务的难免要跟钱打交道,特别是跟人民币接触更多,但人民币符号长什么样呢,是¥还是¥?糊涂了吧^~^,要知道答案很简单,找出一张新的一百元大钞,在背面看看那个防伪的银线,上面就有. 我们做网页时要 ...

  2. 招聘前端、Java后端开发、测试、Mysql DBA

    公司介绍: http://www.lagou.com/gongsi/43095.html http://www.yamichu.com 简历发到: zhuye@yamichu.com 招聘职位: JA ...

  3. FFT

    void FFT(complex a[],int n,int fl){ ,j=n/;i<n;i++){ if (i<j) {complex t=a[i];a[i]=a[j];a[j]=t; ...

  4. 随堂软工团队小测——git协同

    No Bug 031402401鲍亮 031402402曹鑫杰 031402403常松 031402412林淋 031402418汪培侨 031402426许秋鑫 功能模块划分 方法 功能 main( ...

  5. redshift 調節螢幕色溫 保護眼睛

    // install redshift sudo apt-get install redshift // 調節 5000K 色溫 redshift -O 5000 // reset 色溫 redshi ...

  6. Android LitePal 神一般的数据库框架 超级好用

    参考: Android数据库高手秘籍(一)--SQLite命令 Android数据库高手秘籍(二)--创建表和LitePal的基本用法 Android数据库高手秘籍(三)--使用LitePal升级表 ...

  7. 利用phpize 外挂php扩展

    如果你的php是手动编译安装的 ,可能有一些扩展一开始并没有开启,以后需要某扩展的时候又不想重新编译php,使用phpize可以动态添加扩展 以Ubuntu为例, 如果你是我这样安装php的  apt ...

  8. 配置javac环境

    初始的javac是默认不可用,如下图: 系统变量->新建->变量名:JAVA_HOME 变量值:(C:\Program Files\Java\jdk1.7.0_03)(这只是我的JDK安装 ...

  9. 基于MST的立体匹配及相关改进(A Non-Local Cost Aggregation Method for Stereo Matching)

    怀着很纠结的心情来总结这篇论文,这主要是因为作者提虽然供了源代码,但是我并没有仔细去深究他的code,只是把他的算法加进了自己的项目.希望以后有时间能把MST这一结构自己编程实现!! 论文题目是基于非 ...

  10. 在ubuntu/deepin/mint等系统中使用命令删除文件或文件夹

    此命令操作需谨慎: sudo rm -rf 文件夹路径(或文件路径)