TestSet

package com.aff.coll;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.TreeSet; import org.junit.Test; /*
Collection接口
|----Set接口:存储无序的,不可重复的元素,Set中常有的方法都是Collection下定义的
|----HashSet(主要实现类)
|----LinkedHashSet 使用于频繁的遍历元素,较少的添加元素
|----TreeSet
*/
public class TestSet {
/*
1.set存储的元素是无序的,不可重复的,无序性:无序性 != 随机性 真正的无序性,指的是元素在底层存储的位置是无序的
2.不可重复性:当Set中添加相同的元素的时候,后面的这个元素添加不进去
3.Set中元素存储方式:使用哈希算法。
当向Set中添加对象时,首先调用此对象所在类的hashCode()方法,
计算此对象的哈希值,此哈希值决定Set中的存储位置,若此位置之前
没有对象存储,则这个对象直接存储到此位置。若此位置已有对象存储,
在通过equals()比较这两个对象是否相同。如果相同,后一个对象就不能再添加进来
万一返回false,都存储(不建议如此)
要求:hashCode()方法要与equals()方法一致。
说明:要求添加进Set中的元素所在的类,一定要重写equals()和hashCode()方法,进而保证Set中元素不可重复性 */
//HashSet()
@Test
public void testHashSet() {
Set set = new HashSet();
set.add(123);
set.add(456);
set.add(new String("AA"));
set.add(new String("BB"));
set.add(null);
Person p1 = new Person("GG", 23);
Person p2 = new Person("GG", 23);
set.add(p1);
set.add(p2);
System.out.println(set.size());//
System.out.println(set);// [AA, BB, null, 456, 123]
// 由于HashSet重写了toString,方法所以也能出来
} //LinkedHashSet
/*
LinkedHashSet:使用链表维护了一个添加进集合中的顺序,导致我们遍历LinkedHashSet集合元素是
是按照添加进去的顺序遍历的。 LinkedHashSet插入性能略低于HashSet,但在迭代访问Set里的全部元素时有很好的性能
*/
@Test
public void testLinkedSet() {
Set set = new LinkedHashSet();
set.add(123);
set.add(456);
set.add(new String("AA"));
set.add(new String("BB"));
set.add("BB");
set.add(null); Iterator iterator = set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
/*
123
456
AA
BB
null
*/
}
System.out.println(set.size());//
System.out.println(set);//[123, 456, AA, BB, null]
} //TreeSet
/*
1.向TreeSet中添加的元素必须是同一个类
2.可以按照添加进集合中的元素的指定的顺序遍历,像String,包装类等默认按照从小到大顺序遍历
3.当向TreeSet中添加自定义类的对象时
有两种排序方法:①自然排序:要求自定义类实现java.lang.Comparable接口,
并重写其compareTo(Object obj)抽象方法
在此方法中,指明按照自定义的哪个属性进行排序的。
②定制排序
5.想TreeSet中添加元素时,首先按照comparTo()进行比较,一旦返回 0 ,虽然仅是两个对象的此属性相同,
但是程序会认为这两个对象时相同的,进而后一个对象就不能添加进来
注意:compartTo()与hashCode以及equals()三者保持一致 */
//TreeSet的自然排序
@Test
public void testTreeSet1() {
Set set = new TreeSet();
// set.add(new String("AA"));
// set.add(new String("AA"));
// set.add("BS");
// set.add("SS");
// set.add("CS");
set.add(new Person("CC", 21));
set.add(new Person("MM", 25));
set.add(new Person("GG", 23));
set.add(new Person("LL", 28));
set.add(new Person("LL", 24)); /*Iterator iterator = set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next()); //AA BS CS SS
}*/
for(Object str:set){
System.out.println(str); //AA BS CS SS
}
} //TreeSet的定制排序
@Test
public void testTreeSet2(){
//1.创建一个实现Comparator接口的类对象
Comparator com = new Comparator() {
//向TreeSet中添加Customer类的对象,在此compare()方法中,指明是按照Customer的哪个属性排序的
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof Customer && o2 instanceof Customer){
Customer c1 = (Customer)o1;
Customer c2 = (Customer)o2;
int i = c1.getId().compareTo(c2.getId());
if(i == 0){
return c1.getName().compareTo(c2.getName());
}
return i;
}
return 0;
}
};
//2.将此对象作为形参传递给TreeSet的构造器中
TreeSet set = new TreeSet(com);
//3.向TreeSet中添加Comparator接口中的compare方法涉及的类的对象。
set.add(new Customer("AA",1002));
set.add(new Customer("CC",1005));
set.add(new Customer("GG",1003));
set.add(new Customer("DD",1004));
set.add(new Customer("HH",1002));
for(Object str: set){
System.out.println(str);
}
}
}

Person

package com.aff.coll;

public class Person implements Comparable {
private String name;
private Integer age; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public Person(String name, Integer age) {
super();
this.name = name;
this.age = age;
} @Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
} @Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((age == null) ? 0 : age.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
} @Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (age == null) {
if (other.age != null)
return false;
} else if (!age.equals(other.age))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
} // 当向TreeSet中添加Person类的对象时,依据此方法,确定按照哪个属性排列
@Override
public int compareTo(Object o) {
if (o instanceof Person) {
Person p = (Person) o;
//return this.name.compareTo(p.name);//this.name/ String 类型的已经重写过了CompareTo方法
//return this.age.compareTo(p.age);//想从大到小 只需要前面加一个 " - "
int i = this.name.compareTo(p.name);
if(i == 0){//名字相同再比较年龄
return this.age.compareTo(p.age);
}else{
return i;
}
}
return 0;//属性一样的,添加不进去
}
}

Customer

package com.aff.coll;

public class Customer {
private String name;
private Integer id; public Customer() {
super();
} public Customer(String name, Integer id) {
super();
this.name = name;
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} @Override
public String toString() {
return "Customer [name=" + name + ", id=" + id + "]";
} @Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
} @Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Customer other = (Customer) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
} }

Set接口中的HashSet,LinkedHashSet,TreeSet的更多相关文章

  1. java集合框架之几种set(HashSet LinkedHashSet TreeSet )

    参考http://how2j.cn/k/collection/collection-sets/691.html#nowhere HashSet LinkedHashSet TreeSet HashSe ...

  2. HashSet,LinkedHashSet,TreeSet的区别

    Set接口Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false.Set判断两个对象相同不是使用==运算符,而是根据equals方法.也就是说,只要两个对象用eq ...

  3. JDK源码学习笔记——HashSet LinkedHashSet TreeSet

    你一定听说过HashSet就是通过HashMap实现的 相信我,翻一翻HashSet的源码,秒懂!! 其实很多东西,只是没有静下心来看,只要去看,说不定一下子就明白了…… HashSet 两个属性: ...

  4. HashSet LinkedHashSet TreeSet 分析

    1.HashSet分析 hashset 底层是hash表,就是hashMap,是无序的,唯一的.也就是说,它的底层其实就是一个HashMap  key 值的组成值.所以具有唯一性. public Ha ...

  5. Java 基础 - Set接口 及其实现类HashSet/LinkedHashSet/TreeSet

    笔记: /**Set接口 及其实现类 * 公用操作同Collection: * * ①size(),clear()②isEmpty(),③contains(),④add()方法 和remove()方法 ...

  6. HashSet 与TreeSet和LinkedHashSet的区别

    Set接口      Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false.      Set判断两个对象相同不是使用==运算符,而是根据equals方法.也就 ...

  7. HashSet vs TreeSet vs LinkedHashSet

    使用Set集合的主要原因是因为Set集合里面没有重复的元素.Set集合有三个常见的实现类:HashSet,TreeSet,LinkedHashSet.什么时候,选择哪一个使用非常重要.简单的说,如果你 ...

  8. Set集合——HashSet、TreeSet、LinkedHashSet(2015年07月06日)

    一.Set集合不同于List的是: Set不允许重复 Set是无序集合 Set没有下标索引,所以对Set的遍历要通过迭代器Iterator 二.HashSet 1.HashSet由一个哈希表支持,内部 ...

  9. Java集合详解7:HashSet,TreeSet与LinkedHashSet

    今天我们来探索一下HashSet,TreeSet与LinkedHashSet的基本原理与源码实现,由于这三个set都是基于之前文章的三个map进行实现的,所以推荐大家先看一下前面有关map的文章,结合 ...

  10. 【java提高】---HashSet 与TreeSet和LinkedHashSet的区别

    HashSet 与TreeSet和LinkedHashSet的区别 今天项目开发,需要通过两个条件去查询数据库数据,同时只要满足一个条件就可以取出这个对象.所以通过取出的数据肯定会有重复,所以要去掉重 ...

随机推荐

  1. Nginx模块开发(5)————开发简单的HTTP过滤模块

    该模块可实现如下的功能,在浏览器输入http://你的IP/lcw.text,能够读出你在根目录下创建的lcw.txt里面的内容,并在前面加上一句字符串where there is a will,th ...

  2. Scrapy爬虫快速入门

    安装Scrapy Scrapy是一个高级的Python爬虫框架,它不仅包含了爬虫的特性,还可以方便的将爬虫数据保存到csv.json等文件中. 首先我们安装Scrapy. pip install sc ...

  3. 最短路径树:Dijstra算法

    一.背景 全文根据<算法-第四版>,Dijkstra算法.我们把问题抽象为2步:1.数据结构抽象   2.实现 二.算法分析 2.1 数据结构 顶点+边->图.注意:Dijkstra ...

  4. 初识Matlab及界面认识

    通过本章节的学习,需要掌握: MATLAB语言是什么 MATLAB在互联网语言中地位与应用 目标:利用MATLAB进行问题求解的基本规律.够使用MATLAB作为专业应用的工具. 1.什么叫计算? (1 ...

  5. 《C程序设计语言》 练习2-3

    问题描述 < class="title-article"> 练习2-3 编写函数htoi(s),把由16进制数字组成的字符串(包含可选的前缀0X或0x)转换成与之等价的 ...

  6. Exception in thread "main" java.lang.NoSuchMethodError: scala.Predef$.wrapRefArray([Ljava/lang/Object;)Lscala/collection/mutable/WrappedArray

    我是在用akka框架做简单的一个聊天,然而出师不利,刚开始学就遇到这个问题 遇事不决问百度,百度给出的结果是spark中scala版本和你使用的scala的版本不一致,所导致的错误 我用的是akka, ...

  7. C# 判断文件格式的一些总结

    前提概述: 项目中 经常会有上传图片的地方  有的时候需要对图片类型做一些要求   这个时候就需要一些判断   虽然前段上传的时候可以去做类型的限制  或者后台接受的时候从file的type 中获取图 ...

  8. 【Flink】使用之前,先简单了解一下Flink吧!

    目录 Flink简单介绍 概述 无边界数据流和有边界数据流 技术栈核心组成 架构体系 重要角色 Flink与Spark架构概念转换 Flink简单介绍 概述    在使用Flink之前,我们需要大概知 ...

  9. 【HBase】HBase与MapReduce集成——从HDFS的文件读取数据到HBase

    目录 需求 步骤 一.创建maven工程,导入jar包 二.开发MapReduce程序 三.结果 需求 将HDFS路径 /hbase/input/user.txt 文件的内容读取并写入到HBase 表 ...

  10. Owin Katana 的底层源码分析

    最近看了一下开源项目asp.net katana,感觉公开的接口非常的简洁优雅,channel 9 说是受到node.js的启发设计的,Katana是一个比较老的项目,现在已经整合到asp.net c ...