您的位置 首页 java

Java中的set集合如何理解(三)——精简

引言

在前面的内容中,我们先是一一介绍了Collection集合中都有哪些种类的集合,并且详细地讲解了List集合中的相关知识,那么今天我们来详细地讲解一下Collection集合中的另外一个分支——Set系列集合。最后还是希望这一篇篇的文章能够对你在集合中的学习、 Java 中的学习起到一定的帮助作用,好了,闲话不多说直接步入正题吧。

概念

Set系类集合特点:

无序:存取顺序不一致

不重复:可以去除重复

无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过 索引 来获取元素

Set集合实现类特点:

HashSet:无序、不重复、无索引

LinkedHashSet:有序、不重复、无索引

TreeSet:排序、不重复、无索引

Set集合的功能上基本上与Collection的API一致。

HashSet集合

HashSet集合:

Set<String> set = new Hash Set<>();

set.add(” 石原里美 “);

set.add(“石原里美”);

set.add(” 工藤静香 “);

set.add(“朱茵”);

System.out.println(set);

set.remove(“朱茵”);

System.out.println(set);

输出结果:

通过上述代码与运行结果,我们可以清晰地看出,HashSet集合无序、不重复的特性;

结合上述图片所示,可以看出HashSet集合是无法通过get()方法的索引获取数据的,并且在删除集合中的数据的时候,也只能通过定向的对数据进行删除。

LinkedHashSet集合:

LinkedHashSet集合:

Set<String> set = new LinkedHashSet<>();

set.add(“石原里美”);

set.add(“石原里美”);

set.add(“工藤静香”);

set.add(“朱茵”);

System.out.println(set);

set.remove(“朱茵”);

System.out.println(set);

输出结果:

通过上述代码与输出结果做对比,即可看出无序与有序之间的区别,前者是会将传入的数据顺序打乱,而后者则是仍然按照输入数据的顺序存储数据,因此输出的时候是有序状态。

TreeSet集合:

TreeSet集合:

Set<Integer> set = new TreeSet<>();

set.add(13);

set.add(23);

set.add(23);

set.add(11);

System.out.println(set);

set.remove(23);

System.out.println(set);

输出结果:

通过上述代码和输出结果我们便可以通过字面意思去理解为什么TreeSet的特点是排序了,即将存储的数据按照Java默认的排序方式进行排序。

然而此时若存储自定义如People对象,TreeSet无法直接排序,会出现报错的情况!

//People类:

public class People{

private String name;

private int age;

private String classroom;

public People(){

}

public People(String name, int age, String classroom) {

this.name = name;

this.age = age;

this.classroom = classroom;

}

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 String getClassroom() {

return classroom;

}

public void setClassroom(String classroom) {

this.classroom = classroom;

}

@Override

public String toString() {

return “People{” +

“name='” + name + ‘\” +

“, age=” + age +

“, classroom='” + classroom + ‘\” +

‘}’;

}

}

//main方法:

public static void main(String[] args) {

Set<People> p = new TreeSet<>();

p.add(new People(“张三”,19,”智能”));

p.add(new People(“李四”,18,”数据库”));

p.add(new People(“王五”,20,”渗透”));

System.out.println(p);

}

若想解决该问题,我们就需要为TreeSet集合自定义存储类型,现有两种方式可以解决该问题:一种是自定义类实现Comparable接口并重写里面的compareTo方法指定规则;另一种则是集合自带 比较器 对象进行规则定义。

方式一:自定义类实现Comparable接口重写里面的compareTo方法指定比较规则(多余无关紧要的代码在此不再赘述了,只展示重要的那部分代码)

//改变的第一个地方:实现Comparable类

public class People implements Comparable<People> {

//改变的第二个地方:重写Comparable类中的 compareTo 方法

@Override

public int compareTo(People o) {

return this.age-o.age;

}

}

输出结果(根据年龄进行比较):

在重写的方法中,return后面的代码决定了该对象将要根据什么准则进行比较,比较规则如下:

如果认为第一个元素大于第二个元素返回正整数即可

如果认为第一个元素小于第二个元素返回负整数即可

如果认为第一个元素等于第二个元素返回0即可,此时Treeset集合只会保留一个元素,认为两者重复

方式二:集合自带比较器对象进行规则定义

Set<People> p = new TreeSet<>(new Comparator<People>() {

@Override

public int compare(People o1, People o2) {

return o1.getAge()-o2.getAge();

}

});

在原来的基础之上对集合的创建作出改变,并且其比较准则与前面的定义方法类似,相对前面的方式,这种方式会更加方便快捷一些。在此,我们也可以回顾一些前面所学到的知识“ Lambda表达式 ”,对给代码块进行化简。

文章来源:智云一二三科技

文章标题:Java中的set集合如何理解(三)——精简

文章地址:https://www.zhihuclub.com/191313.shtml

关于作者: 智云科技

热门文章

发表回复

您的电子邮箱地址不会被公开。

网站地图