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的集成过 ...
随机推荐
- iOS加密之AES
心急的童鞋直接看这里Demo 运行之后可以去在线加密网站验证 AES(Advanced Encryption Standard)高级加密标准,又称Rijndael加密法,是美国联邦政府采用的一种区块加 ...
- UCOSIII软件定时器
API函数 //创建 void OSTmrCreate (OS_TMR *p_tmr, CPU_CHAR *p_name, OS_TICK dly, OS_TICK period, OS_OPT op ...
- 造成thrift 编译构建项目失败的原因之一:thrift环境变量没设置
由于重装了系统和IDEA工具,打开原项目时使用install 构建使用thrift 协议的项目时失败.下面是说说我遇到的问题 看下图,就是构建时控制台输出的日志,因为是乱码,当时没重视,就先去检查po ...
- 笔谈OpenGL ES(三)
昨天下午以及今天一天,公司安排了新员工培训课程,占用了自己的一些时间,但是也了解到一些新的有利于自身的东西.进公司就要进有完善公司体系和制度的公司,小公司真的是没搞头的,我体验过,反正小公司以后是不会 ...
- SQL SERVER-Alwayson原理
流程 1.异步提交模式 主副本无须确认该副本已经完成日志固化,就可提交事务. 主副本不受辅助副本的影响 辅助副本上的DB处于SYNCHRONIZING 2.同步提交模式 主副本要确认副本已经完成日志固 ...
- Springboot手动获取bean
使用如下工具类即可 package com.rio.ums.spa.commons.utils; import org.springframework.beans.BeansException; im ...
- js中绑定事件处理函数,使用event以及传递额外数据
IE8中使用attachEvent绑定事件处理函数时,不能直接向event 对象添加数据属性.可以用属性复制的方法,包装新的event对象. 1. 属性复制var ObjectExtend = fun ...
- go cache
go 编译, 或是安装库的时候,产生的日志量很大 go env 删除掉这个log.txt文件,系统空间瞬间就够了
- hdu6715 算术 2019百度之星初赛3-1003
题目地址 http://acm.hdu.edu.cn/showproblem.php?pid=6715 题解 还是不会这题的容斥做法qwq.hjw当场写了个容斥A了.我推了个莫反,但是没反应过来我的式 ...
- 【OI备忘录】trick汇总帖
OI中的那些实用的小trick 在OI中,我们时常会用到一些小技巧,无论是代码方面还是数学方面抑或是卡常,都有很多不错的小技巧. 鄙人不才,往往没办法想出来,于是就有了这篇汇总帖~ 如有疏漏,还请da ...