51. TreeSet
集合分类:
-------------------| Collection 单列集合的根接口
---------------| List 如果实现了List接口的集合类,具备的特点是:有序,可重复
-----------| ArrayList ArrayList底层维护的是一个Object类型的数组,特点是:查询快,增删慢
使用场景:如果目前的数据查询多,增删少,那么就使用ArrayList存储数据
注意:使用ArrayList无参构造方法时,Object默认的长度时10,不够的话自动增长0.5倍
-----------| LinkedList LinkedList底层使用了链表数据结构实现的。特点是:查询慢,增删快
使用场景:数据查询少,增删多的时候,用LinkedList存储
---------------| Set 如果实现了Set接口的集合类,具备的特点是:无序,不可重复
注意:Set接口没有get()方法,迭代器才是通用遍历集合的方法,所以我们最好使用迭代器遍历
-----------| HashSet
HashSet的实现原理:
往HashSet添加元素的时候,HashSet会自动先调用元素的hashCode方法得到元素的哈希表,然后通过元素的哈希值经过移位等运算,就可以算出该元素在哈希表中的存储位置
情况一:如果算出元素的存储位置目前还没有元素,那么该元素可以直接存储到该位置
情况二:如果算出元素的存储位置已经存在其他元素,那么会自动调用equals方法再进行比较一次如果equals返回ture那么就视为重复元素,不可添加,如果返回false,那么就可以添加
注意:hashCode和equals方法,都是自动调用的,并不是我们手动调用(注意List接口和Set实现原理不同之处)
-----------| ThreeSet
ThreeSet注意事项:
1.ThreeSet在添加元素的时候,如果数据有自然排序规则,那么就按照元素的自然顺序的特性进行排序存储
2.ThreeSet在添加元素的时候,如果数据不具备自然排序规则,那么该元素所属类必须实现Comparable接口,把元素的比较规则写在compareTo方法上
3.ThreeSet在添加元素的时候,如果元素本身不具备自然数据特性,而元素也没有实现Comparable接口,那么必须要在创建ThreeSet的时候传入一个比较器
4.如果比较元素的时候调用compareTo返回的是0,那么该元素就被视为重复元素,不可添加(注意:跟hashcode和equals无关)
自然特性:
例如 数字 字母等,因为它们都实现了Comparable接口,不需要我们再自己定义排序规则了
字符串比较规则:
情况一:对应位置有不同字符出现,那么就比较的就是对应位置的字符
情况二:对应位置有相同的字符出现,那么比较的是字符的长度
比较器定义规则:
自定义一个类,实现Comparable接口,把比较规则写在compareTo方法中
注意:ThreeSet是在排好序再进行存储的,并不是在输出的时候再排序输出的
推荐使用:比较器,这样提高了代码的重用性
ThreeSet的存储原理:
底层是使用红黑数(二叉树)数据结构实现的 储存规则:左小右大

首先第一个是老钟,因为没有比较的对象,所以老钟排在最顶端
第二是老陆先跟老钟比,比老钟小,所以排在老钟的左边
第三是老汤先跟老钟比,比老钟大,所以排在老钟的右边
第二是老黎先跟老钟比,比老钟大,所以排在老钟的右边,再跟老汤比比老汤大所以在老汤的右边
最后的结果是:老陆 老钟 老汤 老黎
注意:如果三个数据还没有构成二叉树数据结构,那么就会自动调增为二叉树数据结构
也就是:
先添加老陆后添加老钟那么老钟在老陆右边
再添加老汤,老汤比老陆和老钟都大,再老钟右边
这时就是没有构成二叉树数据结构,那么它会自动调增为
老钟在最上面,老陆在左边,老汤在右边
不具备自然规则的实例:
class People {
int id;
String name;
public People(int id , String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "{ 身份证"+this.id+" 姓名:"+this.name+" }";
}
}
class PeopleComparator implements Comparator{
@Override
public int compare(Object o1, Object o2) {
People p1 = (People)o1;
People p2 = (People)o2;
return p1.id-p2.id;
}
}
public class Demo2 {
public static void main(String[] args) {
PeopleComparator peocom = new PeopleComparator();
TreeSet set = new TreeSet(peocom);
set.add(new People(1003,"狗蛋"));
set.add(new People(1001,"狗娃"));
set.add(new People(1002,"老李"));
//添加一个身份证一样的,姓名不一样的人
set.add(new People(1001,"老八"));
//使用迭代器遍历
Iterator it = set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}

具备规则的实例:
public class Demo2 {
public static void main(String[] args) {
TreeSet set = new TreeSet();
set.add(10);
set.add(5);
set.add(9);
TreeSet set1 = new TreeSet();
set1.add("b");
set1.add("c");
set1.add("a");
//使用迭代器遍历
Iterator it = set.iterator();
while(it.hasNext()) {
System.out.print(it.next()+",");
}
System.out.println(" ");
Iterator it1 = set1.iterator();
while(it1.hasNext()) {
System.out.print(it1.next());
}
}
}

51. TreeSet的更多相关文章
- Spring Boot文档
本文来自于springboot官方文档 地址:https://docs.spring.io/spring-boot/docs/current/reference/html/ Spring Boot参考 ...
- Java 集合类 TreeSet、TreeMap
TreeMap和TreeSet的异同: 相同点: TreeMap和TreeSet都是有序的集合,也就是说他们存储的值都是拍好序的. TreeMap和TreeSet都是非同步集合,因此他们不能在多线程之 ...
- Java 容器 & 泛型:三、HashSet,TreeSet 和 LinkedHashSet比较
Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket 上一篇总结了下ArrayList .LinkedList和Vector比较,今天泥瓦匠总结下Hash ...
- Java集合--TreeSet
转载请注明出处:http://www.cnblogs.com/skywang12345/admin/EditPosts.aspx?postid=3311268 第1部分 TreeSet介绍 TreeS ...
- TreeSet源码解析笔记
定义: TreeSet是一个有序的集合,它的作用是提供有序的Set集合.它继承了AbstractSet抽象类,实现了NavigableSet<E>,Cloneable,Serializab ...
- Java中TreeSet的详细用法
第1部分 TreeSet介绍 TreeSet简介 TreeSet 是一个有序的集合,它的作用是提供有序的Set集合.它继承于AbstractSet抽象类,实现了NavigableSet, Clonea ...
- 集合框架-TreeSet集合-二叉树
1 package cn.itcast.p5.treeset.demo; 2 3 import java.util.Iterator; 4 import java.util.TreeSet; 5 6 ...
- 集合框架-TreeSet集合
1 package cn.itcast.p5.treeset.demo; 2 3 import java.util.Iterator; 4 import java.util.TreeSet; 5 6 ...
- HashSet HashTable 与 TreeSet
HashSet<T>类 HashSet<T>类主要是设计用来做高性能集运算的,例如对两个集合求交集.并集.差集等.集合中包含一组不重复出现且无特性顺序的元素. HashSet& ...
随机推荐
- js转义符
\0 :null(\u0000) \b :后退键(\u0008) \f :换页符(\u000C) \n :换行符(\u000A) \r :回车键(\u000D) \t :制表符(\u0009) \v ...
- 出现异常: 非介入式客户端验证规则中的验证类型名称必须唯一。下列验证类型出现重复: required
在将web.config文件中的<add key="ClientValidationEnabled" value="false" /> 设为fals ...
- texi2dvi - 打印 Texinfo 文档
SYNOPSIS 总览 texi2dvi [OPTION]... FILE... DESCRIPTION 描述 依次从 Tex 系统中运行每个 Texinfo 或者 LaTex 文件 FILE,直到解 ...
- Fiddler手机抓包配置
之前按照网上教程配置,发现还是不太详细,做下笔记备忘 一.电脑端配置 因为手机需要配置电脑IP,如果我们IP自动获取,某一时刻IP可能会被改变,此时手机端无法看到抓包信息, 所以第一步,需要确认电脑端 ...
- KiCAD层颜色修改
KiCAD层颜色修改 KiCAD的PCB各层的颜色太过于暗淡,有时可能不适合操作者的习惯,尤其是铜层(布线层),这时候就需要去修改层的颜色,具体操作如下图:选择想要修改的层,双击左边颜色框框,进入之后 ...
- ASP.NET MVC SignalR 简单聊天推送笔记
介绍:(抄袭于网络) ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.实时 Web 功能是指这样一种功能:当所连接 ...
- 配置基于python的VIM环境
配置基于python的VIM环境 安装插件管理工具 为防止过多插件管理的麻烦,首先安装vim的插件管理工具Vundle.vundle本身的github软件已经有相关的中文文档,地址如下: vundle ...
- linux的锁比较
spinlock spinlock介绍 spinlock又称自旋锁,线程通过busy-wait-loop的方式来获取锁,任时刻只有一个线程能够获得锁,其他线程忙等待直到获得锁.spinlock在多 ...
- AtomicInteger 、Synchronized 和 volatile 之间的区别?
AtomicInteger:无锁的线程安全整数??? Synchronized:同步 volatile:挥发性??? 参考文档:
- vue ui 开启无效记录
换了台电脑,输入vue ui 无法开启图形化界面 1.首先vue ui 没成功 我找到vue.cmd路径配置到环境变量依旧没有解决 然后使用vue -h 显示没有vue ui这个命令 重新安装npm ...