集合分类:
-------------------| 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的更多相关文章

  1. [MyBatis]DAO层只写接口,不用写实现类

    团队开发一个项目,由老大架了一个框架,遇到了DAO层不用写接口了,我也是用了2次才记住这个事的,因为自己一直都是习惯于写DAO层的实现类,所以,习惯性的还是写了个实现类.于是遇到错误了. 找不到那个方 ...

  2. .NET开发设计模式-获取某个接口下面所有的派生类

    using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using Sy ...

  3. Mybatis Mapper接口是如何找到实现类的-源码分析

    KeyWords: Mybatis 原理,源码,Mybatis Mapper 接口实现类,代理模式,动态代理,Java动态代理,Proxy.newProxyInstance,Mapper 映射,Map ...

  4. Java8自定义函数式编程接口和便捷的引用类的构造器及方法

    什么是函数编程接口? 约束:抽象方法有且只有一个,即不能有多个抽象方法,在接口中覆写Object类中的public方法(如equal),不算是函数式接口的方法. 被@FunctionalInterfa ...

  5. 4.3.6 对象的界定通过编写接口来访问带这类命名结构的表会出问题。如前所述,SQL Server的灵活性不应用作编写错误代码或创建问题对象的借口。 注意在使用Management Studio的脚本工具时,SQL Server会界定所有的对象。这不是因为这么做是必须的,也不是编写代码的最佳方式,而是因为在界定符中封装所有的对象,比编写脚本引擎来查找需要界定的对象更容易。

    如前所述,在创建对象时,最好避免使用内嵌的空格或保留字作为对象名,但设计人员可能并没有遵守这个最佳实践原则.例如,我当前使用的数据库中有一个审核表名为Transaction,但是Transaction ...

  6. DI容器Ninject在管理接口和实现、基类和派生类并实现依赖注入方面的实例

    当一个类依赖于另一个具体类的时候,这样很容易形成两者间的"强耦合"关系.我们通常根据具体类抽象出一个接口,然后让类来依赖这个接口,这样就形成了"松耦合"关系,有 ...

  7. 高阶函数与接口混入和java匿名类

    高阶函数与接口混入和java匿名类. 高阶函数中的组件(参量)函数相当于面向对象中的混入(接口)类. public abstract class Bird { private String name; ...

  8. Java 基础 - Set接口 及其实现类HashSet/LinkedHashSet/TreeSet

    笔记: /**Set接口 及其实现类 * 公用操作同Collection: * * ①size(),clear()②isEmpty(),③contains(),④add()方法 和remove()方法 ...

  9. 基于小程序请求接口 wx.request 封装的类 axios 请求

    基于小程序请求接口 wx.request 封装的类 axios 请求 Introduction wx.request 的配置.axios 的调用方式 源码戳我 feature 支持 wx.reques ...

随机推荐

  1. 用户界面样式(cursor,resize,vertical-align,outline,文字超出显示省略号)

    1. 鼠标样式 cursor default: 小白(箭头)默认 pointer:小手 move:移动 text:文本 not-allowed:禁止 2. 轮廓线(表单外发光)outline 给表单添 ...

  2. 实现一个EventEmitter类,这个类包含以下方法: on/ once/fire/off

    实现一个EventEmitter类,这个类包含以下方法: on(监听事件,该事件可以被触发多次)- once(也是监听事件,但只能被触发一次)- fire(触发指定的事件)- off(移除指定事件的某 ...

  3. js 禁止右击保存图片,禁止拖拽图片

    禁止鼠标右键保存图片 <img src="" oncontextmenu="return false;"> 禁止鼠标拖动图片 <img src ...

  4. HTTP、HTTPS等常用服务的默认端口号

    口号标识了一个主机上进行通信的不同的应用程序. 1.HTTP协议代理服务器常用端口号:80/8080/3128/8081/9098 2.SOCKS代理协议服务器常用端口号:1080 3.FTP(文件传 ...

  5. Dubbox服务的消费方开发

    开发步骤: (1)创建Maven工程(WAR)dubboxdemo-web ,在pom.xml引入依赖 ,同“dubboxdemo-service”工程.区别就是把tomcat插件的运行端口改为808 ...

  6. Postman Interceptor安装成功却无法在Postman启用的解决办法

    新手在使用 Postman 和Postman Interceptor的过程中总会遇到各种各样的问题.我们 chrome插件网 争取在这里汇总大家遇到的所有的问题的解决方案.今天要分享的解决方案问题是: ...

  7. Spring Cloud Alibaba 从孵化到 "挂牌" 之旅

    背景 2014 年,Spring Boot 1.0 发布.Spring Boot 的发布绝对是 Pivotal 历史上具有里程碑意义的事件,它让我们能够非常简便地开发 Spring 应用,屏蔽了各种配 ...

  8. qt中使用sqlite存储数据

    一.sqilte的安装 在Windows上安装SQLite: 请访问 SQLite 下载页面,从 Windows 区下载预编译的二进制文件. 您需要下载 sqlite-tools-win32-*.zi ...

  9. 高级运维(三):部署Lnmp环境、构建Lnmp平台、地址重写

    一.部署LNMP环境 目标: 安装部署Nginx.MariaDB.PHP环境 1> 安装部署Nginx.MariaDB.PHP.PHP-FPM: 2> 启动Nginx.MariaDB.FP ...

  10. 向量vector 容器浅析

    一.什么是vector? 向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container).跟任意其它类型容器一样,它能够存放各种类型的对象.可以简单的认为,向量是一个能 ...