黑马程序员----Java基础:Set
------- android培训、java培训、期待与您交流! ----------
Set ( 无序的集合 )
Set 下分别有2个小弟 : HashSet , TreeSet
Set 特点:元素是无序的,元素不可以重复(不可以存入同一样的元素),存入跟取出的顺序不一定一致。
HashSet :底层数据结构是哈希表结构, 它是基于HashMap实现的。
特点:通过元素的 hashCode 和 equals 方法 判断元素的唯一性。
系统先调用hashCode 方法,只有hashCode相同,才会执行equals 方法,反之不执行。
因为集合存储的是对象,而对象不一定具备比较性行为,所以往往通过HashSet存入多个对象时,明明是相同的对象,结果还是存进去了。这样违背了Set 集合的特点。
因此,为了让对象自身具备比较性,我们需要通过复写对象中的 HashCode方法和 equals方法,
因为HashSet 底层就是调用这个方法来判断元素是否是同一个元素,如何相同,不写入,否则,写入。
HashSet: 示例:
import java.util.*;
class Person
{
String name;
int age;
Person(String name, int age)
{
this.name = name;
this.age = age;
}
public int hashCode() //复写hashCode方法,返回一个自定义的哈希值。
{
return name.hashCode() + age * 12;
}
public boolean equals(Object obj) //复写eqausl方法,自定义一套比较规则。
{
if(!(obj instanceof Person))
return false;
Person p = (Person) obj;
return this.name.equals(p.name) && this.age == p.age;
}
public String toString()
{
return "Name:"+name+" Age:"+age;
}
}
class HashSetDemo
{
public static void main(String[] args)
{
HashSet hs = new HashSet();
hs.add(new Person("张三",18));
hs.add(new Person("张三",18));
hs.add(new Person("李四",20));
Iterator it = hs.iterator();
while(it.hasNext())
{
Person p = (Person) it.next();
System.out.println(p.toString());
}
}
}
TreeSet:底层数据结构是二叉树。
特点:可以对元素进行排序,保证元素的唯一性的依据:通过comparTo 方法 return 0
TreeSet 集合排序的两种方式 :
第一种:让元素自身具备比较性。
方法:元素实现 Comparable 接口,并且复写里面的 comparTo 方法 。
第二种:当元素自身不具备比较性,或者具备的比较性不是所需要的,这时可以让集合自身具备比较性。
方法:定义一个类,实现 Comparator 接口,并且复写里面的 compare 方法,使用方式如下
注意:根据 comparTo方法的返回值为负整数、零或正整数,来断定对象是小于、等于还是大于指定对象。
第一种排序方式:
import java.util.*;
class Person implements Comparable //实现Comparable 接口
{
String name;
int age;
Person(String name, int age)
{
this.name = name;
this.age = age;
}
public int compareTo(Object obj) //复写compartTo方法,制定一套排序方案
{
if(!(obj instanceof Person))
throw new RuntimeException("不是Psrson对象!");
Person p = (Person) obj;
if(this.age > p.age)
return 1;
if(this.age == p.age)
{
return this.name.compareTo(p.name);
}
return -1;
}
public String toString()
{
return "Name:"+name+" Age:"+age;
}
}
class HashSetDemo
{
public static void main(String[] args)
{
TreeSet ts = new TreeSet();
ts.add(new Person("张三",18));
ts.add(new Person("张四",18));
ts.add(new Person("李四",20));
Iterator it = ts.iterator();
while(it.hasNext())
{
Person p = (Person) it.next();
System.out.println(p.toString());
}
}
}
第二种排序方式:
[java] view plaincopy
import java.util.*;
class Person
{
String name;
int age;
Person(String name, int age)
{
this.name = name;
this.age = age;
}
public String toString()
{
return "Name:"+name+" Age:"+age;
}
}
class MyCompare implements Comparator
{
public int compare(Object o1, Object o2)
{
Person p1 = (Person) o1;
Person p2 = (Person) o2;
int name = p1.name.compareTo(p2.name);
if(name == 0)
{
if(p1.age > p2.age)
return 1;
if(p1.age == p2.age)
return 0;
return -1;
}
return name;
}
public static void main(String[] args)
{
TreeSet ts = new TreeSet(new MyCompare());
ts.add(new Person("张三",18));
ts.add(new Person("王五",17));
ts.add(new Person("李四",20));
Iterator it = ts.iterator();
while(it.hasNext())
{
Person p = (Person) it.next();
System.out.println(p.toString());
}
}
}
转载于:https://blog.51cto.com/arctictern/1660056
黑马程序员----Java基础:Set相关推荐
- 黑马 程序员——Java基础---流程控制
黑马程序员--Java基础---流程控制 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 一.概述 Java提供了两种基本的流程控制结构:分支结构 ...
- 黑马 程序员——Java基础---IO(下)
黑马程序员--Java基础---IO(下) ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 一.概述 Java除了基本的字节流.字符流之外,还提供 ...
- 黑马程序员--Java基础加强篇
开发工具使用 --------------------------------------------------------------------------------------------- ...
- 黑马程序员-Java基础:面向对象(上)
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.面向对象概述 当需求单一,或者简单时,我们一步一步去操作没问题,并且效率也挺高.可随着需求的 ...
- 黑马程序员-Java基础知识预备之Java流程控制与数组
-------- android培训.java培训.期待与您交流!---------- 本博文涉及的主要内容如下: if语句 switch语句 循环结构 循环结构的控制 数组类型 数组在内存中的运行机 ...
- 黑马程序员—java基础总结1
------- android培训.java培训.期待与您交流! ---------- 一:java概述: 1991 年Sun公司的James Gosling等人开始开发名称为 Oak 的语言,希望用 ...
- 黑马程序员 — JAVA基础 — 内部类、异常
-----------android培训.java培训.java学习型技术博客.期待与您交流!------------ 一.内部类 1.概念: 把类定义在另一个类的内部,该类就被称为内部类. Eg:把 ...
- 黑马程序员-Java基础加强之枚举
--------- android培训.java培训.期待与您交流!---------- 一.为什么要有枚举? 问题:要定义季节.星期向或性别的变量,该怎么定义?假设用1-4分别表示春.夏.秋.冬,但 ...
- 黑马程序员-Java基础:设计模式总结
--Java培训.Android培训.iOS培训..Net培训.期待与您交流! -- Java基础部分设计模式 一.设计模式概述 设计模式(Design pattern)是一套被反复使用.多数人知晓的 ...
- 黑马程序员----------------java基础-----------------Map集合
------- <a href="http://www.itheima.com" target="blank">android培训</a ...
最新文章
- 服务差,信号不好真的是联通用户下滑的原因吗?
- linux中bash的功能主要有,Linux系统中的Bash功能的介绍
- 放置奇兵 新 粉石墨
- Parent属性也可释放子对象
- 终于看腻了黄色!让它五彩斑斓起来!
- 平衡二叉树AVL插入
- 转:获得数据库自增长ID(ACCESS)与(SQLSERVER)
- 什么是元宇宙?如果你想参与进Metaverse中去,应该采用什么策略?
- Android 通知栏用法例子
- 通过java下载B站视频
- 实用主义当道——GitHub 热点速览 Vol.48
- 软件工程概述思维导图总结(二)
- (附源码)php二手服装网站 毕业设计 201711
- 【知识笔记】Debugging
- Redhat7 yum安装有问题+yum无法使用+There are no enabled repos. Run “yum repolist all“ to see the repos you ha
- 因为专注所以成功 agile新版北京发布
- windows下系统dll文件大全
- Datastage,Informatica,Kettle
- NO.25-SAP S4 HANA Cloud EX版本介绍
- TempDB 收缩方法