Set集合框架(HashSet and TreeSet)
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.4 Set集合:HashSet和TreeSet类
Set 集合 无序的,不能包含重复的对象 Set 集合类似于一个罐子,程序可以依次把多个对象"丢进"Set 集合,而 Set 集合通常不能记住元素的添加顺序. 也就是说 Set 集 ...
- JavaSE Set HashSet LinkedHashSet TreeSet 集合练习
day17目录: SetHashSetLinkedHashSetTreeSet 集合练习 17.08_集合框架(Set集合概述及特点)(掌握) A:Set集合概述及特点: 通过API查看即可 B: 案 ...
- java集合详解_「软帝学院」Java进阶者专栏:集合框架详解3
软帝学院笔记Day14 集合框架(HashSet存储字符串并遍历) A:Set集合概述及特点 通过API查看即可 B:案例演示 HashSet存储字符串并遍历 HashSet hs = new Has ...
- java集合框架学习笔记
思维导图 一.什么是集合 存放在java.util.*.是一个存放对象的容器. 存放的是对象的引用,不是对象本身 长度不固定 只能存放对象 二.collection接口 collection的使用 增 ...
- java中的集合框架
集合,也就是容器,用于存储数据,也就是装东西的. 面向对象里包含很多容器,变量多了,用数组存起来.数组多了,用二维数组存起来.数据多了,用对象存起来.对象多了,用集合存起来. 但数组也能存对象,为什么 ...
- Java基础_集合框架1
一.集合框架(体系概述) 为什么会出现集合框架(集合类)? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式. 数组和集合框架 ...
- Set 、HashSet、TreeSet、LinkedHashSet、EnumSet
Set 底层原理: java中set及其子类都是由对应的Map实现的,如HashSet由HashMap实现,TreeSet由TreeMap实现等等. private static final Obje ...
- Java集合框架(二)—— HashSet、LinkedHashSet、TreeSet和EnumSet
Set接口 前面已经简绍过Set集合,它类似于一个罐子,一旦把对象'丢进'Set集合,集合里多个对象之间没有明显的顺序.Set集合与Collection基本上完全一样,它没有提供任何额外的方法. Se ...
- 集合之Collection家族的 List接口+LinkedList+Vector+Stack及Set接口+HashSet+LinkedHashSet+TreeSet
集合之Collection家族的 List接口+LinkedList+Vector+Stack及Set接口+HashSet+LinkedHashSet+TreeSet 一.LinkedList 1.L ...
最新文章
- 1024,不讲技术,来一套程序员续命操~
- LeetCode Count Primes
- 在Nginx上配置多个站点
- php用户登录后跳转到主页,phpmyadmin登录后跳到首页的问题
- AnyChat Server SDK与SDK Filter Plus有何差异?
- c#调用python函数_C#调用python脚本的方法步骤(2种)
- 直播预告 | 小米人工智能部崔世起:小爱同学全双工技术实践
- Fliptile (二进制压缩)
- 线段树优化的Dijkstra
- N天学习一个Linux命令之grep
- linux /windows 基础篇
- 避坑!!!Matlab中文版下载地址、详细讲解Matlab中文版的下载、安装
- 自学单片机能找到工作吗?能有出路吗?
- fan4801开关电源原理图_六款简单的开关电源电路设计,内附原理图详解
- 五邑大学、广东工业大学教务系统一键评教代码分享及技术简易剖析
- Veritas NetBackup 7.7.3 + Vistor 虚拟带库
- python相关参考文献_[编程]Python数据分析
- 无人驾驶感知篇之融合(一)
- SOLIDWORKS快捷键167个小技巧
- 【ELK】ELK菜鸟手记 (一) 环境配置+log4j日志记录——转自Master HaKu
热门文章
- url动态追加参数_url设置的注意事项有哪些?
- 中软国际2020年业绩再创新高 归母净利同比增长26.5%
- 升级至 vCenter Server 6.5 的最佳实践 (2147686)
- bootstrap表格遍历_BootStrap实现带有增删改查功能的表格(DEMO详解)
- su自带模型库怎么打开_SU超强外挂!建筑模型一键生成,还能任意编辑
- 通过样式调整input 中password text默认长度
- 协同办公产品好不好用,得看这 25 项指标
- 挑战面试编程:大整数的加、减、乘、除
- html5 响应式背景图
- WIN2008下找不到proxy的处理方法