博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Collection与Map学习笔记(二)
阅读量:4314 次
发布时间:2019-06-06

本文共 3020 字,大约阅读时间需要 10 分钟。

今天总结Collection的另一个子接口Set.

set接口主要要掌握三个实现类:HashSet、LinkedHashSet、TreeSet。

HashSet特点:

1.无序性

2.不能添加重复元素

3.最多只能有一个空值

4.不是线程安全

LinkedHashSet特点:

1.LinkedHashSet继承于HashSet

2.可以按照添加顺序排序,其余特性与HashSet相同

 

TreeSet特点

1.不能添加重复元素

2.最多只能有一个空值

3.不是线程安全

3.除了上面三个特点以外,典型的特性在于TreeSet可以自动排序(自然排序),排序调用元素的compareTo()方法

 Set的实现类不可添加重复元素。关于元素是否重复,基本数据类型很好判断。对于自定义类,就比较困难了。利用构造器创建对象,即使所有参数相同,创建的对象也不是重复对象,因为对象的地址不同。

eg;

public class MidscStudent {    private int age;    private int id;    private String name;    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    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;    }    @Override    public String toString() {        return "MidscStudent [age=" + age + ", id=" + id + ", name=" + name + "]";    }    public MidscStudent(int age, int id, String name) {        super();        this.age = age;        this.id = id;        this.name = name; }

Set<MidscStudent> mids=new HashSet<MidscStudent>();

MidscStudent mids1=new MidscStudent(12, 13, "刘备");

MidscStudent mids1=new MidscStudent(12, 13, "刘备");

毫无意外,mids1和mids2是两个不同对象。

但是,我们一般都要把mids1和mids2当做相同对象处理,这样该怎么办?

处理办法是在自定义类种重写equals方法和hashCode方法。

public class MidscStudent {    private int age;    private int id;    private String name;    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    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;    }    @Override    public String toString() {        return "MidscStudent [age=" + age + ", id=" + id + ", name=" + name + "]";    }    public MidscStudent(int age, int id, String name) {        super();        this.age = age;        this.id = id;        this.name = name;    }    @Override    public int hashCode() {                return 1;    }    @Override    public boolean equals(Object obj) {        if(!(obj instanceof MidscStudent)) {            return false;        }        MidscStudent a=(MidscStudent) obj;        if(this.age==a.age && this.id==a.id && this.name!=null && this.name.equals(a.name)) {            return true;        }else {            return false;        }            }    }

这样一来,mids1和mids2就是相同元素了。

小知识;

可变参数:对一下操作,参数的数量不是固定的,是可变动的,程序员不可能针对每种数量的参数分别写一个方法。这时候就可以用可变参数。

例如求和。我们有两个参数的求和,三个参数求和。

public int add(int a,int b) {

int sum=a+b;
return sum;
}
//三个参数相加
public int add1(int a,int b,int c) {
int sum=a+b+c;
return sum;

如果一个项目要用到多个求和,我们不可能写多个求和方法。这时候我们可以使用可变参数。

//n个参数相加

public int add(int... p) {//int.. p就是一个整数数组,int...相当于int[]
int sum=0;
for(int i=0;i<p.length;i++) {
sum=sum+p[i];
}
return sum;
}

这样主函数里就可以引入一个int[] 数组对象,作为参数,使用该方法。

当然,可变参数不仅对int数据类型有用,对所有的数据类型和类都有效。

转载于:https://www.cnblogs.com/hitnmg/p/9350369.html

你可能感兴趣的文章
J.U.C Atomic(二)基本类型原子操作
查看>>
POJ---2945 Find the Clones[字典树-简单题(多例输入注意删除)]
查看>>
[Luogu4550] 收集邮票
查看>>
Python-循环
查看>>
(转)最大子序列和问题 看着貌似不错
查看>>
thinkphp3.2 链接数据库测试
查看>>
项目的上线流程是怎样的?
查看>>
Linux通配符
查看>>
ES6 Iterator
查看>>
Apache2.4开启GZIP功能
查看>>
远程桌面关闭重启电脑的方法
查看>>
第三章 熟悉常用的HDFS操作
查看>>
filter:expression(document.execCommand("BackgroundImageCache",false,true) 转
查看>>
Java - 30 Java 网络编程
查看>>
shiro中的filterChainDefinitions
查看>>
瑞柏匡丞教你如何和程序员一起愉快的玩耍
查看>>
【单调队列】Vijos P1771 瑞士轮 (NOIP2011普及组第三题)
查看>>
【模拟】NEERC15 E Easy Problemset (2015-2016 ACM-ICPC)(Codeforces GYM 100851)
查看>>
JavaBean and PreparedStatement Usage
查看>>
经典冒泡排序
查看>>