(9)集合之Set,HashSet,TreeSet
TreeSet子类
注意事项:
1、向TreeSet添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素自然顺序的特性进行排序存储
2、往TreeSet添加元素的时候,如果元素本身不具备自然顺序特性,该元素所属的类必须要实现Comparable接口(该接口只有一个compareTo方法),把元素的比较规则定义在compareTo(T o)方法上。
compareTo()方法负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。
3、如果比较元素的时候compareTo返回的是0的,那么该元素视作添加的是重复元素,set是去重的,多以就不允许添加进来。不去看equals也不看hashCode方法,看的是compareTo方法。
4、往TreeSet添加元素的时候,如果元素本身没有具备自然序列的特性,而元素所属的类,也没有实现comparable接口,那么要在创建TreeSet的时候传入一个比较器。
5、往TreeSet添加元素的时候,如果元素本身不具备自然顺序特性,而元素所属的类已经实现了Comparable接口,再创建TreeSet的时候也传入了自定义个比较器,那么比较器的比较规则优先使用。
比较的工作是有TreeSet做的,但是做之前有要求,1、元素本身具有自然顺序的特性,2不具备自然特性,从两方面下手:2.1让元素实现Comparable接口,重写CompareTo方法,2.2set在创建的时候,给set传入一个比较器comparator
自定义比较器的格式:自定义一个类实现Comparator接口即可,把元素与元素之间的比较规则定义在compare()方法内即可
Class 类名 implements Comparator
{
}
TreeSet的存储原理:底层是使用红黑树(二叉树)数据结构实现的,而且这个二叉树是一个平衡二叉树(这样可以是比较的次数尽可能的少)。存储的规则是:左小右大。
推荐使用Comparator的比较器。为什么这样推荐那呢,Comparable接口,之内在实现该类的自定义类中使用,使用conparator接口的比较器,只要你设计的好,很多地方都可以使用,这样提高了代码的重用性。
List的contain方法使用的是equals()方法
HashSet集合中则联合使用hashCode和equals方法。
TreeSet是在元素可比的前提下,使用的是Comparable或者Comparator中的compareTo方法
TreeSet是可以对字符串进行排序的,因为字符串已经实现了Comparable接口的
这里说明一下,比较的主体是this,
If(this > obj) return 1;
If (this < obj) return -1;
每个元素是一个Person,有姓名和年龄,按照年龄从小到达的顺序排列如果年龄相同的话,则在 比较姓名
// Person实现Comparable接口
@Override
public int compareTo(Object o) {
Person p = (Person) o; if(this.getAge() > p.getAge())
return 1;
if(this.getAge() < p.getAge())
return -1;
return this.getName().compareTo(p.getName());
} // 自顶一个一个自己的比较器
class MyComparator implemments Comparator
{
public int compareTo(Object 01, Object o2)
{
Person p1 = (Person) o1;
Person p2 = (Person) o2; if(p1.getAge() > p2.getAge()) return 1;
if(p1.getAge() < p2.getAge()) return -1;
return p1.getName().compareTo(p2.getName());
}
}
(9)集合之Set,HashSet,TreeSet的更多相关文章
- Set集合[HashSet,TreeSet,LinkedHashSet],Map集合[HashMap,HashTable,TreeMap]
------------ Set ------------------- 有序: 根据添加元素顺序判定, 如果输出的结果和添加元素顺序是一样 无序: 根据添加元素顺序判定,如果输出的结果和添加元素的顺 ...
- java基础33 Set集合下的HashSet集合和TreeSet集合
单例集合体系: ---------| collection 单例集合的根接口--------------| List 如果实现了list接口的集合类,具备的特点:有序,可重复 注:集合 ...
- Java 集合系列 16 HashSet
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- Leetcode: LFU Cache && Summary of various Sets: HashSet, TreeSet, LinkedHashSet
Design and implement a data structure for Least Frequently Used (LFU) cache. It should support the f ...
- 【java集合系列】---HashSet
在前面的博文中,小编主要简单介绍了java集合中的总体框架,以及list接口中典型的集合ArrayList和LinkedList,接着,我们来看set的部分集合,set集合和数学意义上的集合没有差别, ...
- Java集合框架之HashSet浅析
Java集合框架之HashSet浅析 一.HashSet综述: 1.1HashSet简介 位于java.util包下的HashSet是Java集合框架的重要成员,它在jdk1.8中定义如下: publ ...
- 学习JDK1.8集合源码之--TreeSet
1. TreeSet简介 TreeSet是Set的实现类之一,是不可重复集合,非线程安全的. TreeSet是SortedSet的唯一实现类,实现了元素的自动排序,排序不是以插入的顺序排序,而是默认以 ...
- Java集合之HashSet/TreeSet原理
Set集合 1.HashSet 只去重复, 没有顺序 HashSet的add方法会调用hashCode和equals, 所以存储在HashSet中的对象需要重写这两个方法. 2.TreeSet ...
- java集合(ArrayList,Vector,LinkedList,HashSet,TreeSet的功能详解)
说起集合,我们会潜意识里想到另外一个与之相近的名词——数组,OK!两者确实有相似之处,但也正是这点才是我们应该注意的地方,下面简单列出了两者的区别(具体功能的不同学习这篇文章后就会明白了): 数组 长 ...
- 集合(七) Set—HashSet,TreeSet和LinkedHashSet
四.Set Set和List一样,也是继承Collection的接口,但Set是不包含重复元素的集合.由于先啃下Map,Set的难度将会大幅减小.因为Set基本上都是以Map为基础实现的,例如两个主要 ...
随机推荐
- 私有云存储搭建(owncloud)
第一步.搭建LAMP(基于linux7.1.1503) 1 配置yum(网络加本地,下面为网络) [vault.centos.org_7.1.1503_os_x86_64_] name=added f ...
- windows服务用脚本无法启动
1.创建windows服务工程 工程名:ServiceDemo 2.添加加载启动及卸载服务脚本 加载及启动批处理: @echo off if exist "%SystemRoot%/Micr ...
- Kafka 0.10 KafkaConsumer流程简述
ConsumerConfig.scala 储存Consumer的配置 按照我的理解,0.10的Kafka没有专门的SimpleConsumer,仍然是沿用0.8版本的. 1.从poll开始 消费的规则 ...
- C/C++中的联合体
C/C++中的联合体 利用union可以用相同的存储空间存储不同型别的数据类型,从而节省内存空间.当访问其内成员时可用"."和"->"来直接访问. 当多个 ...
- java_JDBC(4)
一.Statement import java.sql.*; public class TestJDBC { public static void main(String[] args) { Conn ...
- UE4中的集合:TSet容器
好久没有更新了,最近一直在老家过年,网络不通的,今天才有时间更新一集. 一.TSet<T>是什么 UE4中,除了TArray动态数组外,还提供了各种各样的模板容器.这一节,我们就介绍集合容 ...
- OC 常用方法记录
1.排序 给数组排序 按照字母的升序 //对key按字母升序排序 NSArray *sortedArray = [keys sortedArrayUsingComparator:^NSComparis ...
- Unity编程标准导引-3.3 Transform
本文为博主原创文章,欢迎转载.请保留博主链接http://blog.csdn.net/andrewfan 每个游戏对象(GameObject),其存在于游戏世界,都有一个位置.朝向.大小等基本定位信息 ...
- spring+struts2+ibatis 框架整合以及解析
一. spring+struts2+ibatis 框架 搭建教程 参考:http://biancheng.dnbcw.net/linux/394565.html 二.分层 1.dao: 数据访问层(增 ...
- nodejs爬虫——汽车之家所有车型数据
应用介绍 项目Github地址:https://github.com/iNuanfeng/node-spider/ nodejs爬虫,爬取汽车之家(http://www.autohome.com.cn ...