Set集合的特性:

  • 元素是无序的(存入和取出的顺序不一定一致),元素不可以重复
  • 元素不可重复只针对于基本数据类型和String
    代码如下:
package com.ljx.set;
import java.util.HashSet;/*** 演示set集合的特性**/
public class SetDemo {public static void main(String[] args) {HashSet hs=new HashSet<>();hs.add("a");hs.add("b");hs.add("c");hs.add("a");System.out.println(hs.size());}
}

控制台显示为3 because Set集合自带去重复功能

HashCode (哈希码)

hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值 详细了解请 参考 public int hashCode()返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。

引用数据类型时单用hashcode不可以去重复,代码如下

HashTable(哈希表)

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

Set集合元素的去重:

“引用数据类型去重复需要重写hashCode以及equals方法” 代码如下:

package com.ljx.set;
import java.util.HashSet;
public class SetDemo {public static void main(String[] args) {HashSet al=new HashSet<>();al.add(new Person("a",1));al.add(new Person("b",2));al.add(new Person("c",3));al.add(new Person("a",1));System.out.println(al.size());}
}class Person{ private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Person(String name, int age) {super();this.name = name;this.age = age;}public Person() {super();}@Overridepublic int hashCode() {System.out.println("来了老弟:"+this.getName());return this.getName().hashCode()+this.age;}@Overridepublic boolean equals(Object obj) {if(obj instanceof Person) {Person p=(Person)obj;System.out.println(this.getName()+"---equals---"+p.getName());return this.getName().equals(p.getName()) && this.getAge()==p.getAge();}return false;
}
}

结果显示如下:

TreeSet集合的特性:

  • TreeSet 集合继承于AbstractSet,所以它是一个Set集合,具有Set的属性和方法
  • 底层的数据结构是平衡“二叉树”
  • 能够对元素按照某种规则进行“排序”,也保证元素的“唯一”。

TreeSet自带排序(按字母表排序)去重复 代码如下:

package com.ljx.set;import java.util.HashSet;
import java.util.Iterator;
import java.util.TreeSet;public class TreeSetDemo {public static void main(String[] args) {TreeSet hs=new TreeSet<>();hs.add("a");hs.add("c");hs.add("b");hs.add("a");Iterator it=hs.iterator();while(it.hasNext()) {System.out.println(it.next());}}
}

显示台结果如图:

想要排序的第一种方法 Comparable:

  • 维护性较差,也就是程序的拓展性较差
  • 实现Comparable接口,让"元素自身具备比较性"
    注意:在给元素添加比较性的时候,先判断主要条件(年龄),再判断次要条件

使用Comprable接口代码如下(按年龄进行排序):
-----------------------------------------------方法类

package com.ljx.set;
import java.util.HashSet;
public class SetDemo {public static void main(String[] args) {HashSet al=new HashSet<>();al.add(new Person("a",1));al.add(new Person("b",2));al.add(new Person("c",3));al.add(new Person("a",1));System.out.println(al.size());}
}class Person implements Comparable<Person>{ private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Person(String name, int age) {super();this.name = name;this.age = age;}public Person() {super();}@Overridepublic int hashCode() {System.out.println("来了老弟:"+this.getName());return this.getName().hashCode()+this.age;}@Overridepublic boolean equals(Object obj) {if(obj instanceof Person) {Person p=(Person)obj;System.out.println(this.getName()+"---equals---"+p.getName());return this.getName().equals(p.getName()) && this.getAge()==p.getAge();}return false;
}/*** 本方法用来定义排序的规则* int类型返回值有三类:* 1.正数代表后面的比前面的大* 2.零代表后面跟前面一样大* 3.负数代表后面的比前面的小    * this代表还没有存放到容器中的对象 o代表已经在容器中的对象*/@Overridepublic int compareTo(Person o) {  int num=this.getAge() - o.getAge();if(num==0) {return this.getName().compareTo(o.getName());}return num;  }@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + "]";}}

-----------------------------------------------实现类

package com.ljx.set;import java.util.HashSet;
import java.util.Iterator;
import java.util.TreeSet;public class TreeSetDemo {public static void main(String[] args) {TreeSet hs=new TreeSet<>();hs.add(new Person("a",1));hs.add(new Person("c",2));hs.add(new Person("b",0));hs.add(new Person("d",1));Iterator it=hs.iterator();while(it.hasNext()) {System.out.println(it.next());}}
}

-----------------------------------------------显示结果

如果以下代码没有实现Comparable接口将会…

想要排序的第二种方法 Comparator:

  • 对任意类型集合对象进行整体排序
  • 让容器具有比较性

Comparator接口代码如下(按name为主排序):

package com.ljx.set;import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.TreeSet;public class TreeSetDemo {public static void main(String[] args) {TreeSet hs=new TreeSet<>(new PersonComp());hs.add(new Person("a",1));hs.add(new Person("c",2));hs.add(new Person("b",0));hs.add(new Person("d",1));hs.add(new Person("a",3));Iterator it=hs.iterator();while(it.hasNext()) {System.out.println(it.next());}}
}
class PersonComp implements Comparator<Person>{/*** 本方法用来定义排序的规则,int类型返回值有三类:* 1.正数代表后面的比前面的大* 2.零代表后面跟前面一样大* 3.负数代表后面的比前面的小    * o1代表还没有存放到容器中的对象,o2代表已经在容器中的对象*/@Overridepublic int compare(Person o1, Person o2) {int num=o1.getName().compareTo(o2.getName());if(num==0) {return o2.getAge() - o1.getAge();}return num;}}

显示数据如下:

泛型

定义:

  • 在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个别对象。(这是当今较常见的定义)
  • 在程序编码中一些包含参数的类。其参数可以代表类或对象等等。(人们大多把这称作模板)不论使用哪个定义,泛型的参数在真正使用泛型时都必须作出指明。

用途:

  • 将运行时的错误转换到编译时的错误 如下图:
  • 提升了代码的健壮性(健壮性的意思是代码报错的概率少) 如下图:

Set集合框架(HashSet and TreeSet)相关推荐

  1. 1.4 Set集合:HashSet和TreeSet类

    Set 集合 无序的,不能包含重复的对象 Set 集合类似于一个罐子,程序可以依次把多个对象"丢进"Set 集合,而 Set 集合通常不能记住元素的添加顺序. 也就是说 Set 集 ...

  2. JavaSE Set HashSet LinkedHashSet TreeSet 集合练习

    day17目录: SetHashSetLinkedHashSetTreeSet 集合练习 17.08_集合框架(Set集合概述及特点)(掌握) A:Set集合概述及特点: 通过API查看即可 B: 案 ...

  3. java集合详解_「软帝学院」Java进阶者专栏:集合框架详解3

    软帝学院笔记Day14 集合框架(HashSet存储字符串并遍历) A:Set集合概述及特点 通过API查看即可 B:案例演示 HashSet存储字符串并遍历 HashSet hs = new Has ...

  4. java集合框架学习笔记

    思维导图 一.什么是集合 存放在java.util.*.是一个存放对象的容器. 存放的是对象的引用,不是对象本身 长度不固定 只能存放对象 二.collection接口 collection的使用 增 ...

  5. java中的集合框架

    集合,也就是容器,用于存储数据,也就是装东西的. 面向对象里包含很多容器,变量多了,用数组存起来.数组多了,用二维数组存起来.数据多了,用对象存起来.对象多了,用集合存起来. 但数组也能存对象,为什么 ...

  6. Java基础_集合框架1

    一.集合框架(体系概述) 为什么会出现集合框架(集合类)? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式. 数组和集合框架 ...

  7. Set 、HashSet、TreeSet、LinkedHashSet、EnumSet

    Set 底层原理: java中set及其子类都是由对应的Map实现的,如HashSet由HashMap实现,TreeSet由TreeMap实现等等. private static final Obje ...

  8. Java集合框架(二)—— HashSet、LinkedHashSet、TreeSet和EnumSet

    Set接口 前面已经简绍过Set集合,它类似于一个罐子,一旦把对象'丢进'Set集合,集合里多个对象之间没有明显的顺序.Set集合与Collection基本上完全一样,它没有提供任何额外的方法. Se ...

  9. 集合之Collection家族的 List接口+LinkedList+Vector+Stack及Set接口+HashSet+LinkedHashSet+TreeSet

    集合之Collection家族的 List接口+LinkedList+Vector+Stack及Set接口+HashSet+LinkedHashSet+TreeSet 一.LinkedList 1.L ...

最新文章

  1. 1024,不讲技术,来一套程序员续命操~
  2. LeetCode Count Primes
  3. 在Nginx上配置多个站点
  4. php用户登录后跳转到主页,phpmyadmin登录后跳到首页的问题
  5. AnyChat Server SDK与SDK Filter Plus有何差异?
  6. c#调用python函数_C#调用python脚本的方法步骤(2种)
  7. 直播预告 | 小米人工智能部崔世起:小爱同学全双工技术实践
  8. Fliptile (二进制压缩)
  9. 线段树优化的Dijkstra
  10. N天学习一个Linux命令之grep
  11. linux /windows 基础篇
  12. 避坑!!!Matlab中文版下载地址、详细讲解Matlab中文版的下载、安装
  13. 自学单片机能找到工作吗?能有出路吗?
  14. fan4801开关电源原理图_六款简单的开关电源电路设计,内附原理图详解
  15. 五邑大学、广东工业大学教务系统一键评教代码分享及技术简易剖析
  16. Veritas NetBackup 7.7.3 + Vistor 虚拟带库
  17. python相关参考文献_[编程]Python数据分析
  18. 无人驾驶感知篇之融合(一)
  19. SOLIDWORKS快捷键167个小技巧
  20. 【ELK】ELK菜鸟手记 (一) 环境配置+log4j日志记录——转自Master HaKu

热门文章

  1. url动态追加参数_url设置的注意事项有哪些?
  2. 中软国际2020年业绩再创新高 归母净利同比增长26.5%
  3. 升级至 vCenter Server 6.5 的最佳实践 (2147686)
  4. bootstrap表格遍历_BootStrap实现带有增删改查功能的表格(DEMO详解)
  5. su自带模型库怎么打开_SU超强外挂!建筑模型一键生成,还能任意编辑
  6. 通过样式调整input 中password text默认长度
  7. 协同办公产品好不好用,得看这 25 项指标
  8. 挑战面试编程:大整数的加、减、乘、除
  9. html5 响应式背景图
  10. WIN2008下找不到proxy的处理方法