Set详解
Set集合:
- 元素不可重复
- hashCode 特点:速度快,数组->链表->红黑树
- set集合报错元素唯一:
存储元素(String,Interger,....Student,Person...),必须重写hashCode方法和equals方法
public class Person extends Object {
@Override
public int hashCode() {
return 1;
}
}
/*
* 哈希值:是一个十进制的整数,由于系统随机给出(就是对象的地址值,是一个逻辑地址,
* 是模拟出来得到地址,不是数据实际存储的物理地址)
* 在Object类有一个方法,可以获取对象的哈希值
* int hashCode方法的源码:
* public native int hashCode();
* native:代表该方法调用的是本地操作系统的方法
* */
public class Demo03HashCode {
public static void main(String[] args) {
//Person类继承了Object类,所以可以使用Object类的hashCode方法
Person ps1 = new Person();
int h1 = ps1.hashCode();
System.out.println(h1);//重写完hashCode 输出 1
Person ps2 = new Person();
int h2 = ps2.hashCode();
System.out.println(h2); //重写完hashCode 输出 1
System.out.println(ps1);//cn.itcast.demo03.Person@1
System.out.println(ps2);//cn.itcast.demo03.Person@1
System.out.println(ps1==ps2);//false
}
}
HashSet存储自定义类型元素:
public class Person extends Object {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
if (age != person.age) return false;
return name != null ? name.equals(person.name) : person.name == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
import java.util.HashSet;
/*
* hashSet存储自定义类型元素
* set集合报错元素唯一:
* 存储元素(String,Interger,....Student,Person...),必须重写hashCode方法和equals方法
* 要求:
* 同名同年龄的人,视为同一个人,只能存储一次
* */
public class Demo03Set02 {
public static void main(String[] args) {
//创建HashSet集合存储Person
HashSet<Person> set = new HashSet<>();
Person p1 = new Person("小美女",18);
Person p2 = new Person("小美女",18);
Person p3 = new Person("小美女",19);
System.out.println(p1.hashCode());//356573597 | 重写两个方法之后734174878
System.out.println(p2.hashCode());//1735600054 | 734174878
//哈希值不同,认为是两个不同的元素
//没有重写hashCode与equals时,比较的是两个对象地址值
System.out.println(p1==p2);//false | false
System.out.println(p1.equals(p2));//false | true
set.add(p1);
set.add(p2);
set.add(p3);
System.out.println(set);
//[Person{name='小美女', age=18},Person{name='小美女', age=18}, Person{name='小美女', age=19}] | [Person{name='小美女', age=18}, Person{name='小美女', age=19}]
}
}
LinkedHashSet集合:
可变参数:
/*
* 可变参数:是JDK1.5之后出现的新特性
* 使用前提:
* 当方法的参数列表数据类型已经确定,但是参数的个数不确定,就可以使用可变参数
* 使用格式:
* 修饰符 返回值类型 方法名(数据类型...变量名){}
* 可变参数的原理:
* 可变参数底层就是一个数组,根据传递参数个数不同,会创建不同长度的数组,来存储这些参数
* 传递的参数个数,可以是0个(不传递),1,2,...多个
*
* 可变参数注意事项:
* 1.一个方法的参数列表,只能有一个可变参数
* public static void method(int...a,String...b){ } -> 错误写法
* 2.如果方法的参数有多个,那么可变参数必须写在参数列表的末尾
* public static void method(int...a,String b,double c){ } -> 错误写法
* public static void method(String b,double c,int...a){ } ->正确写法
*
* 可变参数特殊写法(终极写法),可接收任意参数:
* public static void method(Object...obj){ }
* */
public class Demo03VarArgs {
public static void main(String[] args) {
//int i = add();
//int i = add(10);
int i = add(10,20);
System.out.println(i);//30
/* System.out.println(i);*/
method("xiaobai",1,2,3.3);
}
public static void method(Object...obj){
for (Object o : obj) {
System.out.print(o+" ");//xiaobai 1 2 3.3
}
System.out.println();
}
/*
* 定义计算0~n个int类型整数的和方法
* 需求分析:
* 已知:计算整数的和,数据类型已经确定int
* 但是参数的个数不确定,不知道要计算几个整数的和,就可以使用可变参数
* add();就会创建一个长度为0的数组,new int[0]
* add(10);就会创建一个长度为1的数组,存储传递过来的参数new int[]{10}
* add(10,20);就会创建一个长度为2的数组,存储传递过来的参数new int[]{10,20}
* ........
* */
public static int add(int...arr){
// System.out.println(arr);//[I@1540e19d 底层是一个数组
// System.out.println(arr.length);//0 1 2
//定义一个初始化变量,来记录累加求和
int sum = 0;
//遍历数组,获取数组中的每一个元素
for (int i : arr) {
sum += i;
}
return sum;
}
}
Set详解的更多相关文章
- Linq之旅:Linq入门详解(Linq to Objects)
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
- 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)
一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...
- EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解
前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...
- Java 字符串格式化详解
Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...
- Android Notification 详解(一)——基本操作
Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...
- Android Notification 详解——基本操作
Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...
- Git初探--笔记整理和Git命令详解
几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...
- Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)
Android XML shape 标签使用详解 一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...
- Node.js npm 详解
一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...
- .NET应用和AEAI CAS集成详解
1 概述 数通畅联某综合SOA集成项目的统一身份认证工作,需要第三方系统配合进行单点登录的配置改造,在项目中有需要进行单点登录配置的.NET应用系统,本文专门记录.NET应用和AEAI CAS的集成过 ...
随机推荐
- Java中重载(overloading)和重写(Overriding)的区别
一:方法的重载 (1)方法重载指在类中定义方法名相同,参数不同的不同的多个方法(返回值类型可随意,不能以返回类型作为重载函数的区分标准). 参数不同表现: 1.参数的个数不同 2.参数的类型不同 3. ...
- 4.kafka API producer
1.Producer流程首先构建待发送的消息对象ProducerRecord,然后调用KafkaProducer.send方法进行发送.KafkaProducer接收到消息后首先对其进行序列化,然后结 ...
- c# 日期和时间System.DateTime
- Linux磁盘管理——日志文件系统与数据一致性
参考:Linux磁盘管理——Ext2文件系统 数据不一致 上图是Ext2结构图,其他FS结构类似. 一般来说,我们将 inode table 与 data block 称为数据区:至于其他例如 sup ...
- [S32K]FreeRTOS使用
参考官方: Tutorial: FreeRTOS 10.0.1 with NXP S32 Design Studio 2018.R1 (官方component是V8.2.1,此文档介绍如何升级到V10 ...
- 2013.6.21 - OpenNER第一天
下午去实验室继续写实验报告,跟伟杰要了一个实验报告,然后大师兄叫我,我们在走廊唠了一会儿. 大 师兄想做Open NE,他说这个会比较难,目前没有人做,因为还没有发现相关的文章,大家研究的都是指定了哪 ...
- MySQL 主从延迟几万秒 Queueing master event to the relay log(转)
数据库版本Server version: 5.6.24-log Source distribution 问题描述 数据采集平台业务数据库由于批量灌数据导致主从延迟上万秒. 复制线程长期处于Que ...
- macOS 10.13允许任何来源开启方法
软件下载网站: http://www.pc6.com/ 软件安装问题: macOS 10.13允许任何来源开启方法: 如果需要恢复允许“任何来源”的选项,即关闭系统的Gatekeeper,我们可以在“ ...
- python温度转换代码
#TempConvert.py TempStr=input("请输入带有符号的温度值:")#赋值TempStr,括号里面的是提示 if TempStr[-1] in ['F','f ...
- 《团队名称》第九次团队作业:Beta冲刺与验收准备
项目 内容 这个作业属于哪个课程 软件工程 这个作业的要求在哪里 实验十三 团队作业9:Beta冲刺与团队项目冲刺 团队名称 发际线总和我作队 作业学习目标 (1)掌握软件黑盒测试技术:(2)掌握软件 ...