50. Set接口和Set的实现类HashSet
集合分类:
-------------------| Collection 单列集合的根接口
---------------| List 如果实现了List接口的集合类,具备的特点是:有序,可重复
-----------| ArrayList ArrayList底层维护的是一个Object类型的数组,特点是:查询快,增删慢
使用场景:如果目前的数据查询多,增删少,那么就使用ArrayList存储数据
注意:使用ArrayList无参构造方法时,Object默认的长度时10,不够的话自动增长0.5倍
-----------| LinkedList LinkedList底层使用了链表数据结构实现的。特点是:查询慢,增删快
使用场景:数据查询少,增删多的时候,用LinkedList存储
---------------| Set 如果实现了Set接口的集合类,具备的特点是:无序,不可重复
注意:Set接口没有get()方法,迭代器才是通用遍历集合的方法,所以我们最好使用迭代器遍历
-----------| HashSet
HashSet的实现原理:
往HashSet添加元素的时候,HashSet会自动先调用元素的hashCode方法得到元素的哈希表,
然后通过元素的哈希值经过移位等运算,就可以算出该元素在哈希表中的存储位置
情况一:如果算出元素的存储位置目前还没有元素,那么该元素可以直接存储到该位置
情况二:如果算出元素的存储位置已经存在其他元素,那么会自动调用equals方法再进行比较一次
如果equals返回ture那么就视为重复元素,不可添加,如果返回false,那么就可以添加
注意:hashCode和equals方法,都是自动调用的,并不是我们手动调用(注意List接口和Set实现原理不同之处)
-----------| ThreeSet
下面是HashSet的实例
class People{
int id;
String name;
public People(int id , String name) {
this.id = id;
this.name = name;
}
//在现实生活中只要身份证一样那么人也就一样
@Override
public int hashCode() {
//确保相同的id可以找到相同的哈希表的位置
return this.id;
}
@Override
public boolean equals(Object obj) {
People p = (People)obj;
return p.id == this.id;
}
//重写是为了可以输出我们需要数据模式(防止println输出时调用Object的toString方法)
@Override
public String toString() {
return "{ 省份证:"+this.id+" 姓名:"+this.name+" }";
}
}
public class Demo1 {
public static void main(String[] args) {
//创建HashSet对象
HashSet set = new HashSet();
set.add(new People(1001,"狗蛋"));
set.add(new People(1002,"狗娃"));
set.add(new People(1003,"老李"));
//添加一个身份证一样的,姓名不一样的人
set.add(new People(1001,"老八"));
//使用迭代器遍历
Iterator it = set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}

50. Set接口和Set的实现类HashSet的更多相关文章
- [MyBatis]DAO层只写接口,不用写实现类
团队开发一个项目,由老大架了一个框架,遇到了DAO层不用写接口了,我也是用了2次才记住这个事的,因为自己一直都是习惯于写DAO层的实现类,所以,习惯性的还是写了个实现类.于是遇到错误了. 找不到那个方 ...
- .NET开发设计模式-获取某个接口下面所有的派生类
using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using Sy ...
- Mybatis Mapper接口是如何找到实现类的-源码分析
KeyWords: Mybatis 原理,源码,Mybatis Mapper 接口实现类,代理模式,动态代理,Java动态代理,Proxy.newProxyInstance,Mapper 映射,Map ...
- Java8自定义函数式编程接口和便捷的引用类的构造器及方法
什么是函数编程接口? 约束:抽象方法有且只有一个,即不能有多个抽象方法,在接口中覆写Object类中的public方法(如equal),不算是函数式接口的方法. 被@FunctionalInterfa ...
- 4.3.6 对象的界定通过编写接口来访问带这类命名结构的表会出问题。如前所述,SQL Server的灵活性不应用作编写错误代码或创建问题对象的借口。 注意在使用Management Studio的脚本工具时,SQL Server会界定所有的对象。这不是因为这么做是必须的,也不是编写代码的最佳方式,而是因为在界定符中封装所有的对象,比编写脚本引擎来查找需要界定的对象更容易。
如前所述,在创建对象时,最好避免使用内嵌的空格或保留字作为对象名,但设计人员可能并没有遵守这个最佳实践原则.例如,我当前使用的数据库中有一个审核表名为Transaction,但是Transaction ...
- DI容器Ninject在管理接口和实现、基类和派生类并实现依赖注入方面的实例
当一个类依赖于另一个具体类的时候,这样很容易形成两者间的"强耦合"关系.我们通常根据具体类抽象出一个接口,然后让类来依赖这个接口,这样就形成了"松耦合"关系,有 ...
- 高阶函数与接口混入和java匿名类
高阶函数与接口混入和java匿名类. 高阶函数中的组件(参量)函数相当于面向对象中的混入(接口)类. public abstract class Bird { private String name; ...
- Java 基础 - Set接口 及其实现类HashSet/LinkedHashSet/TreeSet
笔记: /**Set接口 及其实现类 * 公用操作同Collection: * * ①size(),clear()②isEmpty(),③contains(),④add()方法 和remove()方法 ...
- 基于小程序请求接口 wx.request 封装的类 axios 请求
基于小程序请求接口 wx.request 封装的类 axios 请求 Introduction wx.request 的配置.axios 的调用方式 源码戳我 feature 支持 wx.reques ...
随机推荐
- 2018-8-10-win10-UWP-button
title author date CreateTime categories win10 UWP button lindexi 2018-08-10 19:16:53 +0800 2018-2-13 ...
- [转] datetime.now、datetime.utcnow以及Django中的timezone.now之间的区别
https://blog.csdn.net/sinat_41898105/article/details/80984298 在我们使用Django做项目时经常会遇到时间的存储与读取不一致的问题 ...
- Java中实现线程通信的三个方法的作用是什么?
Java提供了3个方法解决线程之间的通信问题,均是java.lang.Object类的方法,都只能在同步方法或者同步代码块中使用,否则会抛出异常. 方法名 作 用 final void wait() ...
- idea激活教程,最新!!!
1.下载破解补丁(关键). 破解补丁:JetbrainsIdesCrack-4.2-release.jar百度云地址:https://pan.baidu.com/s/18ovphd7sm7oYXQb4 ...
- 删除Excel空列
/// <summary> /// 删除Excel空列 /// </summary> /// <param name="excelPath">E ...
- phpass类加密算法
客户说用md5加密容易被破解,要求使用bcrypt加密,经搜索发现password_hash函数可以轻松对密码实现加盐加密,比md5更安全,缺点是运行慢. phpass是一个开源类库,它可以让我们更方 ...
- Kotlin学习笔记
Kotlin的注释 Kotlin 的代码注释和Java一模一样 Kotlin的运行方式也是先kotlinc生成字节码,再kotlin字节码 如果一行里面只有一条语句,那么可以不写分号.但如果打算在同一 ...
- Linux常用命令入门
在Linux早期的版本中,由于不支持图形化操作,用户基本上都是使用命令行方式来对系统进行操作.掌握常用 的一些Linux命令是非常有必要的,下面将分类进行介绍.由于篇幅有限,在这里我们介绍命令时有些不 ...
- 性能超过DRUID的最强数据库连接池——HikariCP相关配置及简单示例
在配置application.yml时,对hikari的配置会有这样一个字段validationQuery. validationQuery是用来验证数据库连接的查询语句,这个查询语句必须是至少返回一 ...
- C#txt文本分割器
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...