Java基础_Set集合
Posted nwxayyf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础_Set集合相关的知识,希望对你有一定的参考价值。
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<String> hs=new HashSet<String>();
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<String> hsHashSet=new LinkedHashSet<String>();
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<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;
}
@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> tsSet=new TreeSet<Student>();
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<Student>{
@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<Student> tsSet=new TreeSet<Student>(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<Student> tsSet=new TreeSet<Student>(new Comparator<Student>() {
@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集合的主要内容,如果未能解决你的问题,请参考以下文章
JAVA零基础小白学习免费教程day14-Set&HashMap
JAVA零基础小白学习免费教程day14-Set&HashMap