Set

Set是不包含重复元素的集合。更正式地,集合不包含一对元素e1e2,使得e1.equals(e2),并且最多一个空元素

  无索引,不可以重复,无序(存取不一致)

Set接口除了继承自Collection接口的所有构造函数以及add,equalshashCode方法外,增加了其他方法


HashSet

此类实现Set接口,由哈希表(实际为HashMap实例)支持。 对集合的迭代次序不作任何保证; 特别是,它不能保证此顺序在一段时间内保持不变。 这个类允许使用null元素。

HashSet 保证存储数据唯一的方法:

  • HashCode方法给每个元素计算数值并进行比较
  • 当 HashCode数值一样时,会调用 equals 方法进行比较


LinkedHashSet

底层是链表实现的,是 Set 集合中唯一一个能保证存取顺序一致的集合对象

因为是 HashSet 的子类,所以也能保证元素唯一,与 HashSet 原理一样


TreeSet(重要)

TreeSet 集合是用来对 对象进行排序的,可以指定一个顺序,也可以保证元素的唯一

TreeSet 存储的方法是采用了Tree 二叉树。保证元素唯一的原理是其中用到了 CompareTo()  方法进行比较,小的返回负数,存储在二叉树的左边,大的返回整数,存储在右边,相等返回0,不存储。

所以当compareTo 方法返回0的时候集合中只有一个元素

           返回正数的时候集合会怎么存怎么取,顺序存取

           返回负数的时候集合会倒序存储

更多TreeSet集合相关知识见这篇博客 :

JavaSE基础 TreeSet集合(红黑树数据结构)

代码示例

学生类

package com.gaoyang.set;

public class Student {
private String name;
private int chinese;
private int math;
private int english;
private int sum; public Student() {
super();
// TODO Auto-generated constructor stub
} public Student(String name, int chinese, int math, int english) {
super();
this.name = name;
this.chinese = chinese;
this.math = math;
this.english = english;
this.sum = this.chinese + this.math + this.english ;
} public int getSum() {
return sum;
} @Override
public String toString() {
return "Student " + name + " : " + "chinese=" + chinese + ", math=" + math + ", english="
+ english + ", sum= "+ sum ;
} }

 操作代码

package com.gaoyang.set;

import java.util.Comparator;
import java.util.Scanner;
import java.util.TreeSet; public class test_TreeSet { public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
System.out.println("请输入学生姓名成绩,格式为:姓名,语文成绩,数学成绩,英语成绩");
TreeSet<Student> ts = new TreeSet<>(new Comparator<Student>() { @Override
public int compare(Student s1, Student s2) {
int num = s2.getSum() - s1.getSum();
return num == ? : num;
}
}); while(ts.size() < ) {
String line = sc.nextLine();
String[] arr = line.split(",");
int chinese = Integer.parseInt(arr[]);
int math = Integer.parseInt(arr[]);
int english = Integer.parseInt(arr[]);
//存入集合中
ts.add(new Student(arr[],chinese, math, english)); } System.out.println("排序后的学生成绩");
for (Student student : ts) {
System.out.println(student);
}
}
}

最新文章

  1. Arduino101学习笔记(二)&mdash;&mdash; 一些注意的语法点
  2. loopback 04
  3. [css]【转载张鑫旭】我是如何对网站CSS进行架构的
  4. SQL Server的各种表
  5. java执行时的两个常见问题(无法加载主类)
  6. 用Rufus来制作Windows10的U盘安装盘
  7. Bzoj-2005 能量采集 gcd,递推
  8. 向RichTextBox控件不停的AppendText数据时,如何把光标的焦点始终显示到最后
  9. 实验二:基于mykernel实现的时间片轮转调度
  10. Swift - 类型嵌套(以扑克牌结构体为例)
  11. 查找一个数组中最小的前n项
  12. iOS Storyboard创建APP 的国际化操作
  13. jenkins 每个月1号到7号 一天执行一次
  14. JavaScript各种继承方式和优缺点
  15. js 学习之路5:使用js在网页中添加水印
  16. jersey+maven构建restful服务
  17. js考察this,作用域链和闭包
  18. Linux基础命令---tail显示文本
  19. [Android 开发教程(1)]-- Saving Data in SQL Databases
  20. GPUImage简单滤镜使用(二)

热门文章

  1. WPF导出发布安装包,无法验证发行者解决办法
  2. Django【第22篇】:基于Ajax实现的登录
  3. AGC014做题记录
  4. CF547E Mike and Friends
  5. angularjs表单注册--两次密码验证
  6. JS循环结构
  7. 层定位layer
  8. android 启动默认的邮件客户端,多附件的问题
  9. 3D Computer Grapihcs Using OpenGL - 03 OpenGL Buffer Data
  10. 使用chooseImage上传图片,不压缩,使用原图