复习java基础,最近会持续更新有关java集合框架的系列,和java基础的其他文章
目录
Set是Collection的子接口
Set是Collection的子接口,所以collection的所有方法,set都可以使用.
Set集合注重独一无二的特性,所以Set集合存储的元素是不重复,且无序(注:这里的无序指的是存入的顺序和取出的顺序可能不相同).
HashSet(哈希表)
哈希表存放的是哈希值,是按照哈希值来存储的,不是想List一样按照顺序存储的,所以取数据时也是按照哈希值来取元素的,元素的哈希值通过hashcode方法来获取
HashSet中怎么判断两个元素相同?
1.比较两个元素的哈希值,如果两个元素的哈希值不同,则这两个元素是不同的两个元素
2.如果两个元素的哈希值相同,则比较两个元素的equals方法,如果equals的结果是true,则两个元素是同一个元素,否则,两个元素不是同一个元素.
注:两个元素的哈希值相同,equals方法的比较结果也为true,元素是怎么存储的?
当发生这种情况时,就在同一哈希值下顺延(哈希桶),也就是哈希值一样的存在一列.
@Test
public void test1() {
Set<String> set = new HashSet<String>();
set.add("张三");
set.add("李四");
set.add("王五");
//set集合不重复
set.add("张三");
set.add("李四");
set.add("王五");
for (String object : set) {
System.out.println(object);
}
}
因为Set存储的元素不重复,重复的元素只会存储一份
TreeSet(二叉树)
1.TreeSet应用了二叉树的原理对add()的对象按照指定的顺序进行升序降序排列,加每个对象都会进行排序.
2.TreeSet的输出顺序为字典序,但是对象要进行TreeSet排序必须实现comparable接口,并重写compareTo()方法.
3.Integer和String的对象可以进行默认的TreeSet排序,已经实现了comparable接口
关于重写compare函数
- 要返回相应的值才能使TreeSet进行相应的排序
- 比较此对象和彼对象的顺序,大于,小于或者等于,分别返回正整数,负整数和零
//Integer和String的对象可以进行默认的TreeSet排序
@Test
public void test2() {
Set<String> set = new TreeSet<String>();
set.add("zhangsan");
set.add("lisi");
set.add("wangwu");
for (String object : set) {
System.out.println(object);
}
@Test
public void test3() {
Set set = new TreeSet();
set.add(new Student(1,"张三",0));
set.add(new Student(3,"李四",100));
set.add(new Student(2,"王五",30));
set.add(new Student(4,"赵六",50));
for (Object object : set) {
System.out.println(object);
}
}
//类实现了Compareable接口
class Student implements Comparable{
private int id;
private String name;
private int score;
/** * @param id * @param name * @param score */
public Student(int id, String name, int score) {
super();
this.id = id;
this.name = name;
this.score = score;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", score=" + score + "]";
}
//这里重写了compareTo方法
@Override
public int compareTo(Object o) {
Student stu = (Student)o;
return this.id-stu.id;
}
LinkedHashSet(HashSet+LinkedHashMap)
底层用LinkedHashMap实现但是又继承了HashSet和HashSet对元素的操作方法完全一致.
比HashSet多维护了一个添加顺序,但是存储顺序和添加顺序无关.
@Test
public void test4() {
Set set = new LinkedHashSet();
set.add(new Student(1,"张三",0));
set.add(new Student(3,"李四",100));
set.add(new Student(2,"王五",30));
set.add(new Student(4,"赵六",20));
for (Object object : set) {
System.out.println(object);
}
}
class Student {
private int id;
private String name;
private int score;
/** * @param id * @param name * @param score */
public Student(int id, String name, int score) {
super();
this.id = id;
this.name = name;
this.score = score;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", score=" + score + "]";
}