TreeSet是有序不可重复集,具有以下特点:
1、数据会按自然排序(可以理解为从小到大排序)
2、不可存储null
3、数据不可重复
4、非线程安全
数字会从小到大进行排序—–例子:
package com.ckinghan.collectionDemo;
import java.util.Date;
import java.util.Set;
import java.util.TreeSet;
public class TreeSetDemo {
/**
*
* @描述:TreeSet集合的特点:
* 1、数据会按自然排序(可以理解为从小到大排序)
* 2、不可存储null
* 3、数据不可重复
* 4、非线程安全
*
* @时间:2017年5月9日22:41:41
* @注意:
* @作者:Ckinghan
* @param args
*/
public static void main(String[] args) {
/**
* 创建一个数字类型的treeSet有序不重复集并赋Integer类型的值
* 查看集合的结果,会按从小到大的顺序的排序
*/
Set<Integer> set = new TreeSet<>();
set.add(1);
set.add(9);
set.add(4);
set.add(2);
set.add(5);
set.add(8);
set.add(3);
set.add(1);
System.out.println(set);
}
}
执行结果:
[1, 2, 3, 4, 5, 8, 9]
从结果上可以发现,数值“1”分明存储了两次,却只能留存一个,这说明TreeSet不能保存重复的值,并且结果是从小到大排序的
字符串会将每个字符的ACIIS拿出来进行对比并排序—–例子:
package com.ckinghan.collectionDemo;
import java.util.Date;
import java.util.Set;
import java.util.TreeSet;
public class TreeSetDemo {
/**
*
* @描述:TreeSet集合的特点:
* 1、数据会按自然排序(可以理解为从小到大排序)
* 2、不可存储null
* 3、数据不可重复
* 4、非线程安全
*
* @时间:2017年5月9日22:41:41
* @注意:
* @作者:Ckinghan
* @param args
*/
public static void main(String[] args) {
/**
* 创建一个String类型的TreeSet集合
* 因为String实现了Comparable接口,所以可以在TreeSet集合存储并排序
*/
Set<String> set2 = new TreeSet<String>();
set2.add("wod");
set2.add("abe");
set2.add("abc");
System.out.println(set2);
}
}
执行结果:
[abc, abe, wod]
可以看出,字符串是按字母从小到大排序的。
对于程序员所写的类,如果没有实现Comparable接口,是无法放到treeSet集合中的,示例代码如下:
package com.ckinghan.collectionDemo;
import java.util.Date;
/**
* @author:Ckinghan
* @date:2017年5月9日22:36:28
* @描述:测试实体类,用以实现Comparable接口,在treeSet集合中进行排序,本次代码没有实现Comparable接口
*/
public class Enity {
public Integer id;
public String tableName;
public Date createTime;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTableName() {
return tableName;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Enity() {
super();
}
public Enity(Integer id, String tableName, Date createTime) {
super();
this.id = id;
this.tableName = tableName;
this.createTime = createTime;
}
}
测试代码如下:
package com.ckinghan.collectionDemo;
import java.util.Date;
import java.util.Set;
import java.util.TreeSet;
public class TreeSetDemo {
/**
*
* @描述:TreeSet集合的特点:
* 1、数据会按自然排序(可以理解为从小到大排序)
* 2、不可存储null
* 3、数据不可重复
* 4、非线程安全
*
* @时间:2017年5月9日22:41:41
* @注意:
* @作者:Ckinghan
* @param args
*/
public static void main(String[] args) {
/**
* 如果类没有实现Comparable接口,是无法存储在treeSet集合中的
*/
Set<Enity> set3 = new TreeSet<>();
set3.add(new Enity(1, "employeeInfo", new Date()));
set3.add(new Enity(2, "employeeInfo", new Date()));
set3.add(new Enity(3, "employeeInfo", new Date()));
set3.add(new Enity(4, "employeeInfo", new Date()));
set3.add(new Enity(1, "employeeInfo", new Date()));
System.out.println(set3);
}
}
运行结果如下 :
Exception in thread "main" java.lang.ClassCastException: com.ckinghan.collectionDemo.Enity cannot be cast to java.lang.Comparable
at java.util.TreeMap.compare(TreeMap.java:1294)
at java.util.TreeMap.put(TreeMap.java:538)
at java.util.TreeSet.add(TreeSet.java:255)
at com.ckinghan.collectionDemo.TreeSetDemo.main(TreeSetDemo.java:55)
程序员自己定义 的类,要实现了Comparable接口后方可存储到treeSet集合中,示例代码如下 :
package com.ckinghan.collectionDemo;
import java.util.Date;
/**
* @author:Ckinghan
* @date:2017年5月9日22:36:28
* @描述:测试实体类,用以实现compareTo接口,在treeSet集合中进行排序
*/
public class Enity implements Comparable<Enity>{
public Integer id;
@Override
public String toString() {
return "Enity [id=" + id + ", tableName=" + tableName + ", createTime=" + createTime + "]";
}
public String tableName;
public Date createTime;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTableName() {
return tableName;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Enity() {
super();
}
public Enity(Integer id, String tableName, Date createTime) {
super();
this.id = id;
this.tableName = tableName;
this.createTime = createTime;
}
/**
* 重写compareTo方法,否则无法存储到treeSet集合中
*/
@Override
public int compareTo(Enity o) {
//对比是否this大于o
int val = this.id - o.id;
//如果两者相同
if(val == 0){
//判断tableName是否为空,如果不为空,则判断两者的tableName是否相等
if(this.tableName != null ){
//获取对比的值
val = this.tableName.compareTo(o.tableName);
//如果两都的tableName相等,则判断两都的createTime是否相等
if(val == 0){
//注意:这里不建议使用getTime()再相减,因为如果时间相差过大,可能超过int的最大值,即使不大于int的最大值,最后还是要再强转为int
val = this.createTime.compareTo(o.createTime);
}
}
}
return val;
}
}
测试类代码:
package com.ckinghan.collectionDemo;
import java.util.Date;
import java.util.Set;
import java.util.TreeSet;
public class TreeSetDemo {
/**
*
* @描述:TreeSet集合的特点:
* 1、数据会按自然排序(可以理解为从小到大排序)
* 2、不可存储null
* 3、数据不可重复
* 4、非线程安全
*
* @时间:2017年5月9日22:41:41
* @注意:
* @作者:Ckinghan
* @param args
*/
public static void main(String[] args) {
/**
* 如果类没有实现compareTo接口,是无法存储在treeSet集合中的
*/
Set<Enity> set3 = new TreeSet<>();
set3.add(new Enity(1, "employeeInfo", new Date()));
set3.add(new Enity(2, "employeeInfo", new Date()));
set3.add(new Enity(3, "employeeInfo", new Date()));
set3.add(new Enity(4, "employeeInfo", new Date()));
set3.add(new Enity(1, "employeeInfo", new Date()));
/**
* 循环打印set3集合中的内容
*/
for(Enity enity : set3){
System.out.println(enity);
}
}
}
执行结果:
Enity [id=1, tableName=employeeInfo, createTime=Tue May 09 23:16:06 CST 2017]
Enity [id=2, tableName=employeeInfo, createTime=Tue May 09 23:16:06 CST 2017]
Enity [id=3, tableName=employeeInfo, createTime=Tue May 09 23:16:06 CST 2017]
Enity [id=4, tableName=employeeInfo, createTime=Tue May 09 23:16:06 CST 2017]
注意:我添加了两个ID为1的数据,结果却出现了一个,应该是最终的返回值 为0影响的,但我也不敢肯定,因为在添加第一条数据时,返回的也是0。还需要再查询资料才能确定。
找到了一篇文章 ,它说返加0时确实会做为是否重复的参考标准之一,但为什么第一个添加的值返回的也是0,去可以添加呢?还要找相关的资料才行
参考资料一:http://blog.csdn.net/yxb_yingu/article/details/52194988