Java基础_Set集合

2021-07-14 22:07

阅读:437

标签:err   name   obj   添加   collect   tag   --   使用   length   


Set集合


1.概述
Collection
list集合:有序(存储和取出的顺序一致),可重复.
Set集合:无序(存储顺序和取出不一致),唯一

2.HashSet
(1).概述:HashSet不保证set的迭代顺序,作为继承父类接口的Set()的实现方法,其中的元素具有唯一性。

(2).为什么HashSet存储的时候不保证其唯一性
我们通过查看add()方法的源码,我们知道这一个方法底层依赖于俩个方法:hashCode()和equals().

添加的步骤:
首先比较哈希值
如果相同,继续走,比较地址值或者是走equals()
如果不同,直接添加到集合中

按照方法的步骤来说:
首先看hashCode()值是否相同
相同:继续走equals()方法
返回 true:说明元素重复,就不添加
返回 false:说明元素不重复,就添加
不相同:就直接把元素添加到集合
如果类没有重写这俩个方法,默认是引用Object()里面的方法,一般是可以相同的,而String类重写了hashCode()和equals()方法,所以
它就会把内容相同的字符串去掉,只留下一个。

代码:
public class Test {
public static void main(String[] args) {
HashSet hs=new 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类

(1).LinkedHashSet:底层数据结构是由哈希表和链表组成。
哈希表保证数据的唯一性。
链表保证元素的有序。(取出来和存储是一致的)

(2).代码实现
public class Test {
public static void main(String[] args) {
LinkedHashSet hsHashSet=new 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

4.TreeSet类

(1).TreeSet类能够对元素按照某一种规则进行排序,并且元素唯一。

(2).排序的俩种方式:
自然排序
比较器排序(强行对整体进行排序)


(3).TreeSet类存储自定义对象(自定义排序)

A:你没有告诉我们该如何排序?
按照年龄大小进行排序
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;
}

public void setName(String 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 tsSet=new 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);

for(Student s:tsSet){
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比较器排序

A:自然排序(元素自己具备比较性),按照元素自身特性排序
让元素属性类实现自然排序接口Comparable

B:比较器排序(集合具备比较性),有集合内部决定排序
让集合父的构造方法接受一个比较器的子类对象Comparator


代码实现
//自定义外部类
public class MyComparator implements Comparator{

@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;
}
}
//学生类
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 tsSet=new TreeSet(new MyComparator());
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 tsSet=new TreeSet(new Comparator() {
@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);

for(Student s:tsSet){
System.out.println(s.getName()+"----"+s.getAge());
}

}
}

 

Java基础_Set集合

标签:err   name   obj   添加   collect   tag   --   使用   length   

原文地址:https://www.cnblogs.com/nwxayyf/p/9537704.html

上一篇:Python装饰器

下一篇:Swift中"#"的用法


评论


亲,登录后才可以留言!