java 深入技术四(Set)
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)的更多相关文章
- developerWorks 中国 技术主题 Java technology 文档库 Java 性能测试的四项原则
转-https://www.ibm.com/developerworks/cn/java/j-lo-java-performance-testing/?cm_mmc=dwchina-_-homepa ...
- Java线程间通信方式剖析——Java进阶(四)
原创文章,同步发自作者个人博客,转载请在文章开头处以超链接注明出处 http://www.jasongj.com/java/thread_communication/ CountDownLatch C ...
- Java Web技术总结(目录)
来源于:http://www.jianshu.com/p/539bdb7d6cfa Java Web技术经验总结(一) Java Web技术经验总结(二) Java Web技术经验总结(三) Java ...
- Java加密技术
相关链接: Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC Java加密技术(二)——对称加密DES&AES Java加密技术(三)——PBE算法 ...
- Java多线程技术学习笔记(二)
目录: 线程间的通信示例 等待唤醒机制 等待唤醒机制的优化 线程间通信经典问题:多生产者多消费者问题 多生产多消费问题的解决 JDK1.5之后的新加锁方式 多生产多消费问题的新解决办法 sleep和w ...
- 浅谈Java分页技术
话不多言.我们要实现java分页技术,我们首先就需要定义四个变量,他们是: int pageSize;//每页显示多少条记录 int pageNow;//希望现实第几页 int pageCount; ...
- Java进阶(七)Java加密技术之非对称加密算法RSA
Java加密技术(四)--非对称加密算法RSA 非对称加密算法--RSA 基本概念 非对称加密算法是一种密钥的保密方法. 非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(priv ...
- 深入浅出Java探针技术1--基于java agent的字节码增强案例
Java agent又叫做Java 探针,本文将从以下四个问题出发来深入浅出了解下Java agent 一.什么是java agent? Java agent是在JDK1.5引入的,是一种可以动态修改 ...
- [转]Java工程师技术栈--成神之路
一.基础篇 1.1 JVM 1.1.1. Java内存模型,Java内存管理,Java堆和栈,垃圾回收 http://www.jcp.org/en/jsr/detail?id=133http://if ...
随机推荐
- 由12306动态验证码想到的ASP.NET实现动态GIF验证码(附源码)
背景: 12306网站推出“彩色动态验证码机制”,新版验证码不但经常出现字符叠压,还不停抖动,不少人大呼“看不清”,称“那个验证码,是毕加索的抽象画么!”铁总客服则表示:为了能正常购票只能这样.而多家 ...
- Jquery遮罩插件,想罩哪就罩哪!
一 前言 在项目开发时发现没有一个用起来 爽一点的遮罩插件,看起来觉得不难 好吧那就利用空闲时间,自己折腾一个吧,也好把jquery再温习一下, 需要的功能如下 1 可以全屏遮 用于提交数据时 2 ...
- 用上CommonMark.NET,.NET平台终于有了好用的markdown引擎
缺少好用的markdown引擎之前一直是.NET平台上的一个痛点.因为这个痛点,我们被迫痛苦地使用了pandoc--不是pandoc做的不好,而是pandoc是由Haskell开发的,只能在Windo ...
- 个人作业——关于K米的产品案例分析
Notice:本文所采用的K米版本为 Version:4.3.0 Release:20161014 第一部分 调研,评测 评测: 软件的bug,功能评测,黑箱测试 1.下载并使用,描述最简单直观的个人 ...
- 并查集(union-find)算法
动态连通性 . 假设程序读入一个整数对p q,如果所有已知的所有整数对都不能说明p和q是相连的,那么将这一整数对写到输出中,如果已知的数据可以说明p和q是相连的,那么程序忽略p q继续读入下一整数对. ...
- Java中普通代码块,构造代码块,静态代码块区别及代码示例
//执行顺序:(优先级从高到低.)静态代码块>mian方法>构造代码块>构造方法. 其中静态代码块只执行一次.构造代码块在每次创建对象是都会执行. 1 普通代码块 1 //普通代码块 ...
- Ubuntu使用MyEclipse闪退的解决办法
修改myeclipse.ini文件, -Xmx512m-XX:MaxPermSize=512m-XX:ReservedCodeCacheSize=256m-Dosgi.nls.warnings=ign ...
- Git初级实践教程(图文)
关于Git Git的由来 Linux 的创始人 Linus Torvalds 在 2005 年开发了 Git 的原型程序.当时,由于在 Linux 内核开发中使用的既有版本管理系统的开发方许可证发生了 ...
- Iptables防火墙NAT地址转换与端口转发
开启系统转发功能: [root@localhost /]# vim /etc/sysctl.conf # Generated by iptables-save v1.4.7 on Thu May 12 ...
- Android开发笔记之《远程控制(MQTT|mosquitto) && (ProtocalBuffer | GRPC)》
Android推送方案分析(MQTT/XMPP/GCM): http://www.open-open.com/lib/view/open1410848945601.htmlMQTT官网: http:/ ...