java 集合(Set接口)

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/250108.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于mac机抓包的几点基础知识

1. 我使用的抓包工具为WireShark&#xff0c;以下操作按我当前的版本(Version 2.6.1)做的&#xff0c;以前的版本或者以后的版本可能有稍微的区别。 2. 将mac设置为热点&#xff1a;打开系统偏好设置&#xff0c;点击共享&#xff1a; 然后点击WIFI选项&#xff0c;设置WIFI名…

SpringBoot启动如何加载application.yml配置文件

一、前言 在spring时代配置文件的加载都是通过web.xml配置加载的(Servlet3.0之前)&#xff0c;可能配置方式有所不同&#xff0c;但是大多数都是通过指定路径的文件名的形式去告诉spring该加载哪个文件&#xff1b; <context-param><param-name>contextConfigLocat…

[github] - git使用小结(分支拉取、版本回退)

1. 首次(fork项目之后) $ git clone [master] $ git branch -a $ git checkout -b [自己的分支名] [远程仓库的分支名]克隆的是主干网络 2. 再次拉取代码 $ git pull [master下选择分支名] [分支名] $ git push origin HEAD:[分支名]拉取首先得进入主仓(不是自己的远程仓)然后…

MYSQL 查看最大连接数和修改最大连接数

MySQL查看最大连接数和修改最大连接数 1、查看最大连接数show variables like %max_connections%;2、修改最大连接数set GLOBAL max_connections 200; 以下的文章主要是向大家介绍的是MySQL最大连接数的修改&#xff0c;我们大家都知道MySQL最大连接数的默认值是100, 这个数值…

阿里云服务器端口开放对外访问权限

登陆阿里云管理控制台 点击自己的实例 点击安全组配置 点击配置规则 点击添加安全组规则 配置出入放心&#xff0c;和开放的端口号&#xff0c;以及那些网段可以访问&#xff0c;这里设置所有网段都可以访问 转自&#xff1a;https://jingyan.baidu.com/article/95c9d20d624d1e…

PageHelper工作原理

数据分页功能是我们软件系统中必备的功能&#xff0c;在持久层使用mybatis的情况下&#xff0c;pageHelper来实现后台分页则是我们常用的一个选择&#xff0c;所以本文专门类介绍下。 PageHelper原理 相关依赖 <dependency><groupId>org.mybatis</groupId>&…

10-多写一个@Autowired导致程序崩了

再是javaweb实验六中&#xff0c;是让我们改代码&#xff0c;让它跑起来&#xff0c;结果我少注释了一个&#xff0c;导致一直报错&#xff0c;检查许久没有找到&#xff0c;最后通过代码替换逐步查找&#xff0c;才发现问题。 转载于:https://www.cnblogs.com/zhumengdexiaoba…

Java class不分32位和64位

1、32位JDK编译的java class在32位系统和64位系统下都可以运行&#xff0c;64位系统兼容32位程序&#xff0c;可以理解。2、无论是Linux还是Windows平台下的JDK编译的java class在Linux、Windows平台下通用&#xff0c;Java跨平台特性。3、64位JDK编译的java class在32位的系统…

包装对象

原文地址&#xff1a;https://wangdoc.com/javascript/ 定义 对象是JavaScript语言最主要的数据类型&#xff0c;三种原始类型的值--数值、字符串、布尔值--在一定条件下&#xff0c;也会自动转为对象&#xff0c;也就是原始类型的包装对象。所谓包装对象&#xff0c;就是分别与…

[C++] 转义序列

参考 C Primer(第5版)P36 名称转义序列换行符\n横向制表符\t报警(响铃)符\a纵向制表符\v退格符\b双引号"反斜杠\问号?单引号’回车符\r进纸符\f

vue使用(二)

本节目标&#xff1a; 1.数据路径的三种方式 2.{{}}和v-html的区别 1.绑定图片的路径 方法一&#xff1a;直接写路径 <img src"http://pic.baike.soso.com/p/20140109/20140109142534-188809525.jpg"> 方法二&#xff1a;在data中写路径&#xff0c;在…

typedef 为类型取别名

#include <stdio.h> int main() {   typedef int myint; // 为int 类型取自己想要的名字   myint a 10;   printf("%d", a);   return 0;} 其他类型的用法也是一样的 typedef 类型 自己想要取得名字; 转载于:https://www.cnblogs.com/hello-dummy/p/9…

【C++】如何提高Cache的命中率,示例

参考链接 https://stackoverflow.com/questions/16699247/what-is-a-cache-friendly-code 只是堆积&#xff1a;缓存不友好与缓存友好代码的典型例子是矩阵乘法的“缓存阻塞”。 朴素矩阵乘法看起来像 for(i0;i<N;i) {for(j0;j<N;j) {dest[i][j] 0;for( k;k<N;i)…

springboot---整合redis

pom.xml新增 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>代码结构如下 其中redis.yml是连接redis的配置文件&#xff0c;RedisConfig.java是java配置…

[Head First Java] - 简单的建议程序

参考 - p481、p484 与我对接的业务层使用的是JAVA语言,因此花点时间入门java.下面几篇博客可能都是关于java的,我觉得在工作中可能会遇到的 简单的通信 DailyAdviceClient(客户端程序) import java.io.*; import java.net.*;public class DailyAdviceClient{public void go()…

SQL重复记录查询的几种方法

1 查找表中多余的重复记录&#xff0c;重复记录是根据单个字段1 select * from TB_MAT_BasicData1 2 where MATNR in ( select MATNR from TB_MAT_BasicData1 group by MATNR having count(MATNR)>1) 2.表需要删除重复的记录&#xff08;重复记录保留1条&#xff09;&…

Redis 的应用场景

之前讲过Redis的介绍&#xff0c;及使用Redis带来的优势&#xff0c;这章整理了一下Redis的应用场景&#xff0c;也是非常重要的&#xff0c;学不学得好&#xff0c;能正常落地是关键。 下面一一来分析下Redis的应用场景都有哪些。 1、缓存 缓存现在几乎是所有中大型网站都在…

[Head First Java] - Swing做一个简单的客户端

参考 - P487 1. vscode配置java的格式 点击左下角齿轮 -> 设置 -> 打开任意的setting.json输入如下代码 {code-runner.executorMap": {"java": "cd $dir && javac -encoding utf-8 $fileName && java $fileNameWithoutExt"},…

【Nginx】 Nginx实现端口转发

什么是端口转发 当我们在服务器上搭建一个图书以及一个电影的应用&#xff0c;其中图书应用启动了 8001 端口&#xff0c;电影应用启动了 8002 端口。此时如果我们可以通过 localhost:8001 //图书 localhost:8002 //电影 但我们一般访问应用的时候都是希望不加端口就访问…

计算机网络知识总结

一 OSI与TCP/IP各层的结构与功能&#xff0c;都有哪些协议 OSI的七层体系结构概念清楚&#xff0c;理论也很完整&#xff0c;但是它比较复杂而且不实用。在这里顺带提一下之前一直被一些大公司甚至一些国家政府支持的OSI失败的原因&#xff1a; OSI的专家缺乏实际经验&#xff…