补充上一日:HashCode方法默认返回的是内存地址,String类已经重写了对象的HashCode方法

 方法细节:取出数组中的值或字符串的值按照规定计算返回一个值,如果两个字符串内容一致就会返回相同的HashCode码

TreeSet

treeSet添加自定义元素注意事项

  1. 往TreeSet添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素自然顺序的特性进行排序存储。

  2. 往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,那么该元素所属的类必须要实现Comparable接口,把元素

   的比较规则定义在compareTo(T o)方法上。
  
  3. 如果比较元素的时候,compareTo方法返回 的是0,那么该元素就被视为重复元素,不允许添加.(注意:TreeSet与HashCode、equals方法是没有任何关系。)
  
    4. 往TreeSet添加元素的时候, 如果元素本身没有具备自然顺序的特性,而元素所属的类也没有实现Comparable接口,那么必须要在创建TreeSet的时候传入一个
    比较器,
  

//自定义比较器的格式 :

             class  类名  implements Comparator{
  public int compare(To o1, To o2) {
             return o1.id-o2.id;
           }
       }

  5.  往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,而元素所属的类已经实现了Comparable接口, 在创建TreeSet对象的时候也传入了比较器

          那么是以比较器的比较规则优先使用。

推荐使用:使用比较器(Comparator)。,使得其他类也可以用,提高复用性

import java.util.Comparator;
import java.util.TreeSet; class gongzitiao implements Comparable<gongzitiao>{ int id;
String name;
int salary; public gongzitiao(int id, String name, int salary) {
super();
this.id = id;
this.name = name;
this.salary = salary;
} @Override
public String toString() {
return "{ 编号:"+ this.id+" 姓名:"+ this.name+" 薪水:"+ this.salary+"}";
} public int compareTo(gongzitiao o) {
return this.salary- o.salary;
}
} //自定义比较器
class MyComparator implements Comparator<gongzitiao>{ @Override
public int compare(gongzitiao o1, gongzitiao o2) {
return o1.id-o2.id;
}
} public class Demo1 { public static void main(String[] args) {
MyComparator comparator = new MyComparator();
TreeSet tree = new TreeSet(comparator); tree.add(new gongzitiao(114, "李杰", 520));
tree.add(new gongzitiao(117, "嘻嘻", 250));
tree.add(new gongzitiao(141, "李英", 258));
tree.add(new gongzitiao(120, "李汉三", 2580));
System.out.println(tree);
}
}

TreeSet存储原理

  底层是使用红黑树(二叉树)数据结构实现的

  存储规则:左小右大

  当重复元素加入时 treeSet调用compareTo方法,返回值如果是零就视为重复元素,就无法加入二叉树中。

  注意:如果加入三组数据无法形成二叉树结构就会发生下面变化

  目的:减少比较次数

TreeSet对字符串进行排序

原因:因为字符串已经实现了Comparable接口所以可以排序

字符串的比较规则:
 
   一、 对应位置有不同的字符出现, 就比较的就是对应位置不同的字符。

   二、对应位置上 的字符都一样,比较的就是字符串的长度。

public class Demo2 {
public static void main(String[] args) {
/*TreeSet tree = new TreeSet();
tree.add("abcccccccccccccccccc");
tree.add("abc");
System.out.println(tree);*/
System.out.println("abw".compareTo("abcccccccccccc"));
}
}

作业:将字符串中的数值进行排序。
    例如String str="8 10 15 5 2 7"; ---->   "2 5 7 8 10 15"

import java.util.Iterator;
import java.util.TreeSet; public class Demo3 { public static void main(String[] args) {
String str="8 10 15 5 2 7";
String[] data = str.split(" "); TreeSet tree = new TreeSet();
for(int i = 0 ; i<data.length ; i++){
tree.add(Integer.parseInt( data[i]));
} Iterator it = tree.iterator();
while(it.hasNext()){
System.out.print(it.next()+" ");
}
}
}

Day 7:TreeSet的更多相关文章

  1. Java提高十七:TreeSet 深入分析

    前一篇我们分析了TreeMap,接下来我们分析TreeSet,比较有意思的地方是,似乎有Map和Set的地方,Set几乎都成了Map的一个马甲.此话怎讲呢?在前面一篇讨论HashMap和HashSet ...

  2. java: Set类及子类:TreeSet有序子类,HashSet无序子类:重复元素

    Set类及子类: TreeSet有序子类: HashSet无序(散列)子类 HashSet子类的内容是没有顺序的,单个元素也不会重复的(对象除外). Set<String> allSet ...

  3. Java集合(6):TreeSet

    一.TreeSet介绍 与HashSet是基于HashMap实现一样,TreeSet是基于TreeMap实现的.TreeSet是一个有序集合,TreeSet中的元素将按照升序排列,缺省是按照自然排序进 ...

  4. 集合系列 Set(八):TreeSet

    TreeSet 是 Set 集合的红黑树实现,但其内部并没有具体的逻辑,而是直接使用 TreeMap 对象实现.我们先来看看 TreeSet 的定义. public class TreeSet< ...

  5. Java基础知识强化之集合框架笔记45:Set集合之TreeSet存储自定义对象并遍历练习1(自然排序:Comparable)

    1. 自然排序: TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间的大小关系,然后将集合元素按照升序排列,这种方式就是自然排序. Java中提供了一个Comp ...

  6. Java开发笔记(六十五)集合:HashSet和TreeSet

    对于相同类型的一组数据,虽然Java已经提供了数组加以表达,但是数组的结构实在太简单了,第一它无法直接添加新元素,第二它只能按照线性排列,故而数组用于基本的操作倒还凑合,若要用于复杂的处理就无法胜任了 ...

  7. 集合类(常见的集合类:Collection、List、Set、ArrayList、linkedList、Vector、HashSet、TreeSet)

    一.集合类 定义:一种为了对多个对象进行操作而进行存储的方式. 1.与数组的区别: 数组:可以存储对象,也可以存储基本数据类型,但是一次只能存储一种类型,数组长度固定. 集合:只能存储对象,长度可变, ...

  8. Java集合系列(三):HashSet、LinkedHashSet、TreeSet的使用方法及区别

    本篇博客主要讲解Set接口的三个实现类HashSet.LinkedHashSet.TreeSet的使用方法以及三者之间的区别. 注意:本文中代码使用的JDK版本为1.8.0_191 1. HashSe ...

  9. 算法竞赛中的常用JAVA API :HashSet 和 TreeSet(转载)

    算法竞赛中的常用JAVA API :HashSet 和 TreeSet set set容器的特点是不包含重复元素,也就是说自动去重. HashSet HashSet基于哈希表实现,无序. add(E ...

随机推荐

  1. JuJu团队1月8号工作汇报

    JuJu团队1月8号工作汇报 JuJu   Scrum 团队成员 今日工作 剩余任务 困难 飞飞 实现三维Dense 将crossentrophy和softmax连接起来 无 婷婷 完善main.jl ...

  2. swoole之建立 http server

    一.代码部分 <?php /** * 传统:nginx <-> php-fpm(fast-cgi process manager) <-> php * swoole:ht ...

  3. 数据库建表并返回给前端 - (mysql-thinkphp) (3)

    1.先建一个表,你可以用mysql代码建,也可以用thinkphp建,也可以视图建,我用不到太复杂的,就用视图建了. 2.配置id为自增,唯一的值,不可重复.主键.要输入中文的选择utf8_gener ...

  4. 61 C项目------家庭收支软件

    1,目标: ①模拟实现一个基于文本界面的<家庭收支软件> ②涉及知识点 局部变量和基本数据类型 循环语句 分支语句 简单的屏幕输出格式控制 2,需求说明: ①模拟实现基于文本界面的< ...

  5. prepareRefresh方法源码跟踪

    看这篇文章之前可以先了解之前的跟踪流程,https://www.jianshu.com/p/4934233f0ead 代码过宽,可以shift + 鼠标滚轮 左右滑动查看 AbstractApplic ...

  6. 0103-springmvc的基本流程

    背景 现在的it研发,已经从管理系统时代迈入了互联网系统时代. 页面开发已经从基于JSP+struts转变为为前后端分离的方式(springMVC + JS): 思想 MVC mvc框架不仅适用于ja ...

  7. BInder机制总结

    BInder机制 Linux内核的基础知识 进程隔离/虚拟地址空间 操作系统当中为了保证进程间互不干扰,设计了进程隔离的技术,避免了一个进程去操作另一个进程的数据.进程隔离用到了虚拟地址空间,不同进程 ...

  8. 用CSS编写多种常见的图形

    用CSS编写多种常见的图形 正方形与长方形 这个是最简单的,直接上代码 <!DOCTYPE html> <html> <head> <title>< ...

  9. Android Studio SharedPreferences

    Android 中最简单的数据存储方式 : SharedPreferences SharedPreferences 数据存储处理实际上时对一个个key——value 数据对的处理 使用SharedPr ...

  10. Django——HttpResponse()

    HttpResponse(content, #返回给视图函数的内容 content_type=None,#返回给视图函数的类型 text/html文本.text/plain.css.js.xml.js ...