当前位置:首页 > Java技术 > java 集合(Set接口)

java 集合(Set接口)

2022年08月04日 21:52:18Java技术8

Set接口:无序集合,不允许有重复值,允许有null值

                    存入与取出的顺序有可能不一致

 

HashSet:具有set集合的基本特性,不允许重复值,允许null值

       底层实现是哈希表结构

       初始容量为16

       保存自定义对象时,保证数据的唯一性,主要由哈希表的结构决定

       先判断hashCode()是否相同,若相同,再判断equals()是否相同

       

哈希表结构:哈希表中存放的都是对象的哈希码值,当想要给哈希表中存放对象时,需要先进行对象的哈希码值比较,若表中已经存在了相同的哈希码,则继续比较equals方法,比较对象的值是否相同,若返回false,则存入哈希表中,相当于两个对象共享同一块内存地址。若表中无相同的哈希码值,则直接存入。

package com.itycl.array;

/*

 * 用HashSet去除重复值  重写toString()  hashCode()   equals()

 */

import java.util.HashSet;

import java.util.Iterator;

 

public class HashSetDemo {

public static void main(String[] args) {

   

    HashSet<Integer> set=new HashSet<>();

    set.add(1);

    set.add(2);

    set.add(3);

    set.add(3);

    set.add(4);

    set.add(4);

    Iterator it=set.iterator();

    while(it.hasNext()) {

       Integer value = (Integer) it.next();

       System.out.println(value);

    }

    System.out.println(set);

}

}

 

 

HashSet存放自定义对象:

package SetDemo1;

 

import java.util.HashSet;

import java.util.Iterator;

/*课堂练习:

 *    

 *

 *

 * System.out.println():默认添加内容.toString

 * 输出该对象的字符串表示

 *

 *

 *

 */

 

public class HashSetDemo2 {

   public static void main(String[] args) {

    HashSet<Person> ps=new HashSet<>();

    ps.add(new Person("小花","18"));

    ps.add(new Person("小绿","19"));

    ps.add(new Person("小红","19"));

    ps.add(new Person("小粉","18"));

   

    ps.add(new Person("小草","19"));

    ps.add(new Person("小草","19"));  

    Iterator<Person> it=ps.iterator();

    while(it.hasNext()) {

       System.out.println(it.next());    

    }     

}

}

 

Person类:

package collection;

 

public class Person implements Comparable<Person> {

private String name;

private int age;

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 Person(String name, int age) {

    super();

    this.name = name;

    this.age = age;

}

@Override

public int compareTo(Person o) {

    if(this.age>o.age) {

       return 1;

    }else if(this.age<o.age) {

       return -1;

    }else {

       return this.getName().compareTo(o.getName());

    }

   

}

@Override

public String toString() {

   

    return "Person[name="+name+","+"age="+age+"]"+"\t";

}

@Override

public int hashCode() {

    return this.name.hashCode()+this.age*7;

}

@Override

public boolean equals(Object obj) {

   

    if(obj==null) {

       throw new RuntimeException("传入的对象不能为空!");

    }

   

    if(!(obj instanceof Person)) {

       throw new RuntimeException("传入的对象不是Person的实例!");

    }

   

    Person p = (Person) obj;

    return p.getName().equals(this.name) && p.getAge()==(this.age);

 

}

}

 

    

   TreeSet:具有set集合的基本特性,有序集合,不允许重复值,允许null。

          底层实现是树的数据结构。

                   两种排序方式:

a)实现自comparable接口:自然顺序,实现该接口类自身就具备了一种可比较性

*重写compareTo()方法

b)自定义一个比较器comparator:可以作为参数传给set集合,让集合具有明确的比较

1.实现自comparable接口:      

package SetDemo1;

import java.util.Iterator;

import java.util.TreeSet;

/*使用TreeSet集合保存自定义对象

 * 并且,认为年龄和姓名相同对象为同一个学生对象

 *

 */

public class TreeSetDemo1 {

   public static void main(String[] args) {

    TreeSet<Student> ts=new TreeSet<>();

    ts.add(new Student("java01",20));

    ts.add(new Student("java02",10));

    ts.add(new Student("java03",20));

    ts.add(new Student("java04",30));

    ts.add(new Student("java05",20));

    ts.add(new Student("java05",20));//不允许重复值

    ts.add(null);

    Iterator<Student> it=ts.iterator();

    while(it.hasNext()) {      

       System.out.println(it.next()); 

    }     

}

   

 

Person类:

package com.itycl.array;

//实现comparable<T>接口

public class Person implements Comparable<Person> {

private String name;

private int age;

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 Person(String name, int age) {

    super();

    this.name = name;

    this.age = age;

}

//重写compareTo()

@Override

public int compareTo(Person o) {

    if(this.age>o.age) {

       return 1;

    }else if(this.age<o.age) {

       return -1;

    }else {

       return this.getName().compareTo(o.getName());

    }

   

}

//重写toString()

@Override

public String toString() {

   

    return "Person[name="+name+","+"age="+age+"]"+"\t";

}

}

 

2.自定义一个比较器:comparator,让集合具有明确的比较

自定义比较器:实现implements Comparator接口

package com.itycl.array;

import java.util.Comparator;

public class MyComparator implements Comparator<Student> {

    @Override

    public int compare(Student o1, Student o2) {

       System.out.println(o1+":"+o2);

       if(o1==null || o2==null) {

           throw new RuntimeException("比较的参数不能为空");

       }

       if(o1.getAge()>o2.getAge()) {

           return 1;

       }else if(o1.getAge()<o2.getAge()) {

           return -1;

       }else {

           return o1.getName().compareTo(o2.getName());

       }

          

    }

}

 

Student类:

package com.itycl.array;

public class Student {

private String name;

private int age;

public Student(String name, int age) {

    super();

    this.name = name;

    this.age = age;

}

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

    return "Person[name="+name+","+"age="+age+"]"+"\t";

}

}

 

TreeSetDemo1:

package com.itycl.array;

import java.util.Iterator;

import java.util.TreeSet;

public class TreeSetDemo1 {

public static void main(String[] args) {

    MyComparator my=new MyComparator();//创建比较器对象,并且传到set集合中,使set集合本身具有明确的比较

    TreeSet<Student> set=new TreeSet<>(my);

    set.add(new Student("张倩",12));

    set.add(new Student("李雷",10));

    set.add(new Student("兰兰",6));

    set.add(new Student("老刘",26));

    set.add(new Student("王乐",21));

    Iterator it=set.iterator();

    while(it.hasNext()) {

       Student s = (Student) it.next();

       System.out.println(s.toString());

    }

}

}

作者:米兰达儿
来源链接:https://www.cnblogs.com/MiLanDaEr/p/10055354.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/16970.html

标签: Java集合Java
分享给朋友:

“java 集合(Set接口)” 的相关文章

Java空指针异常解决java.lang.NullPointerException解决心得

Java空指针异常解决java.lang.NullPointerException解决心得

今天做课设的时候运行程序报出以下错误 java.lang.NullPointerException 首先要理解的是此错误并不会在 程序中报错,只会在运行的时候报错。 是由于某个参数(集合,数组等数据)可能出现一个null值而导致后面的程序不能运行时...

Java中四种访问修饰符的区别

在java中共有4种访问级别,按访问权限由高到低为:public(公有的)、protected(受保护的)、友好的(没有任何访问权限关键字修饰)和private(私有的)。 类型 类内部 同一个包其...

全面了解 Java 原子变量类

📦 本文以及示例源码已归档在 javacore 一、原子变量类简介 为何需要原子变量类 保证线程安全是 Java 并发编程必须要解决的重要问题。Java 从原子性、可见性、有序性这三大特性入手,确保多线程的数据一致性。 确保线程安全最...

Java 并发核心机制

Java 并发核心机制

📦 本文以及示例源码已归档在 javacore 一、J.U.C 简介 Java 的 java.util.concurrent 包(简称 J.U.C)中提供了大量并发工具类,是 Java 并发能力的主要体现(注意,不是全部,有部分并发能力的支持在其他包中)。...

Java实现素数的判断

素数的定义只能被1和它本身整除,不包括1 例 2.3.5.7.11.13 实现代码 Scanner in=new Scanner(System.in); int n ; n=in.nextInt(); for(int n1=2;n1&l...

二分法(折半查找)的运用之java实现猜数字游戏

让计算机输入一个数 然后用户进行猜数游戏 一般而言,七次会猜对,如果猜不对,那么就是你的方法不对 在这儿涉及到的一个算法就是二分法 ***二分法查找,***也称为折半法,是一种在有序数组中查找特定元素的搜索算法。二分法查找的思路如下: (1)首先,从数组...

java计数循环及小技巧

要运行一个很大次数的循环应该选择一个小数,然后去判断 例如本例子是100可以选择10去判断 public static void main(String[] args) { // TODO Auto-generated metho...

Java打印车票主要学习Java的比较语句

直接上代码 public static void main(String[] args) { // TODO Auto-generated method stub //初始化 Scanner in=new Scanner(S...

java中将英尺换算为身高

java中将英尺换算为身高

直接上代码 如图所示便是身高的换算,你学到了吗?、 int foot; double inch; Scanner in=new Scanner(System.in); foot=in.nextInt(); inch=in.nextDouble...

在JAVA 中将堆与栈分开的原因

栈是运行时的单位,而堆是存储的单位。 栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;堆解决的是数据存储的问题,即数据怎么 放、放在哪儿。 注意:在Java中一个线程就会相应有一个线程栈与之对应 栈因为是运行单位,因此里面存储的信息都是跟...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。