Java基础_Set集合
2021-07-14 22:07
标签:err name obj 添加 collect tag -- 使用 length 2.HashSet (2).为什么HashSet存储的时候不保证其唯一性 添加的步骤: 按照方法的步骤来说: 代码: (1).LinkedHashSet:底层数据结构是由哈希表和链表组成。 (2).代码实现 4.TreeSet类 (1).TreeSet类能够对元素按照某一种规则进行排序,并且元素唯一。 (2).排序的俩种方式: A:你没有告诉我们该如何排序? 代码实现 //无参 } public void setName(String name) { for(Student s:tsSet){ 说明 A:自然排序(元素自己具备比较性),按照元素自身特性排序 B:比较器排序(集合具备比较性),有集合内部决定排序 @Override //无参 } //使用匿名内部类代码如下,这一个时候不需要定义外部类(实际就是换一种方法实现而已): for(Student s:tsSet){ } Java基础_Set集合 标签:err name obj 添加 collect tag -- 使用 length 原文地址:https://www.cnblogs.com/nwxayyf/p/9537704.html
Set集合
1.概述
Collection
list集合:有序(存储和取出的顺序一致),可重复.
Set集合:无序(存储顺序和取出不一致),唯一
(1).概述:HashSet不保证set的迭代顺序,作为继承父类接口的Set()的实现方法,其中的元素具有唯一性。
我们通过查看add()方法的源码,我们知道这一个方法底层依赖于俩个方法:hashCode()和equals().
首先比较哈希值
如果相同,继续走,比较地址值或者是走equals()
如果不同,直接添加到集合中
首先看hashCode()值是否相同
相同:继续走equals()方法
返回 true:说明元素重复,就不添加
返回 false:说明元素不重复,就添加
不相同:就直接把元素添加到集合
如果类没有重写这俩个方法,默认是引用Object()里面的方法,一般是可以相同的,而String类重写了hashCode()和equals()方法,所以
它就会把内容相同的字符串去掉,只留下一个。
public class Test {
public static void main(String[] args) {
HashSet
hs.add("hello");
hs.add("world");
hs.add("java");
hs.add("world");
for(String s:hs){
System.out.println(s);
}
}
}
//输出结果
world
java
hello
3.LinkedHashSet类
哈希表保证数据的唯一性。
链表保证元素的有序。(取出来和存储是一致的)
public class Test {
public static void main(String[] args) {
LinkedHashSet
hsHashSet.add("hello");
hsHashSet.add("world");
hsHashSet.add("java");
hsHashSet.add("world");
hsHashSet.add("java");
for(String s:hsHashSet){
System.out.println(s);
}
}
}
//输出结果:
hello
world
java
自然排序
比较器排序(强行对整体进行排序)
(3).TreeSet类存储自定义对象(自定义排序)
按照年龄大小进行排序
B:元素什么情况唯一,你也没有告诉我?
成员变量值相同即认为是同一个元素
C:要实现自定义排序需要做哪一些?
显示自然排序接口:Comparable
重写compareTo(){
}
学生类:
public class Student implements Comparable
//学生名字
private String name;
//年龄
private int age;
public Student(){
//带参构造
public Student(int age, String name) {
super();
this.age=age;
this.name=name;
}
public String getName() {
return name;
}
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(Student s) {
//比较年龄,进行大小顺序
int num=this.age -s.age;
//年龄大小是否成立并查看俩个的名字是否相等
int num2=num==0?this.name.compareTo(s.name):num;
//满足俩个条件才返回
return num2;
}
}
//测试类
public class Test {
public static void main(String[] args) {
TreeSet
Student s1=new Student(12,"胖子");
Student s2=new Student(12,"胖子");
Student s3=new Student(13,"瘦子");
Student s4=new Student(14,"张三");
Student s5=new Student(15,"李四");
tsSet.add(s1);
tsSet.add(s2);
tsSet.add(s3);
tsSet.add(s4);
tsSet.add(s5);
System.out.println(s.getName()+"----"+s.getAge());
}
}
}
//输出结果
胖子----12
瘦子----13
张三----14
李四----15
@Override
public int compareTo(Student arg0) {
// TODO Auto-generated method stub
return 0;
return 1;
return -1;
}
//return 0:表示在存储的时候,每一个都和根节点相同,就只会存储一个元素。
//return 1:这里面表示在存储的时候默认把每一个元素都比根节点大,这一个时候就表示是使用又节点的情况
一般需要返回什么,这一个是我们自己需要自定义的。
(4).TreeSet比较器排序
让元素属性类实现自然排序接口Comparable
让集合父的构造方法接受一个比较器的子类对象Comparator
代码实现
//自定义外部类
public class MyComparator implements Comparator
public int compare(Student s1, Student s2) {
//对传递过来的俩个对象的进行比较
//比较名字长度
int num=s1.getName().length()-s2.getName().length();
//比较名字内容
int num1=num==0?s1.getName().compareTo(s2.getName()):num;
//比较年龄
int num2=num1==0?s1.getAge()-s2.getAge():num1;
return num2;
}
}
//学生类
public class Student {
//学生名字
private String name;
//年龄
private int age;
public Student(){
//带参构造
public Student(int age, String name) {
super();
this.age=age;
this.name=name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
//测试类
public class Test {
public static void main(String[] args) {
//使用外部类方式,同时也可以使用匿名内部类
TreeSet
Student s1=new Student(12,"胖子1");
Student s2=new Student(12,"胖子1");
Student s3=new Student(13,"瘦子");
Student s4=new Student(14,"张三");
Student s5=new Student(15,"王二麻子");
tsSet.add(s1);
tsSet.add(s2);
tsSet.add(s3);
tsSet.add(s4);
tsSet.add(s5);
for(Student s:tsSet){
System.out.println(s.getName()+"----"+s.getAge());
}
}
}
//输出结果:
张三----14
瘦子----13
胖子1----12
王二麻子----15
public class Test {
public static void main(String[] args) {
//使用外部类方式,通知也可以使用匿名内部类
TreeSet
@Override
public int compare(Student s1, Student s2) {
//对传递过来的俩个对象的进行比较
//比较名字长度
int num=s1.getName().length()-s2.getName().length();
//比较名字内容
int num1=num==0?s1.getName().compareTo(s2.getName()):num;
//比较年龄
int num2=num1==0?s1.getAge()-s2.getAge():num1;
return num2;
}
});
Student s1=new Student(12,"胖子1");
Student s2=new Student(12,"胖子1");
Student s3=new Student(13,"瘦子");
Student s4=new Student(14,"张三");
Student s5=new Student(15,"王二麻子");
tsSet.add(s1);
tsSet.add(s2);
tsSet.add(s3);
tsSet.add(s4);
tsSet.add(s5);
System.out.println(s.getName()+"----"+s.getAge());
}
}
上一篇:Python装饰器
下一篇:Swift中"#"的用法